@webex/calling 3.10.0 → 3.11.0

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 (221) hide show
  1. package/dist/module/CallHistory/CallHistory.js +20 -11
  2. package/dist/module/CallSettings/UcmBackendConnector.js +21 -8
  3. package/dist/module/CallSettings/WxCallBackendConnector.js +10 -15
  4. package/dist/module/CallingClient/CallingClient.js +83 -123
  5. package/dist/module/CallingClient/calling/call.js +73 -58
  6. package/dist/module/CallingClient/calling/callManager.js +7 -0
  7. package/dist/module/CallingClient/constants.js +3 -0
  8. package/dist/module/CallingClient/registration/register.js +85 -5
  9. package/dist/module/CallingClient/registration/webWorker.js +2 -2
  10. package/dist/module/CallingClient/registration/webWorkerStr.js +2 -2
  11. package/dist/module/Contacts/ContactsClient.js +19 -25
  12. package/dist/module/Events/impl/index.js +1 -1
  13. package/dist/module/Logger/index.js +2 -2
  14. package/dist/module/Voicemail/BroadworksBackendConnector.js +10 -18
  15. package/dist/module/Voicemail/UcmBackendConnector.js +7 -11
  16. package/dist/module/Voicemail/Voicemail.js +42 -68
  17. package/dist/module/Voicemail/WxCallBackendConnector.js +14 -28
  18. package/dist/module/common/Utils.js +31 -5
  19. package/dist/module/common/constants.js +2 -0
  20. package/dist/module/common/testUtil.js +1 -0
  21. package/dist/types/CallHistory/CallHistory.d.ts.map +1 -1
  22. package/dist/types/CallSettings/UcmBackendConnector.d.ts +1 -0
  23. package/dist/types/CallSettings/UcmBackendConnector.d.ts.map +1 -1
  24. package/dist/types/CallSettings/WxCallBackendConnector.d.ts.map +1 -1
  25. package/dist/types/CallingClient/CallingClient.d.ts.map +1 -1
  26. package/dist/types/CallingClient/calling/call.d.ts +4 -0
  27. package/dist/types/CallingClient/calling/call.d.ts.map +1 -1
  28. package/dist/types/CallingClient/calling/callManager.d.ts.map +1 -1
  29. package/dist/types/CallingClient/constants.d.ts +3 -0
  30. package/dist/types/CallingClient/constants.d.ts.map +1 -1
  31. package/dist/types/CallingClient/registration/register.d.ts +4 -0
  32. package/dist/types/CallingClient/registration/register.d.ts.map +1 -1
  33. package/dist/types/CallingClient/registration/types.d.ts +6 -0
  34. package/dist/types/CallingClient/registration/types.d.ts.map +1 -1
  35. package/dist/types/CallingClient/registration/webWorkerStr.d.ts +1 -1
  36. package/dist/types/CallingClient/registration/webWorkerStr.d.ts.map +1 -1
  37. package/dist/types/Contacts/ContactsClient.d.ts +1 -0
  38. package/dist/types/Contacts/ContactsClient.d.ts.map +1 -1
  39. package/dist/types/Logger/index.d.ts +1 -2
  40. package/dist/types/Logger/index.d.ts.map +1 -1
  41. package/dist/types/SDKConnector/types.d.ts +16 -0
  42. package/dist/types/SDKConnector/types.d.ts.map +1 -1
  43. package/dist/types/Voicemail/BroadworksBackendConnector.d.ts.map +1 -1
  44. package/dist/types/Voicemail/UcmBackendConnector.d.ts.map +1 -1
  45. package/dist/types/Voicemail/Voicemail.d.ts.map +1 -1
  46. package/dist/types/Voicemail/WxCallBackendConnector.d.ts.map +1 -1
  47. package/dist/types/common/Utils.d.ts +1 -1
  48. package/dist/types/common/Utils.d.ts.map +1 -1
  49. package/dist/types/common/constants.d.ts +2 -0
  50. package/dist/types/common/constants.d.ts.map +1 -1
  51. package/dist/types/common/testUtil.d.ts +1 -0
  52. package/dist/types/common/testUtil.d.ts.map +1 -1
  53. package/package.json +4 -4
  54. package/dist/CallHistory/CallHistory.js +0 -584
  55. package/dist/CallHistory/CallHistory.js.map +0 -1
  56. package/dist/CallHistory/CallHistory.test.js +0 -813
  57. package/dist/CallHistory/CallHistory.test.js.map +0 -1
  58. package/dist/CallHistory/callHistoryFixtures.js +0 -650
  59. package/dist/CallHistory/callHistoryFixtures.js.map +0 -1
  60. package/dist/CallHistory/constants.js +0 -38
  61. package/dist/CallHistory/constants.js.map +0 -1
  62. package/dist/CallHistory/types.js +0 -7
  63. package/dist/CallHistory/types.js.map +0 -1
  64. package/dist/CallSettings/CallSettings.js +0 -312
  65. package/dist/CallSettings/CallSettings.js.map +0 -1
  66. package/dist/CallSettings/CallSettings.test.js +0 -122
  67. package/dist/CallSettings/CallSettings.test.js.map +0 -1
  68. package/dist/CallSettings/UcmBackendConnector.js +0 -261
  69. package/dist/CallSettings/UcmBackendConnector.js.map +0 -1
  70. package/dist/CallSettings/UcmBackendConnector.test.js +0 -321
  71. package/dist/CallSettings/UcmBackendConnector.test.js.map +0 -1
  72. package/dist/CallSettings/WxCallBackendConnector.js +0 -604
  73. package/dist/CallSettings/WxCallBackendConnector.js.map +0 -1
  74. package/dist/CallSettings/WxCallBackendConnector.test.js +0 -905
  75. package/dist/CallSettings/WxCallBackendConnector.test.js.map +0 -1
  76. package/dist/CallSettings/constants.js +0 -31
  77. package/dist/CallSettings/constants.js.map +0 -1
  78. package/dist/CallSettings/testFixtures.js +0 -68
  79. package/dist/CallSettings/testFixtures.js.map +0 -1
  80. package/dist/CallSettings/types.js +0 -7
  81. package/dist/CallSettings/types.js.map +0 -1
  82. package/dist/CallingClient/CallingClient.js +0 -1071
  83. package/dist/CallingClient/CallingClient.js.map +0 -1
  84. package/dist/CallingClient/CallingClient.test.js +0 -1289
  85. package/dist/CallingClient/CallingClient.test.js.map +0 -1
  86. package/dist/CallingClient/callRecordFixtures.js +0 -101
  87. package/dist/CallingClient/callRecordFixtures.js.map +0 -1
  88. package/dist/CallingClient/calling/CallerId/index.js +0 -276
  89. package/dist/CallingClient/calling/CallerId/index.js.map +0 -1
  90. package/dist/CallingClient/calling/CallerId/index.test.js +0 -275
  91. package/dist/CallingClient/calling/CallerId/index.test.js.map +0 -1
  92. package/dist/CallingClient/calling/CallerId/types.js +0 -7
  93. package/dist/CallingClient/calling/CallerId/types.js.map +0 -1
  94. package/dist/CallingClient/calling/call.js +0 -3444
  95. package/dist/CallingClient/calling/call.js.map +0 -1
  96. package/dist/CallingClient/calling/call.test.js +0 -3260
  97. package/dist/CallingClient/calling/call.test.js.map +0 -1
  98. package/dist/CallingClient/calling/callManager.js +0 -456
  99. package/dist/CallingClient/calling/callManager.js.map +0 -1
  100. package/dist/CallingClient/calling/callManager.test.js +0 -741
  101. package/dist/CallingClient/calling/callManager.test.js.map +0 -1
  102. package/dist/CallingClient/calling/index.js +0 -30
  103. package/dist/CallingClient/calling/index.js.map +0 -1
  104. package/dist/CallingClient/calling/types.js +0 -74
  105. package/dist/CallingClient/calling/types.js.map +0 -1
  106. package/dist/CallingClient/callingClientFixtures.js +0 -143
  107. package/dist/CallingClient/callingClientFixtures.js.map +0 -1
  108. package/dist/CallingClient/constants.js +0 -237
  109. package/dist/CallingClient/constants.js.map +0 -1
  110. package/dist/CallingClient/line/index.js +0 -349
  111. package/dist/CallingClient/line/index.js.map +0 -1
  112. package/dist/CallingClient/line/line.test.js +0 -327
  113. package/dist/CallingClient/line/line.test.js.map +0 -1
  114. package/dist/CallingClient/line/types.js +0 -21
  115. package/dist/CallingClient/line/types.js.map +0 -1
  116. package/dist/CallingClient/registration/index.js +0 -19
  117. package/dist/CallingClient/registration/index.js.map +0 -1
  118. package/dist/CallingClient/registration/register.js +0 -1538
  119. package/dist/CallingClient/registration/register.js.map +0 -1
  120. package/dist/CallingClient/registration/register.test.js +0 -1537
  121. package/dist/CallingClient/registration/register.test.js.map +0 -1
  122. package/dist/CallingClient/registration/registerFixtures.js +0 -36
  123. package/dist/CallingClient/registration/registerFixtures.js.map +0 -1
  124. package/dist/CallingClient/registration/types.js +0 -7
  125. package/dist/CallingClient/registration/types.js.map +0 -1
  126. package/dist/CallingClient/registration/webWorker.js +0 -130
  127. package/dist/CallingClient/registration/webWorker.js.map +0 -1
  128. package/dist/CallingClient/registration/webWorker.test.js +0 -303
  129. package/dist/CallingClient/registration/webWorker.test.js.map +0 -1
  130. package/dist/CallingClient/registration/webWorkerStr.js +0 -15
  131. package/dist/CallingClient/registration/webWorkerStr.js.map +0 -1
  132. package/dist/CallingClient/types.js +0 -7
  133. package/dist/CallingClient/types.js.map +0 -1
  134. package/dist/CallingClient/windowsChromiumIceWarmupUtils.js +0 -142
  135. package/dist/CallingClient/windowsChromiumIceWarmupUtils.js.map +0 -1
  136. package/dist/Contacts/ContactsClient.js +0 -1215
  137. package/dist/Contacts/ContactsClient.js.map +0 -1
  138. package/dist/Contacts/ContactsClient.test.js +0 -1003
  139. package/dist/Contacts/ContactsClient.test.js.map +0 -1
  140. package/dist/Contacts/constants.js +0 -40
  141. package/dist/Contacts/constants.js.map +0 -1
  142. package/dist/Contacts/contactFixtures.js +0 -430
  143. package/dist/Contacts/contactFixtures.js.map +0 -1
  144. package/dist/Contacts/types.js +0 -43
  145. package/dist/Contacts/types.js.map +0 -1
  146. package/dist/Errors/catalog/CallError.js +0 -92
  147. package/dist/Errors/catalog/CallError.js.map +0 -1
  148. package/dist/Errors/catalog/CallingDeviceError.js +0 -86
  149. package/dist/Errors/catalog/CallingDeviceError.js.map +0 -1
  150. package/dist/Errors/catalog/ExtendedError.js +0 -44
  151. package/dist/Errors/catalog/ExtendedError.js.map +0 -1
  152. package/dist/Errors/catalog/LineError.js +0 -88
  153. package/dist/Errors/catalog/LineError.js.map +0 -1
  154. package/dist/Errors/index.js +0 -28
  155. package/dist/Errors/index.js.map +0 -1
  156. package/dist/Errors/types.js +0 -59
  157. package/dist/Errors/types.js.map +0 -1
  158. package/dist/Events/impl/index.js +0 -81
  159. package/dist/Events/impl/index.js.map +0 -1
  160. package/dist/Events/types.js +0 -107
  161. package/dist/Events/types.js.map +0 -1
  162. package/dist/Logger/index.js +0 -228
  163. package/dist/Logger/index.js.map +0 -1
  164. package/dist/Logger/index.test.js +0 -87
  165. package/dist/Logger/index.test.js.map +0 -1
  166. package/dist/Logger/types.js +0 -34
  167. package/dist/Logger/types.js.map +0 -1
  168. package/dist/Metrics/index.js +0 -535
  169. package/dist/Metrics/index.js.map +0 -1
  170. package/dist/Metrics/index.test.js +0 -463
  171. package/dist/Metrics/index.test.js.map +0 -1
  172. package/dist/Metrics/types.js +0 -64
  173. package/dist/Metrics/types.js.map +0 -1
  174. package/dist/SDKConnector/index.js +0 -103
  175. package/dist/SDKConnector/index.js.map +0 -1
  176. package/dist/SDKConnector/index.test.js +0 -9
  177. package/dist/SDKConnector/index.test.js.map +0 -1
  178. package/dist/SDKConnector/types.js +0 -7
  179. package/dist/SDKConnector/types.js.map +0 -1
  180. package/dist/SDKConnector/utils.js +0 -39
  181. package/dist/SDKConnector/utils.js.map +0 -1
  182. package/dist/SDKConnector/utils.test.js +0 -9
  183. package/dist/SDKConnector/utils.test.js.map +0 -1
  184. package/dist/Voicemail/BroadworksBackendConnector.js +0 -707
  185. package/dist/Voicemail/BroadworksBackendConnector.js.map +0 -1
  186. package/dist/Voicemail/BroadworksBackendConnector.test.js +0 -812
  187. package/dist/Voicemail/BroadworksBackendConnector.test.js.map +0 -1
  188. package/dist/Voicemail/UcmBackendConnector.js +0 -632
  189. package/dist/Voicemail/UcmBackendConnector.js.map +0 -1
  190. package/dist/Voicemail/UcmBackendConnector.test.js +0 -738
  191. package/dist/Voicemail/UcmBackendConnector.test.js.map +0 -1
  192. package/dist/Voicemail/Voicemail.js +0 -500
  193. package/dist/Voicemail/Voicemail.js.map +0 -1
  194. package/dist/Voicemail/Voicemail.test.js +0 -391
  195. package/dist/Voicemail/Voicemail.test.js.map +0 -1
  196. package/dist/Voicemail/WxCallBackendConnector.js +0 -671
  197. package/dist/Voicemail/WxCallBackendConnector.js.map +0 -1
  198. package/dist/Voicemail/WxCallBackendConnector.test.js +0 -1199
  199. package/dist/Voicemail/WxCallBackendConnector.test.js.map +0 -1
  200. package/dist/Voicemail/constants.js +0 -61
  201. package/dist/Voicemail/constants.js.map +0 -1
  202. package/dist/Voicemail/types.js +0 -7
  203. package/dist/Voicemail/types.js.map +0 -1
  204. package/dist/Voicemail/voicemailFixture.js +0 -524
  205. package/dist/Voicemail/voicemailFixture.js.map +0 -1
  206. package/dist/api.js +0 -157
  207. package/dist/api.js.map +0 -1
  208. package/dist/common/Utils.js +0 -1451
  209. package/dist/common/Utils.js.map +0 -1
  210. package/dist/common/Utils.test.js +0 -1744
  211. package/dist/common/Utils.test.js.map +0 -1
  212. package/dist/common/constants.js +0 -60
  213. package/dist/common/constants.js.map +0 -1
  214. package/dist/common/index.js +0 -19
  215. package/dist/common/index.js.map +0 -1
  216. package/dist/common/testUtil.js +0 -982
  217. package/dist/common/testUtil.js.map +0 -1
  218. package/dist/common/types.js +0 -75
  219. package/dist/common/types.js.map +0 -1
  220. package/dist/index.js +0 -321
  221. package/dist/index.js.map +0 -1
@@ -1,303 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
4
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
5
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
6
- var _uuid = require("uuid");
7
- var _webWorker = _interopRequireDefault(require("./webWorker"));
8
- var _types = require("../../common/types");
9
- global.self = global;
10
- jest.mock('uuid');
11
- describe('webWorker', function () {
12
- var postMessageSpy;
13
- var capturedIntervalCallback;
14
- var capturedIntervalTimer;
15
- var clearIntervalSpy;
16
- beforeEach(function () {
17
- jest.useFakeTimers();
18
- global.fetch = jest.fn();
19
- _uuid.v4.mockReturnValue('mock-uuid');
20
- postMessageSpy = jest.spyOn(global, 'postMessage').mockImplementation(function () {});
21
- clearIntervalSpy = jest.spyOn(global, 'clearInterval');
22
-
23
- // Overriding setInterval so that we capture the callback rather than schedule a timer
24
- jest.spyOn(global, 'setInterval').mockImplementation(
25
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
26
- function (callback, interval) {
27
- capturedIntervalCallback = callback;
28
- // Create a dummy timer object (could be any non-null value)
29
- capturedIntervalTimer = {
30
- dummy: true
31
- };
32
- return capturedIntervalTimer;
33
- });
34
- });
35
- afterEach(function () {
36
- jest.clearAllMocks();
37
- jest.clearAllTimers();
38
- jest.useRealTimers();
39
- });
40
- it('should start keepalive lifecycle correctly', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee() {
41
- var fakeSuccessResponse, failureHeaders, fakeFailureResponse;
42
- return _regenerator.default.wrap(function _callee$(_context) {
43
- while (1) switch (_context.prev = _context.next) {
44
- case 0:
45
- fakeSuccessResponse = {
46
- ok: true,
47
- status: 200
48
- };
49
- global.fetch.mockResolvedValue(fakeSuccessResponse);
50
- (0, _webWorker.default)({
51
- data: {
52
- type: _types.WorkerMessageType.START_KEEPALIVE,
53
- accessToken: 'dummy',
54
- deviceUrl: 'dummyDevice',
55
- interval: 1,
56
- retryCountThreshold: 3,
57
- url: 'http://example.com'
58
- }
59
- });
60
-
61
- // Manually invoke the captured interval callback to simulate one tick
62
- _context.next = 5;
63
- return capturedIntervalCallback();
64
- case 5:
65
- expect(global.fetch.mock.calls.length).toBe(1);
66
- expect(global.fetch).toHaveBeenCalledWith('http://example.com/status', {
67
- method: 'POST',
68
- headers: {
69
- 'cisco-device-url': 'dummyDevice',
70
- 'spark-user-agent': 'webex-calling/beta',
71
- Authorization: 'dummy',
72
- trackingId: 'web_worker_mock-uuid'
73
- }
74
- });
75
- expect(postMessageSpy).not.toHaveBeenCalled();
76
- failureHeaders = {
77
- has: function has(key) {
78
- return key === 'Retry-After' || key === 'Trackingid';
79
- },
80
- get: function get(key) {
81
- return (
82
- // eslint-disable-next-line no-nested-ternary
83
- key === 'Retry-After' ? '10' : key === 'Trackingid' ? 'web_worker_mock-uuid' : null
84
- );
85
- }
86
- };
87
- fakeFailureResponse = {
88
- ok: false,
89
- status: 429,
90
- statusText: 'Too Many Requests',
91
- headers: failureHeaders
92
- };
93
- global.fetch.mockResolvedValue(fakeFailureResponse);
94
- (0, _webWorker.default)({
95
- data: {
96
- type: _types.WorkerMessageType.START_KEEPALIVE,
97
- accessToken: 'dummy',
98
- deviceUrl: 'dummyDevice',
99
- interval: 1,
100
- retryCountThreshold: 3,
101
- url: 'http://example.com'
102
- }
103
- });
104
-
105
- // Manually invoke the captured interval callback to simulate one tick
106
- _context.next = 14;
107
- return capturedIntervalCallback();
108
- case 14:
109
- expect(global.fetch.mock.calls.length).toBe(2);
110
- expect(postMessageSpy).toHaveBeenCalledWith({
111
- type: _types.WorkerMessageType.KEEPALIVE_FAILURE,
112
- err: {
113
- headers: {
114
- 'retry-after': '10',
115
- trackingid: 'web_worker_mock-uuid'
116
- },
117
- statusCode: 429,
118
- statusText: 'Too Many Requests',
119
- type: undefined
120
- },
121
- keepAliveRetryCount: 1
122
- });
123
- case 16:
124
- case "end":
125
- return _context.stop();
126
- }
127
- }, _callee);
128
- })));
129
- it('should post KEEPALIVE_FAILURE when fetch fails', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
130
- var failureHeaders2;
131
- return _regenerator.default.wrap(function _callee2$(_context2) {
132
- while (1) switch (_context2.prev = _context2.next) {
133
- case 0:
134
- failureHeaders2 = {
135
- has: function has(key) {
136
- return key === 'Trackingid';
137
- },
138
- get: function get(key) {
139
- return key === 'Trackingid' ? 'web_worker_mock-uuid' : null;
140
- }
141
- };
142
- global.fetch.mockResolvedValueOnce({
143
- ok: false,
144
- status: 401,
145
- statusText: 'Unauthorized',
146
- headers: failureHeaders2
147
- });
148
- (0, _webWorker.default)({
149
- data: {
150
- type: _types.WorkerMessageType.START_KEEPALIVE,
151
- accessToken: 'dummy',
152
- deviceUrl: 'dummyDevice',
153
- interval: 1,
154
- retryCountThreshold: 1,
155
- url: 'http://example.com'
156
- }
157
- });
158
- _context2.next = 5;
159
- return capturedIntervalCallback();
160
- case 5:
161
- expect(postMessageSpy).toHaveBeenCalledWith({
162
- type: _types.WorkerMessageType.KEEPALIVE_FAILURE,
163
- err: {
164
- headers: {
165
- trackingid: 'web_worker_mock-uuid'
166
- },
167
- statusCode: 401,
168
- statusText: 'Unauthorized',
169
- type: undefined
170
- },
171
- keepAliveRetryCount: 1
172
- });
173
- case 6:
174
- case "end":
175
- return _context2.stop();
176
- }
177
- }, _callee2);
178
- })));
179
- it('should post KEEPALIVE_SUCCESS after a failure when fetch succeeds', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3() {
180
- var failureHeaders3, mockError;
181
- return _regenerator.default.wrap(function _callee3$(_context3) {
182
- while (1) switch (_context3.prev = _context3.next) {
183
- case 0:
184
- // Set fetch so that first tick rejects (failure) and second tick resolves (success)
185
- failureHeaders3 = {
186
- has: function has(key) {
187
- return key === 'Trackingid';
188
- },
189
- get: function get(key) {
190
- return key === 'Trackingid' ? 'web_worker_mock-uuid' : null;
191
- }
192
- };
193
- mockError = {
194
- ok: false,
195
- status: 404,
196
- statusText: 'Not Found',
197
- headers: failureHeaders3
198
- };
199
- global.fetch.mockResolvedValueOnce(mockError).mockResolvedValueOnce({
200
- ok: true,
201
- status: 200
202
- });
203
- (0, _webWorker.default)({
204
- data: {
205
- type: _types.WorkerMessageType.START_KEEPALIVE,
206
- accessToken: 'dummy',
207
- deviceUrl: 'dummyDevice',
208
- interval: 1,
209
- retryCountThreshold: 3,
210
- url: 'http://example.com'
211
- }
212
- });
213
-
214
- // First tick: trigger failure
215
- _context3.next = 6;
216
- return capturedIntervalCallback();
217
- case 6:
218
- expect(postMessageSpy.mock.calls[0][0].type).toBe(_types.WorkerMessageType.KEEPALIVE_FAILURE);
219
-
220
- // Second tick: trigger success.
221
- _context3.next = 9;
222
- return capturedIntervalCallback();
223
- case 9:
224
- expect(postMessageSpy.mock.calls[1][0].type).toBe(_types.WorkerMessageType.KEEPALIVE_SUCCESS);
225
- expect(postMessageSpy.mock.calls[1][0].statusCode).toBe(200);
226
- case 11:
227
- case "end":
228
- return _context3.stop();
229
- }
230
- }, _callee3);
231
- })));
232
- it('should clear keepalive timer on receiving CLEAR_KEEPALIVE message', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4() {
233
- var fakeSuccessResponse, startEvent;
234
- return _regenerator.default.wrap(function _callee4$(_context4) {
235
- while (1) switch (_context4.prev = _context4.next) {
236
- case 0:
237
- fakeSuccessResponse = {
238
- ok: true,
239
- status: 200
240
- };
241
- global.fetch.mockResolvedValue(fakeSuccessResponse);
242
- startEvent = {
243
- data: {
244
- type: _types.WorkerMessageType.START_KEEPALIVE,
245
- accessToken: 'dummy',
246
- deviceUrl: 'dummyDevice',
247
- interval: 1,
248
- retryCountThreshold: 1,
249
- url: 'http://example.com'
250
- }
251
- };
252
- (0, _webWorker.default)(startEvent);
253
- (0, _webWorker.default)({
254
- data: {
255
- type: _types.WorkerMessageType.CLEAR_KEEPALIVE
256
- }
257
- });
258
- jest.advanceTimersByTime(3000);
259
- expect(global.fetch.mock.calls.length).toBeLessThanOrEqual(3);
260
- expect(clearIntervalSpy).toHaveBeenCalled();
261
- case 8:
262
- case "end":
263
- return _context4.stop();
264
- }
265
- }, _callee4);
266
- })));
267
- it('improve coverage: should not clear keepalive timer on receiving CLEAR_KEEPALIVE message without keepTimer', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee5() {
268
- var fakeSuccessResponse, startEvent;
269
- return _regenerator.default.wrap(function _callee5$(_context5) {
270
- while (1) switch (_context5.prev = _context5.next) {
271
- case 0:
272
- jest.spyOn(global, 'setInterval').mockReturnValue(undefined);
273
- fakeSuccessResponse = {
274
- ok: true,
275
- status: 200
276
- };
277
- global.fetch.mockResolvedValue(fakeSuccessResponse);
278
- startEvent = {
279
- data: {
280
- type: _types.WorkerMessageType.START_KEEPALIVE,
281
- accessToken: 'dummy',
282
- deviceUrl: 'dummyDevice',
283
- interval: 1,
284
- retryCountThreshold: 1,
285
- url: 'http://example.com'
286
- }
287
- };
288
- (0, _webWorker.default)(startEvent);
289
- (0, _webWorker.default)({
290
- data: {
291
- type: _types.WorkerMessageType.CLEAR_KEEPALIVE
292
- }
293
- });
294
- jest.advanceTimersByTime(3000);
295
- expect(clearIntervalSpy).not.toHaveBeenCalled();
296
- case 8:
297
- case "end":
298
- return _context5.stop();
299
- }
300
- }, _callee5);
301
- })));
302
- });
303
- //# sourceMappingURL=webWorker.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_uuid","require","_webWorker","_interopRequireDefault","_types","global","self","jest","mock","describe","postMessageSpy","capturedIntervalCallback","capturedIntervalTimer","clearIntervalSpy","beforeEach","useFakeTimers","fetch","fn","uuid","mockReturnValue","spyOn","mockImplementation","callback","interval","dummy","afterEach","clearAllMocks","clearAllTimers","useRealTimers","it","_asyncToGenerator2","default","_regenerator","mark","_callee","fakeSuccessResponse","failureHeaders","fakeFailureResponse","wrap","_callee$","_context","prev","next","ok","status","mockResolvedValue","messageHandler","data","type","WorkerMessageType","START_KEEPALIVE","accessToken","deviceUrl","retryCountThreshold","url","expect","calls","length","toBe","toHaveBeenCalledWith","method","headers","Authorization","trackingId","not","toHaveBeenCalled","has","key","get","statusText","KEEPALIVE_FAILURE","err","trackingid","statusCode","undefined","keepAliveRetryCount","stop","_callee2","failureHeaders2","_callee2$","_context2","mockResolvedValueOnce","_callee3","failureHeaders3","mockError","_callee3$","_context3","KEEPALIVE_SUCCESS","_callee4","startEvent","_callee4$","_context4","CLEAR_KEEPALIVE","advanceTimersByTime","toBeLessThanOrEqual","_callee5","_callee5$","_context5"],"sources":["webWorker.test.ts"],"sourcesContent":["import {v4 as uuid} from 'uuid';\nimport messageHandler from './webWorker';\nimport {WorkerMessageType} from '../../common/types';\n\n(global as any).self = global;\n\njest.mock('uuid');\n\ndescribe('webWorker', () => {\n let postMessageSpy: jest.SpyInstance;\n let capturedIntervalCallback: any;\n let capturedIntervalTimer: any;\n let clearIntervalSpy: jest.SpyInstance;\n\n beforeEach(() => {\n jest.useFakeTimers();\n global.fetch = jest.fn();\n (uuid as jest.Mock).mockReturnValue('mock-uuid');\n\n postMessageSpy = jest.spyOn(global, 'postMessage').mockImplementation(() => {});\n clearIntervalSpy = jest.spyOn(global, 'clearInterval');\n\n // Overriding setInterval so that we capture the callback rather than schedule a timer\n jest.spyOn(global, 'setInterval').mockImplementation(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n (callback: any, interval: number): NodeJS.Timeout => {\n capturedIntervalCallback = callback;\n // Create a dummy timer object (could be any non-null value)\n capturedIntervalTimer = {dummy: true};\n\n return capturedIntervalTimer as NodeJS.Timeout;\n }\n );\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n jest.clearAllTimers();\n jest.useRealTimers();\n });\n\n it('should start keepalive lifecycle correctly', async () => {\n const fakeSuccessResponse = {\n ok: true,\n status: 200,\n };\n (global.fetch as jest.Mock).mockResolvedValue(fakeSuccessResponse);\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 3,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n // Manually invoke the captured interval callback to simulate one tick\n await capturedIntervalCallback();\n\n expect((global.fetch as jest.Mock).mock.calls.length).toBe(1);\n expect(global.fetch).toHaveBeenCalledWith('http://example.com/status', {\n method: 'POST',\n headers: {\n 'cisco-device-url': 'dummyDevice',\n 'spark-user-agent': 'webex-calling/beta',\n Authorization: 'dummy',\n trackingId: 'web_worker_mock-uuid',\n },\n });\n expect(postMessageSpy).not.toHaveBeenCalled();\n\n const failureHeaders = {\n has: (key: string) => key === 'Retry-After' || key === 'Trackingid',\n get: (key: string) =>\n // eslint-disable-next-line no-nested-ternary\n key === 'Retry-After' ? '10' : key === 'Trackingid' ? 'web_worker_mock-uuid' : null,\n };\n const fakeFailureResponse = {\n ok: false,\n status: 429,\n statusText: 'Too Many Requests',\n headers: failureHeaders,\n };\n (global.fetch as jest.Mock).mockResolvedValue(fakeFailureResponse);\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 3,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n // Manually invoke the captured interval callback to simulate one tick\n await capturedIntervalCallback();\n\n expect((global.fetch as jest.Mock).mock.calls.length).toBe(2);\n expect(postMessageSpy).toHaveBeenCalledWith({\n type: WorkerMessageType.KEEPALIVE_FAILURE,\n err: {\n headers: {'retry-after': '10', trackingid: 'web_worker_mock-uuid'},\n statusCode: 429,\n statusText: 'Too Many Requests',\n type: undefined,\n },\n keepAliveRetryCount: 1,\n });\n });\n\n it('should post KEEPALIVE_FAILURE when fetch fails', async () => {\n const failureHeaders2 = {\n has: (key: string) => key === 'Trackingid',\n get: (key: string) => (key === 'Trackingid' ? 'web_worker_mock-uuid' : null),\n };\n (global.fetch as jest.Mock).mockResolvedValueOnce({\n ok: false,\n status: 401,\n statusText: 'Unauthorized',\n headers: failureHeaders2,\n });\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 1,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n await capturedIntervalCallback();\n\n expect(postMessageSpy).toHaveBeenCalledWith({\n type: WorkerMessageType.KEEPALIVE_FAILURE,\n err: {\n headers: {trackingid: 'web_worker_mock-uuid'},\n statusCode: 401,\n statusText: 'Unauthorized',\n type: undefined,\n },\n keepAliveRetryCount: 1,\n });\n });\n\n it('should post KEEPALIVE_SUCCESS after a failure when fetch succeeds', async () => {\n // Set fetch so that first tick rejects (failure) and second tick resolves (success)\n const failureHeaders3 = {\n has: (key: string) => key === 'Trackingid',\n get: (key: string) => (key === 'Trackingid' ? 'web_worker_mock-uuid' : null),\n };\n const mockError = {\n ok: false,\n status: 404,\n statusText: 'Not Found',\n headers: failureHeaders3,\n };\n\n (global.fetch as jest.Mock)\n .mockResolvedValueOnce(mockError)\n .mockResolvedValueOnce({ok: true, status: 200});\n\n messageHandler({\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 3,\n url: 'http://example.com',\n },\n } as MessageEvent);\n\n // First tick: trigger failure\n await capturedIntervalCallback();\n expect(postMessageSpy.mock.calls[0][0].type).toBe(WorkerMessageType.KEEPALIVE_FAILURE);\n\n // Second tick: trigger success.\n await capturedIntervalCallback();\n expect(postMessageSpy.mock.calls[1][0].type).toBe(WorkerMessageType.KEEPALIVE_SUCCESS);\n expect(postMessageSpy.mock.calls[1][0].statusCode).toBe(200);\n });\n\n it('should clear keepalive timer on receiving CLEAR_KEEPALIVE message', async () => {\n const fakeSuccessResponse = {ok: true, status: 200};\n (global.fetch as jest.Mock).mockResolvedValue(fakeSuccessResponse);\n\n const startEvent = {\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 1,\n url: 'http://example.com',\n },\n };\n\n messageHandler(startEvent as MessageEvent);\n messageHandler({data: {type: WorkerMessageType.CLEAR_KEEPALIVE}} as MessageEvent);\n\n jest.advanceTimersByTime(3000);\n expect((global.fetch as jest.Mock).mock.calls.length).toBeLessThanOrEqual(3);\n expect(clearIntervalSpy).toHaveBeenCalled();\n });\n\n it('improve coverage: should not clear keepalive timer on receiving CLEAR_KEEPALIVE message without keepTimer', async () => {\n jest.spyOn(global, 'setInterval').mockReturnValue(undefined);\n const fakeSuccessResponse = {ok: true, status: 200};\n (global.fetch as jest.Mock).mockResolvedValue(fakeSuccessResponse);\n\n const startEvent = {\n data: {\n type: WorkerMessageType.START_KEEPALIVE,\n accessToken: 'dummy',\n deviceUrl: 'dummyDevice',\n interval: 1,\n retryCountThreshold: 1,\n url: 'http://example.com',\n },\n };\n\n messageHandler(startEvent as MessageEvent);\n messageHandler({data: {type: WorkerMessageType.CLEAR_KEEPALIVE}} as MessageEvent);\n\n jest.advanceTimersByTime(3000);\n expect(clearIntervalSpy).not.toHaveBeenCalled();\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,15 +0,0 @@
1
- "use strict";
2
-
3
- var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
- _Object$defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = void 0;
8
- /**
9
- * This file contains the stringified version of the web worker code from webWorker.ts
10
- * It can be used to create a Blob URL for the worker instead of loading it from a separate file
11
- */
12
-
13
- var webWorkerStr = "/* eslint-env worker */\n\nconst uuid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\n// Enum values from the original imports\nconst HTTP_METHODS = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n DELETE: 'DELETE',\n PATCH: 'PATCH',\n};\n\nconst WorkerMessageType = {\n START_KEEPALIVE: 'START_KEEPALIVE',\n CLEAR_KEEPALIVE: 'CLEAR_KEEPALIVE',\n KEEPALIVE_SUCCESS: 'KEEPALIVE_SUCCESS',\n KEEPALIVE_FAILURE: 'KEEPALIVE_FAILURE',\n};\n\nlet keepaliveTimer;\n\nconst messageHandler = (event) => {\n const {type} = event.data;\n\n const postKeepAlive = async (accessToken, deviceUrl, url) => {\n const response = await fetch(`${url}/status`, {\n method: HTTP_METHODS.POST,\n headers: {\n 'cisco-device-url': deviceUrl,\n 'spark-user-agent': 'webex-calling/beta',\n Authorization: `${accessToken}`,\n trackingId: `web_worker_${uuid()}`,\n },\n });\n\n if (!response.ok) {\n throw response;\n }\n\n return response;\n };\n\n if (type === WorkerMessageType.START_KEEPALIVE) {\n let keepAliveRetryCount = 0;\n const {accessToken, deviceUrl, interval, retryCountThreshold, url} = event.data;\n\n if (keepaliveTimer) {\n clearInterval(keepaliveTimer);\n keepaliveTimer = undefined;\n }\n\n keepaliveTimer = setInterval(async () => {\n if (keepAliveRetryCount < retryCountThreshold) {\n try {\n const res = await postKeepAlive(accessToken, deviceUrl, url);\n const statusCode = res.status;\n if (keepAliveRetryCount > 0) {\n self.postMessage({\n type: WorkerMessageType.KEEPALIVE_SUCCESS,\n statusCode,\n });\n }\n keepAliveRetryCount = 0;\n } catch (err) {\n let headers = {};\n if(err.headers.has('Retry-After')) {\n headers['retry-after'] = err.headers.get('Retry-After');\n } \n\n if(err.headers.has('Trackingid')) {\n headers['trackingid'] = err.headers.get('Trackingid');\n } \n\n const error = {\n headers,\n statusCode: err.status,\n statusText: err.statusText,\n type: err.type,\n };\n\n keepAliveRetryCount += 1\n self.postMessage({\n type: WorkerMessageType.KEEPALIVE_FAILURE,\n err: error,\n keepAliveRetryCount,\n });\n }\n }\n }, interval * 1000);\n }\n\n if (type === WorkerMessageType.CLEAR_KEEPALIVE) {\n if (keepaliveTimer) {\n clearInterval(keepaliveTimer);\n keepaliveTimer = undefined;\n }\n }\n};\n\nself.addEventListener('message', messageHandler);\n";
14
- var _default = exports.default = webWorkerStr;
15
- //# sourceMappingURL=webWorkerStr.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["webWorkerStr","_default","exports","default"],"sources":["webWorkerStr.ts"],"sourcesContent":["/**\n * This file contains the stringified version of the web worker code from webWorker.ts\n * It can be used to create a Blob URL for the worker instead of loading it from a separate file\n */\n\nconst webWorkerStr = `/* eslint-env worker */\n\nconst uuid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\n// Enum values from the original imports\nconst HTTP_METHODS = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n DELETE: 'DELETE',\n PATCH: 'PATCH',\n};\n\nconst WorkerMessageType = {\n START_KEEPALIVE: 'START_KEEPALIVE',\n CLEAR_KEEPALIVE: 'CLEAR_KEEPALIVE',\n KEEPALIVE_SUCCESS: 'KEEPALIVE_SUCCESS',\n KEEPALIVE_FAILURE: 'KEEPALIVE_FAILURE',\n};\n\nlet keepaliveTimer;\n\nconst messageHandler = (event) => {\n const {type} = event.data;\n\n const postKeepAlive = async (accessToken, deviceUrl, url) => {\n const response = await fetch(\\`\\${url}/status\\`, {\n method: HTTP_METHODS.POST,\n headers: {\n 'cisco-device-url': deviceUrl,\n 'spark-user-agent': 'webex-calling/beta',\n Authorization: \\`\\${accessToken}\\`,\n trackingId: \\`web_worker_\\${uuid()}\\`,\n },\n });\n\n if (!response.ok) {\n throw response;\n }\n\n return response;\n };\n\n if (type === WorkerMessageType.START_KEEPALIVE) {\n let keepAliveRetryCount = 0;\n const {accessToken, deviceUrl, interval, retryCountThreshold, url} = event.data;\n\n if (keepaliveTimer) {\n clearInterval(keepaliveTimer);\n keepaliveTimer = undefined;\n }\n\n keepaliveTimer = setInterval(async () => {\n if (keepAliveRetryCount < retryCountThreshold) {\n try {\n const res = await postKeepAlive(accessToken, deviceUrl, url);\n const statusCode = res.status;\n if (keepAliveRetryCount > 0) {\n self.postMessage({\n type: WorkerMessageType.KEEPALIVE_SUCCESS,\n statusCode,\n });\n }\n keepAliveRetryCount = 0;\n } catch (err) {\n let headers = {};\n if(err.headers.has('Retry-After')) {\n headers['retry-after'] = err.headers.get('Retry-After');\n } \n\n if(err.headers.has('Trackingid')) {\n headers['trackingid'] = err.headers.get('Trackingid');\n } \n\n const error = {\n headers,\n statusCode: err.status,\n statusText: err.statusText,\n type: err.type,\n };\n\n keepAliveRetryCount += 1\n self.postMessage({\n type: WorkerMessageType.KEEPALIVE_FAILURE,\n err: error,\n keepAliveRetryCount,\n });\n }\n }\n }, interval * 1000);\n }\n\n if (type === WorkerMessageType.CLEAR_KEEPALIVE) {\n if (keepaliveTimer) {\n clearInterval(keepaliveTimer);\n keepaliveTimer = undefined;\n }\n }\n};\n\nself.addEventListener('message', messageHandler);\n`;\n\nexport default webWorkerStr;\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;;AAEA,IAAMA,YAAY,yzFA2GjB;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEaH,YAAY","ignoreList":[]}
@@ -1,7 +0,0 @@
1
- "use strict";
2
-
3
- var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
- _Object$defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import * as Media from '@webex/internal-media-core';\nimport {LOGGER} from '../Logger/types';\nimport {ISDKConnector} from '../SDKConnector/types';\nimport {Eventing} from '../Events/impl';\nimport {CallingClientEventTypes} from '../Events/types';\nimport {ServiceData} from '../common/types';\nimport {ICall} from './calling/types';\nimport {CallingClientError} from '../Errors';\nimport {ILine} from './line/types';\n\nexport interface LoggerConfig {\n level: LOGGER;\n}\n\ninterface DiscoveryConfig {\n country: string;\n region: string;\n}\n\nexport interface CallingClientConfig {\n logger?: LoggerConfig;\n discovery?: DiscoveryConfig;\n serviceData?: ServiceData;\n jwe?: string;\n}\n\nexport type CallingClientErrorEmitterCallback = (\n err: CallingClientError,\n finalError?: boolean\n) => void;\n\n/**\n * An interface for the `CallingClient` module.\n * The `CallingClient` module is designed to provide a set of APIs related to line registration and calling functionalities within the SDK.\n *\n * @example\n * ```javascript\n * const callingClient = createClient(webex, callingConfig);\n * ```\n */\nexport interface ICallingClient extends Eventing<CallingClientEventTypes> {\n /**\n * Represents the `mediaEngine for managing media-related operations within the CallingClient.\n * The media engine provides access to audio and video devices such as cameras, microphones, and speakers within the media layer.\n *\n * @public\n * @example\n * ```\n * const microphones = await callingClient.mediaEngine.Media.getMicrophones();\n * const speakers = await callingClient.mediaEngine.Media.getSpeakers();\n * const cameras = await callingClient.mediaEngine.Media.getCameras();\n * ```\n */\n mediaEngine: typeof Media;\n\n /**\n * @ignore\n */\n getSDKConnector(): ISDKConnector;\n\n /**\n * @ignore\n */\n getLoggingLevel(): LOGGER;\n\n /**\n * Retrieves details of the line object(s) belonging to a user.\n *\n * This method gathers all the {@link ILine} objects and organizes them into a dictionary\n * where keys represent `lineId`s and values are arrays of {@link ILine} objects registered with\n * the `callingClient`\n *\n * @example\n * ```typescript\n * const lines = callingClient.getLines();\n * ```\n * The `lines` response object will have `lineId` as its key and\n * a list {@link ILine} objects as it's value.\n * ```\n * {\n * 'lineId1': lineObj1,\n * 'lineId2': lineObj2,\n * }\n * ```\n */\n getLines(): Record<string, ILine>;\n\n /**\n * Retrieves a dictionary of active calls grouped by `lineId`.\n *\n * This method gathers active {@link ICall} objects and organizes them into a dictionary\n * where keys represent `lineId`s and values are arrays of {@link ICall} objects of active calls associated\n * with each line.\n *\n * @example\n * ```typescript\n * const activeCalls = callingClient.getActiveCalls();\n * ```\n * The `activeCalls` response object will have `lineId` as its key and\n * a list {@link ICall} objects as it's value.\n *\n * ```\n * {\n * 'line1': [call1, call2],\n * 'line2': [call3],\n * }\n * ```\n */\n getActiveCalls(): Record<string, ICall[]>;\n\n /**\n * Retrieves the {@link ICall} object for the currently connected call in the client.\n *\n * This method iterates through active call objects and returns the call\n * that is currently connected (not on hold).\n *\n * @example\n * ```typescript\n * const connectedCall : ICall = callingClient.getConnectedCall();\n * ```\n * The `connectedCall` object will be the Call object of the connected call with the client\n */\n getConnectedCall(): ICall | undefined;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,142 +0,0 @@
1
- "use strict";
2
-
3
- var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
- var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
- _Object$defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = windowsChromiumIceWarmup;
9
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
10
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
11
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
12
- var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
13
- // This file contains a workaround for a known issue in Windows Chromium-based browsers
14
- // See: https://issues.chromium.org/issues/332933530
15
- // There is a rare condition where WebRTC doesn't work on the first try due to ICE gathering issues.
16
- // This function attempts to "warm up" the ICE gathering process by creating a pair of peer connections
17
- // and forcing ICE candidate gathering and exchange before the actual call setup.
18
- // We need to try establishing the connection through the srflx candidates since the host candidate won't work
19
- // This is intended to be called once at the start of the calling SDK to reduce the likelihood of ICE issues later.
20
- function waitForIceComplete(pc, timeoutMs) {
21
- return new _promise.default(function (resolve) {
22
- if (!pc) {
23
- resolve({
24
- ok: false,
25
- reason: 'no-pc'
26
- });
27
- return;
28
- }
29
- if (pc.iceGatheringState === 'complete') {
30
- resolve({
31
- ok: true,
32
- reached: 'already'
33
- });
34
- return;
35
- }
36
- var done = false;
37
- var onChange = function onChange() {
38
- if (pc.iceGatheringState === 'complete' && !done) {
39
- done = true;
40
- pc.removeEventListener('icegatheringstatechange', onChange);
41
- resolve({
42
- ok: true,
43
- reached: 'event'
44
- });
45
- }
46
- };
47
- pc.addEventListener('icegatheringstatechange', onChange);
48
-
49
- // timeout fallback
50
- setTimeout(function () {
51
- if (done) return;
52
- done = true;
53
- pc.removeEventListener('icegatheringstatechange', onChange);
54
- resolve({
55
- ok: pc.iceGatheringState === 'complete',
56
- reached: 'timeout'
57
- });
58
- }, timeoutMs);
59
- });
60
- }
61
- function windowsChromiumIceWarmup(_x) {
62
- return _windowsChromiumIceWarmup.apply(this, arguments);
63
- }
64
- function _windowsChromiumIceWarmup() {
65
- _windowsChromiumIceWarmup = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
66
- var _ref$iceServers, iceServers, _ref$timeoutMs, timeoutMs, pc1, pc2, candidates, offer, answer;
67
- return _regenerator.default.wrap(function _callee$(_context) {
68
- while (1) switch (_context.prev = _context.next) {
69
- case 0:
70
- _ref$iceServers = _ref.iceServers, iceServers = _ref$iceServers === void 0 ? [] : _ref$iceServers, _ref$timeoutMs = _ref.timeoutMs, timeoutMs = _ref$timeoutMs === void 0 ? 1000 : _ref$timeoutMs;
71
- pc1 = new RTCPeerConnection({
72
- iceServers: iceServers,
73
- iceCandidatePoolSize: 1
74
- });
75
- pc2 = new RTCPeerConnection({
76
- iceServers: iceServers,
77
- iceCandidatePoolSize: 1
78
- });
79
- candidates = {
80
- pc1: [],
81
- pc2: []
82
- };
83
- pc1.onicecandidate = function (e) {
84
- if (e.candidate && e.candidate.type !== 'host') {
85
- candidates.pc1.push(e.candidate);
86
- }
87
- };
88
- _context.next = 7;
89
- return pc1.createDataChannel('warmup');
90
- case 7:
91
- _context.next = 9;
92
- return pc1.addTransceiver('audio');
93
- case 9:
94
- _context.next = 11;
95
- return pc1.createOffer();
96
- case 11:
97
- offer = _context.sent;
98
- _context.next = 14;
99
- return pc1.setLocalDescription(offer);
100
- case 14:
101
- _context.next = 16;
102
- return waitForIceComplete(pc1, timeoutMs);
103
- case 16:
104
- _context.next = 18;
105
- return pc2.setRemoteDescription(offer);
106
- case 18:
107
- pc2.onicecandidate = function (e) {
108
- if (e.candidate && e.candidate.type !== 'host') {
109
- candidates.pc2.push(e.candidate);
110
- }
111
- };
112
- _context.next = 21;
113
- return pc2.createAnswer();
114
- case 21:
115
- answer = _context.sent;
116
- _context.next = 24;
117
- return pc2.setLocalDescription(answer);
118
- case 24:
119
- _context.next = 26;
120
- return pc1.setRemoteDescription(answer);
121
- case 26:
122
- _context.next = 28;
123
- return waitForIceComplete(pc2, timeoutMs);
124
- case 28:
125
- _context.next = 30;
126
- return _promise.default.all([].concat((0, _toConsumableArray2.default)(candidates.pc1.map(function (candidate) {
127
- return pc2.addIceCandidate(candidate).catch(console.error);
128
- })), (0, _toConsumableArray2.default)(candidates.pc2.map(function (candidate) {
129
- return pc1.addIceCandidate(candidate).catch(console.error);
130
- }))));
131
- case 30:
132
- pc1.close();
133
- pc2.close();
134
- case 32:
135
- case "end":
136
- return _context.stop();
137
- }
138
- }, _callee);
139
- }));
140
- return _windowsChromiumIceWarmup.apply(this, arguments);
141
- }
142
- //# sourceMappingURL=windowsChromiumIceWarmupUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["waitForIceComplete","pc","timeoutMs","_promise","default","resolve","ok","reason","iceGatheringState","reached","done","onChange","removeEventListener","addEventListener","setTimeout","windowsChromiumIceWarmup","_x","_windowsChromiumIceWarmup","apply","arguments","_asyncToGenerator2","_regenerator","mark","_callee","_ref","_ref$iceServers","iceServers","_ref$timeoutMs","pc1","pc2","candidates","offer","answer","wrap","_callee$","_context","prev","next","RTCPeerConnection","iceCandidatePoolSize","onicecandidate","e","candidate","type","push","createDataChannel","addTransceiver","createOffer","sent","setLocalDescription","setRemoteDescription","createAnswer","all","concat","_toConsumableArray2","map","addIceCandidate","catch","console","error","close","stop"],"sources":["windowsChromiumIceWarmupUtils.ts"],"sourcesContent":["// This file contains a workaround for a known issue in Windows Chromium-based browsers\n// See: https://issues.chromium.org/issues/332933530\n// There is a rare condition where WebRTC doesn't work on the first try due to ICE gathering issues.\n// This function attempts to \"warm up\" the ICE gathering process by creating a pair of peer connections\n// and forcing ICE candidate gathering and exchange before the actual call setup.\n// We need to try establishing the connection through the srflx candidates since the host candidate won't work\n// This is intended to be called once at the start of the calling SDK to reduce the likelihood of ICE issues later.\nfunction waitForIceComplete(pc: RTCPeerConnection, timeoutMs: number) {\n return new Promise((resolve) => {\n if (!pc) {\n resolve({ok: false, reason: 'no-pc'});\n\n return;\n }\n if (pc.iceGatheringState === 'complete') {\n resolve({ok: true, reached: 'already'});\n\n return;\n }\n\n let done = false;\n const onChange = () => {\n if (pc.iceGatheringState === 'complete' && !done) {\n done = true;\n pc.removeEventListener('icegatheringstatechange', onChange);\n resolve({ok: true, reached: 'event'});\n }\n };\n pc.addEventListener('icegatheringstatechange', onChange);\n\n // timeout fallback\n setTimeout(() => {\n if (done) return;\n done = true;\n pc.removeEventListener('icegatheringstatechange', onChange);\n resolve({ok: pc.iceGatheringState === 'complete', reached: 'timeout'});\n }, timeoutMs);\n });\n}\n\nexport default async function windowsChromiumIceWarmup({iceServers = [], timeoutMs = 1000}) {\n const pc1 = new RTCPeerConnection({iceServers, iceCandidatePoolSize: 1});\n const pc2 = new RTCPeerConnection({iceServers, iceCandidatePoolSize: 1});\n\n const candidates: {pc1: RTCIceCandidate[]; pc2: RTCIceCandidate[]} = {pc1: [], pc2: []};\n pc1.onicecandidate = (e) => {\n if (e.candidate && e.candidate.type !== 'host') {\n candidates.pc1.push(e.candidate);\n }\n };\n\n await pc1.createDataChannel('warmup');\n await pc1.addTransceiver('audio');\n\n const offer = await pc1.createOffer();\n await pc1.setLocalDescription(offer);\n\n await waitForIceComplete(pc1, timeoutMs);\n\n await pc2.setRemoteDescription(offer);\n pc2.onicecandidate = (e) => {\n if (e.candidate && e.candidate.type !== 'host') {\n candidates.pc2.push(e.candidate);\n }\n };\n\n const answer = await pc2.createAnswer();\n await pc2.setLocalDescription(answer);\n await pc1.setRemoteDescription(answer);\n\n await waitForIceComplete(pc2, timeoutMs);\n\n // Add ice candidates that were gathered\n await Promise.all([\n ...candidates.pc1.map((candidate) => pc2.addIceCandidate(candidate).catch(console.error)),\n ...candidates.pc2.map((candidate) => pc1.addIceCandidate(candidate).catch(console.error)),\n ]);\n\n pc1.close();\n pc2.close();\n}\n"],"mappings":"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","ignoreList":[]}