@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,4 +1,3 @@
1
- import { v4 as uuid } from 'uuid';
2
1
  import { METHOD_START_MESSAGE } from '../../common/constants';
3
2
  import { emitFinalFailure, handleRegistrationErrors, uploadLogs } from '../../common';
4
3
  import webWorkerStr from './webWorkerStr';
@@ -8,8 +7,9 @@ import { getCallManager } from '../calling';
8
7
  import log from '../../Logger';
9
8
  import SDKConnector from '../../SDKConnector';
10
9
  import { ALLOWED_SERVICES, HTTP_METHODS, RegistrationStatus, ServiceIndicator, WorkerMessageType, } from '../../common/types';
11
- import { CALLING_USER_AGENT, CISCO_DEVICE_URL, DEVICES_ENDPOINT_RESOURCE, SPARK_USER_AGENT, WEBEX_WEB_CLIENT, BASE_REG_RETRY_TIMER_VAL_IN_SEC, BASE_REG_TIMER_MFACTOR, SEC_TO_MSEC_MFACTOR, REG_RANDOM_T_FACTOR_UPPER_LIMIT, REG_TRY_BACKUP_TIMER_VAL_IN_SEC, MINUTES_TO_SEC_MFACTOR, REG_429_RETRY_UTIL, REG_FAILBACK_429_MAX_RETRIES, FAILBACK_UTIL, REGISTRATION_FILE, DEFAULT_REHOMING_INTERVAL_MIN, DEFAULT_REHOMING_INTERVAL_MAX, DEFAULT_KEEPALIVE_INTERVAL, FAILOVER_UTIL, REGISTER_UTIL, RETRY_TIMER_UPPER_LIMIT, KEEPALIVE_UTIL, REGISTRATION_UTIL, METHODS, URL_ENDPOINT, RECONNECT_ON_FAILURE_UTIL, FAILOVER_CACHE_PREFIX, } from '../constants';
10
+ import { CALLING_USER_AGENT, CISCO_DEVICE_URL, DEVICES_ENDPOINT_RESOURCE, SPARK_USER_AGENT, BASE_REG_RETRY_TIMER_VAL_IN_SEC, BASE_REG_TIMER_MFACTOR, SEC_TO_MSEC_MFACTOR, REG_RANDOM_T_FACTOR_UPPER_LIMIT, REG_TRY_BACKUP_TIMER_VAL_IN_SEC, MINUTES_TO_SEC_MFACTOR, REG_429_RETRY_UTIL, REG_FAILBACK_429_MAX_RETRIES, FAILBACK_UTIL, REGISTRATION_FILE, DEFAULT_REHOMING_INTERVAL_MIN, DEFAULT_REHOMING_INTERVAL_MAX, DEFAULT_KEEPALIVE_INTERVAL, FAILOVER_UTIL, REGISTER_UTIL, RETRY_TIMER_UPPER_LIMIT, KEEPALIVE_UTIL, REGISTRATION_UTIL, METHODS, URL_ENDPOINT, RECONNECT_ON_FAILURE_UTIL, FAILOVER_CACHE_PREFIX, } from '../constants';
12
11
  import { LINE_EVENTS } from '../line/types';
12
+ import { APIRequest } from '../utils/request';
13
13
  export class Registration {
14
14
  sdkConnector;
15
15
  webex;
@@ -36,6 +36,7 @@ export class Registration {
36
36
  retryAfter;
37
37
  scheduled429Retry = false;
38
38
  webWorker;
39
+ apiRequest;
39
40
  constructor(webex, serviceData, mutex, lineEmitter, logLevel, jwe) {
40
41
  this.jwe = jwe;
41
42
  this.sdkConnector = SDKConnector;
@@ -57,6 +58,12 @@ export class Registration {
57
58
  this.lineEmitter = lineEmitter;
58
59
  this.primaryMobiusUris = [];
59
60
  this.backupMobiusUris = [];
61
+ this.apiRequest = APIRequest.getInstance({ webex: this.webex });
62
+ }
63
+ getServerType(url) {
64
+ return ((this.primaryMobiusUris.includes(url) && 'PRIMARY') ||
65
+ (this.backupMobiusUris?.includes(url) && 'BACKUP') ||
66
+ 'UNKNOWN');
60
67
  }
61
68
  getFailoverCacheKey() {
62
69
  return `${FAILOVER_CACHE_PREFIX}.${this.userId || 'unknown'}`;
@@ -131,16 +138,22 @@ export class Registration {
131
138
  }
132
139
  async deleteRegistration(url, deviceId, deviceUrl) {
133
140
  let response;
141
+ const requestObj = {
142
+ uri: `${url}${DEVICES_ENDPOINT_RESOURCE}/${deviceId}`,
143
+ method: HTTP_METHODS.DELETE,
144
+ headers: {
145
+ [CISCO_DEVICE_URL]: deviceUrl,
146
+ [SPARK_USER_AGENT]: CALLING_USER_AGENT,
147
+ },
148
+ service: ALLOWED_SERVICES.MOBIUS,
149
+ };
150
+ if (this.apiRequest.isSocketEnabled()) {
151
+ requestObj.body = {
152
+ deviceId,
153
+ };
154
+ }
134
155
  try {
135
- response = await fetch(`${url}${DEVICES_ENDPOINT_RESOURCE}/${deviceId}`, {
136
- method: HTTP_METHODS.DELETE,
137
- headers: {
138
- [CISCO_DEVICE_URL]: deviceUrl,
139
- Authorization: await this.webex.credentials.getUserToken(),
140
- trackingId: `${WEBEX_WEB_CLIENT}_${uuid()}`,
141
- [SPARK_USER_AGENT]: CALLING_USER_AGENT,
142
- },
143
- });
156
+ response = await this.apiRequest.makeRequest(requestObj);
144
157
  }
145
158
  catch (error) {
146
159
  log.warn(`Delete failed with Mobius: ${JSON.stringify(error)}`, {
@@ -151,7 +164,7 @@ export class Registration {
151
164
  }
152
165
  this.setStatus(RegistrationStatus.INACTIVE);
153
166
  this.lineEmitter(LINE_EVENTS.UNREGISTERED);
154
- return response?.json();
167
+ return response;
155
168
  }
156
169
  async postRegistration(url) {
157
170
  const deviceInfo = {
@@ -159,7 +172,7 @@ export class Registration {
159
172
  clientDeviceUri: this.webex.internal.device.url,
160
173
  serviceData: this.jwe ? { ...this.serviceData, jwe: this.jwe } : this.serviceData,
161
174
  };
162
- return this.webex.request({
175
+ return this.apiRequest.makeRequest({
163
176
  uri: `${url}device`,
164
177
  method: HTTP_METHODS.POST,
165
178
  headers: {
@@ -171,7 +184,23 @@ export class Registration {
171
184
  });
172
185
  }
173
186
  async restorePreviousRegistration(caller) {
187
+ const loggerContext = {
188
+ file: REGISTRATION_FILE,
189
+ method: METHODS.RESTORE_PREVIOUS_REGISTRATION,
190
+ };
191
+ log.info(`${METHOD_START_MESSAGE} - caller: ${caller}, activeMobiusUrl: ${this.activeMobiusUrl}`, loggerContext);
174
192
  let abort = false;
193
+ if (this.apiRequest.isSocketEnabled() &&
194
+ `${this.apiRequest.getConnectedWebSocketUrl()}/` !== this.activeMobiusUrl) {
195
+ log.info(`Disconnecting from Mobius socket to restore previous registration.`, {
196
+ file: REGISTRATION_FILE,
197
+ method: 'restorePreviousRegistration',
198
+ });
199
+ await this.apiRequest.disconnectFromMobiusSocket({
200
+ code: 3050,
201
+ reason: 'done (permanent)',
202
+ });
203
+ }
175
204
  if (this.activeMobiusUrl) {
176
205
  abort = await this.attemptRegistrationWithServers(caller, [this.activeMobiusUrl]);
177
206
  if (this.retryAfter) {
@@ -185,20 +214,31 @@ export class Registration {
185
214
  abort = await this.attemptRegistrationWithServers(caller, this.backupMobiusUris);
186
215
  }
187
216
  else {
188
- this.restartRegistration(caller);
217
+ await this.restartRegistration(caller);
189
218
  }
190
219
  this.retryAfter = undefined;
220
+ log.log(`restorePreviousRegistration completed via 429 retry-after path - caller: ${caller}`, loggerContext);
191
221
  return true;
192
222
  }
193
223
  }
224
+ log.log(`restorePreviousRegistration completed - caller: ${caller}, deviceRegistered: ${this.isDeviceRegistered()}, abort: ${abort}`, loggerContext);
194
225
  return abort;
195
226
  }
196
227
  async handle404KeepaliveFailure(caller) {
228
+ const loggerContext = {
229
+ file: REGISTRATION_FILE,
230
+ method: METHODS.HANDLE_404_KEEPALIVE_FAILURE,
231
+ };
232
+ log.info(`${METHOD_START_MESSAGE} - caller: ${caller}`, loggerContext);
197
233
  if (caller === KEEPALIVE_UTIL) {
198
234
  const abort = await this.attemptRegistrationWithServers(caller);
199
235
  if (!abort && !this.isDeviceRegistered()) {
236
+ log.warn('Keepalive 404 recovery: re-registration did not complete, starting failover timer', loggerContext);
200
237
  await this.startFailoverTimer();
201
238
  }
239
+ else {
240
+ log.log(`Keepalive 404 recovery handled - deviceRegistered: ${this.isDeviceRegistered()}, abort: ${abort}`, loggerContext);
241
+ }
202
242
  }
203
243
  }
204
244
  async handle429Retry(retryAfter, caller) {
@@ -279,6 +319,14 @@ export class Registration {
279
319
  log.log(`Scheduled retry with primary in ${interval} seconds, number of attempts : ${attempt}`, loggerContext);
280
320
  }
281
321
  else if (this.backupMobiusUris.length) {
322
+ if (this.apiRequest.isSocketEnabled()) {
323
+ log.info('Disconnecting from primary Mobius socket for failover to backup servers', loggerContext);
324
+ await this.apiRequest.disconnectFromMobiusSocket({
325
+ code: 3050,
326
+ reason: 'done (permanent)',
327
+ });
328
+ log.log('Mobius socket disconnect complete prior to backup failover', loggerContext);
329
+ }
282
330
  this.saveFailoverState({
283
331
  attempt,
284
332
  timeElapsed,
@@ -311,7 +359,7 @@ export class Registration {
311
359
  await uploadLogs();
312
360
  emitFinalFailure((clientError) => {
313
361
  this.lineEmitter(LINE_EVENTS.ERROR, undefined, clientError);
314
- }, loggerContext);
362
+ }, loggerContext, interval < 0 ? 'Timer threshold exceeded during failover' : undefined);
315
363
  }
316
364
  }
317
365
  clearFailbackTimer() {
@@ -320,11 +368,25 @@ export class Registration {
320
368
  this.failbackTimer = undefined;
321
369
  }
322
370
  }
371
+ async postKeepAlive(deviceUrl, url) {
372
+ return this.apiRequest.makeRequest({
373
+ uri: `${url}/status`,
374
+ method: HTTP_METHODS.POST,
375
+ headers: {
376
+ [CISCO_DEVICE_URL]: deviceUrl,
377
+ [SPARK_USER_AGENT]: CALLING_USER_AGENT,
378
+ },
379
+ body: {
380
+ deviceId: this.deviceInfo.device?.deviceId,
381
+ },
382
+ service: ALLOWED_SERVICES.MOBIUS,
383
+ });
384
+ }
323
385
  async isPrimaryActive() {
324
386
  let status;
325
387
  for (const mobiusUrl of this.primaryMobiusUris) {
326
388
  try {
327
- const baseUri = mobiusUrl.replace(URL_ENDPOINT, '/');
389
+ const baseUri = mobiusUrl.replace(URL_ENDPOINT, '/').replace('wss://', 'https://');
328
390
  const response = await this.webex.request({
329
391
  uri: `${baseUri}ping`,
330
392
  method: HTTP_METHODS.GET,
@@ -362,14 +424,23 @@ export class Registration {
362
424
  this.rehomingIntervalMin);
363
425
  }
364
426
  initiateFailback() {
427
+ const loggerContext = {
428
+ file: REGISTRATION_FILE,
429
+ method: METHODS.INITIATE_FAILBACK,
430
+ };
365
431
  if (this.isFailbackRequired()) {
366
432
  if (!this.failbackTimer) {
367
433
  this.failback429RetryAttempts = 0;
368
434
  const intervalInMinutes = this.getFailbackInterval();
435
+ log.info(`Scheduling failback to primary - intervalMinutes: ${intervalInMinutes}`, loggerContext);
369
436
  this.startFailbackTimer(intervalInMinutes * MINUTES_TO_SEC_MFACTOR);
370
437
  }
438
+ else {
439
+ log.info('Failback timer already scheduled, skipping', loggerContext);
440
+ }
371
441
  }
372
442
  else {
443
+ log.info('Failback not required, clearing any pending failback timer', loggerContext);
373
444
  this.failback429RetryAttempts = 0;
374
445
  this.clearFailbackTimer();
375
446
  }
@@ -382,15 +453,25 @@ export class Registration {
382
453
  });
383
454
  }
384
455
  async executeFailback() {
456
+ const loggerContext = {
457
+ file: REGISTRATION_FILE,
458
+ method: METHODS.EXECUTE_FAILBACK,
459
+ };
460
+ log.info(METHOD_START_MESSAGE, loggerContext);
385
461
  await this.mutex.runExclusive(async () => {
386
462
  if (this.isFailbackRequired()) {
387
463
  const primaryServerStatus = await this.isPrimaryActive();
388
464
  if (Object.keys(this.callManager.getActiveCalls()).length === 0 && primaryServerStatus) {
389
- log.info(`Attempting failback to primary.`, {
390
- file: REGISTRATION_FILE,
391
- method: this.executeFailback.name,
392
- });
465
+ log.info(`Attempting failback to primary.`, loggerContext);
393
466
  await this.deregister();
467
+ if (this.apiRequest.isSocketEnabled()) {
468
+ log.info('Disconnecting from backup Mobius socket for failback to primary', loggerContext);
469
+ await this.apiRequest.disconnectFromMobiusSocket({
470
+ code: 3050,
471
+ reason: 'done (permanent)',
472
+ });
473
+ log.log('Mobius socket disconnect complete prior to primary failback', loggerContext);
474
+ }
394
475
  const abort = await this.attemptRegistrationWithServers(FAILBACK_UTIL);
395
476
  if (this.scheduled429Retry || abort || this.isDeviceRegistered()) {
396
477
  return;
@@ -401,7 +482,7 @@ export class Registration {
401
482
  return;
402
483
  }
403
484
  if (!this.isDeviceRegistered()) {
404
- await this.restartRegistration(this.executeFailback.name);
485
+ await this.restartRegistration(loggerContext.method);
405
486
  }
406
487
  else {
407
488
  this.failbackTimer = undefined;
@@ -409,10 +490,7 @@ export class Registration {
409
490
  }
410
491
  }
411
492
  else {
412
- log.info('Active calls present or primary Mobius is down, deferring failback to next cycle.', {
413
- file: REGISTRATION_FILE,
414
- method: this.executeFailback.name,
415
- });
493
+ log.info('Active calls present or primary Mobius is down, deferring failback to next cycle.', loggerContext);
416
494
  this.failbackTimer = undefined;
417
495
  this.initiateFailback();
418
496
  }
@@ -442,12 +520,18 @@ export class Registration {
442
520
  this.registrationStatus = value;
443
521
  }
444
522
  async restartRegistration(caller) {
523
+ const loggerContext = {
524
+ file: REGISTRATION_FILE,
525
+ method: METHODS.RESTART_REGISTRATION,
526
+ };
527
+ log.info(`${METHOD_START_MESSAGE} - caller: ${caller}`, loggerContext);
445
528
  this.clearFailbackTimer();
446
529
  this.failback429RetryAttempts = 0;
447
530
  const abort = await this.attemptRegistrationWithServers(caller, this.primaryMobiusUris);
448
531
  if (!abort && !this.isDeviceRegistered()) {
449
532
  await this.startFailoverTimer();
450
533
  }
534
+ log.log(`restartRegistration completed - caller: ${caller}, deviceRegistered: ${this.isDeviceRegistered()}, abort: ${abort}`, loggerContext);
451
535
  }
452
536
  async handleConnectionRestoration(retry) {
453
537
  log.info(METHOD_START_MESSAGE, {
@@ -500,7 +584,13 @@ export class Registration {
500
584
  };
501
585
  }
502
586
  async triggerRegistration() {
587
+ const loggerContext = {
588
+ file: REGISTRATION_FILE,
589
+ method: METHODS.TRIGGER_REGISTRATION,
590
+ };
591
+ log.info(METHOD_START_MESSAGE, loggerContext);
503
592
  if (await this.resumeFailover()) {
593
+ log.info('Registration trigger handled by resumeFailover path', loggerContext);
504
594
  return;
505
595
  }
506
596
  if (this.primaryMobiusUris.length > 0) {
@@ -508,43 +598,48 @@ export class Registration {
508
598
  if (!this.isDeviceRegistered() && !abort) {
509
599
  await this.startFailoverTimer();
510
600
  }
601
+ log.log(`triggerRegistration completed - deviceRegistered: ${this.isDeviceRegistered()}, abort: ${abort}`, loggerContext);
602
+ }
603
+ else {
604
+ log.warn('triggerRegistration skipped: no primary Mobius URIs available', loggerContext);
511
605
  }
512
606
  }
513
607
  async attemptRegistrationWithServers(caller, servers = this.primaryMobiusUris) {
608
+ const loggerContext = {
609
+ file: REGISTRATION_FILE,
610
+ method: REGISTER_UTIL,
611
+ };
514
612
  let abort = false;
515
613
  this.retryAfter = undefined;
614
+ let connectedWebSocketUrl;
516
615
  if (this.failoverImmediately) {
517
616
  return abort;
518
617
  }
519
618
  if (this.isDeviceRegistered()) {
520
- log.info(`[${caller}] : Device already registered with : ${this.activeMobiusUrl}`, {
521
- file: REGISTRATION_FILE,
522
- method: REGISTER_UTIL,
523
- });
619
+ log.info(`[${caller}] : Device already registered with : ${this.activeMobiusUrl}`, loggerContext);
524
620
  return abort;
525
621
  }
526
622
  for (const url of servers) {
527
- const serverType = (this.primaryMobiusUris.includes(url) && 'PRIMARY') ||
528
- (this.backupMobiusUris?.includes(url) && 'BACKUP') ||
529
- 'UNKNOWN';
623
+ const serverType = this.getServerType(url);
530
624
  try {
531
625
  abort = false;
532
626
  this.registrationStatus = RegistrationStatus.INACTIVE;
533
627
  this.lineEmitter(LINE_EVENTS.CONNECTING);
534
- log.info(`[${caller}] : Mobius url to contact: ${url}`, {
535
- file: REGISTRATION_FILE,
536
- method: REGISTER_UTIL,
537
- });
628
+ log.info(`[${caller}] : Mobius url to contact: ${url}`, loggerContext);
629
+ if (this.apiRequest.isSocketEnabled()) {
630
+ const wssNormalizedUrl = url.endsWith('/') ? url.slice(0, -1) : url;
631
+ log.info(`[${caller}] : Connecting to Mobius WebSocket - serverType: ${serverType}, wssUrl: ${wssNormalizedUrl}`, loggerContext);
632
+ connectedWebSocketUrl = await this.apiRequest.connectToMobiusSocket(wssNormalizedUrl);
633
+ connectedWebSocketUrl = connectedWebSocketUrl ? `${connectedWebSocketUrl}/` : undefined;
634
+ log.log(`[${caller}] : Mobius WebSocket connected - serverType: ${serverType}, connectedWebSocketUrl: ${connectedWebSocketUrl}`, loggerContext);
635
+ }
538
636
  const resp = await this.postRegistration(url);
539
637
  this.clearFailoverState();
540
638
  this.deviceInfo = resp.body;
541
639
  this.registrationStatus = RegistrationStatus.ACTIVE;
542
- this.setActiveMobiusUrl(url);
640
+ this.setActiveMobiusUrl(connectedWebSocketUrl || url);
543
641
  this.lineEmitter(LINE_EVENTS.REGISTERED, resp.body);
544
- log.log(`Registration successful for deviceId: ${this.deviceInfo.device?.deviceId} userId: ${this.userId} responseTrackingId: ${resp.headers?.trackingid}`, {
545
- file: REGISTRATION_FILE,
546
- method: METHODS.REGISTER,
547
- });
642
+ log.log(`Registration successful for deviceId: ${this.deviceInfo.device?.deviceId} userId: ${this.userId} responseTrackingId: ${resp.headers?.trackingid}`, loggerContext);
548
643
  this.setIntervalValues(this.deviceInfo);
549
644
  this.metricManager.setDeviceInfo(this.deviceInfo);
550
645
  this.metricManager.submitRegistrationMetric(METRIC_EVENT.REGISTRATION, REG_ACTION.REGISTER, METRIC_TYPE.BEHAVIORAL, caller, serverType, resp.headers?.trackingid ?? '', undefined, undefined);
@@ -554,22 +649,29 @@ export class Registration {
554
649
  }
555
650
  catch (err) {
556
651
  const body = err;
557
- abort = await handleRegistrationErrors(body, (clientError, finalError) => {
558
- if (finalError) {
652
+ const { finalError, shouldDisconnect } = await handleRegistrationErrors(body, (clientError, isFinalError) => {
653
+ if (isFinalError) {
559
654
  this.lineEmitter(LINE_EVENTS.ERROR, undefined, clientError);
560
655
  }
561
656
  else {
562
657
  this.lineEmitter(LINE_EVENTS.UNREGISTERED);
563
658
  }
564
659
  this.metricManager.submitRegistrationMetric(METRIC_EVENT.REGISTRATION_ERROR, REG_ACTION.REGISTER, METRIC_TYPE.BEHAVIORAL, caller, serverType, body.headers?.trackingid ?? '', undefined, clientError);
565
- }, { method: caller, file: REGISTRATION_FILE }, (retryAfter, retryCaller) => this.handle429Retry(retryAfter, retryCaller), this.restoreRegistrationCallBack());
660
+ }, { method: caller, file: REGISTRATION_FILE }, (retryAfter, retryCaller) => this.handle429Retry(retryAfter, retryCaller), this.restoreRegistrationCallBack(), servers.length);
661
+ abort = finalError;
566
662
  if (this.registrationStatus === RegistrationStatus.ACTIVE) {
567
- log.info(`[${caller}] : Device is already restored, active mobius url: ${this.activeMobiusUrl}`, {
568
- file: REGISTRATION_FILE,
569
- method: this.attemptRegistrationWithServers.name,
570
- });
663
+ log.info(`[${caller}] : Device is already restored, active mobius url: ${this.activeMobiusUrl}`, loggerContext);
571
664
  break;
572
665
  }
666
+ if (shouldDisconnect && this.apiRequest.isSocketEnabled()) {
667
+ connectedWebSocketUrl = undefined;
668
+ log.info(`[${caller}] : Tearing down Mobius WebSocket after registration error - serverType: ${serverType}`, loggerContext);
669
+ await this.apiRequest.disconnectFromMobiusSocket({
670
+ code: 3050,
671
+ reason: 'done (permanent)',
672
+ });
673
+ log.log(`[${caller}] : Mobius WebSocket disconnect complete after registration error - serverType: ${serverType}`, loggerContext);
674
+ }
573
675
  if (abort) {
574
676
  this.setStatus(RegistrationStatus.INACTIVE);
575
677
  await uploadLogs();
@@ -584,7 +686,6 @@ export class Registration {
584
686
  const RETRY_COUNT_THRESHOLD = this.isCCFlow ? 4 : 5;
585
687
  await this.mutex.runExclusive(async () => {
586
688
  if (this.isDeviceRegistered()) {
587
- const accessToken = await this.webex.credentials.getUserToken();
588
689
  if (!this.webWorker) {
589
690
  const blob = new Blob([webWorkerStr], { type: 'application/javascript' });
590
691
  const blobUrl = URL.createObjectURL(blob);
@@ -592,17 +693,38 @@ export class Registration {
592
693
  URL.revokeObjectURL(blobUrl);
593
694
  this.webWorker.postMessage({
594
695
  type: WorkerMessageType.START_KEEPALIVE,
595
- accessToken: String(accessToken),
596
- deviceUrl: String(this.webex.internal.device.url),
597
696
  interval,
598
697
  retryCountThreshold: RETRY_COUNT_THRESHOLD,
599
- url,
600
698
  });
601
699
  this.webWorker.onmessage = async (event) => {
602
700
  const logContext = {
603
701
  file: REGISTRATION_FILE,
604
702
  method: KEEPALIVE_UTIL,
605
703
  };
704
+ if (event.data.type === WorkerMessageType.SEND_KEEPALIVE) {
705
+ try {
706
+ const res = await this.postKeepAlive(String(this.webex.internal.device.url), url);
707
+ this.webWorker?.postMessage({
708
+ type: WorkerMessageType.KEEPALIVE_RESULT,
709
+ statusCode: res.statusCode,
710
+ });
711
+ }
712
+ catch (err) {
713
+ const error = {
714
+ headers: {
715
+ trackingid: err.headers?.trackingid,
716
+ 'retry-after': err.headers['retry-after'],
717
+ },
718
+ statusCode: err.statusCode,
719
+ statusText: err.statusText,
720
+ type: err.type,
721
+ };
722
+ this.webWorker?.postMessage({
723
+ type: WorkerMessageType.KEEPALIVE_RESULT,
724
+ err: error,
725
+ });
726
+ }
727
+ }
606
728
  if (event.data.type === WorkerMessageType.KEEPALIVE_SUCCESS) {
607
729
  log.info(`Sent Keepalive, status: ${event.data.statusCode}`, logContext);
608
730
  this.lineEmitter(LINE_EVENTS.RECONNECTED);
@@ -610,7 +732,7 @@ export class Registration {
610
732
  if (event.data.type === WorkerMessageType.KEEPALIVE_FAILURE) {
611
733
  const error = event.data.err;
612
734
  log.warn(`Keep-alive missed ${event.data.keepAliveRetryCount} times. Status -> ${error.statusCode} `, logContext);
613
- const abort = await handleRegistrationErrors(error, (clientError, finalError) => {
735
+ const { finalError: abort } = await handleRegistrationErrors(error, (clientError, finalError) => {
614
736
  if (finalError) {
615
737
  this.lineEmitter(LINE_EVENTS.ERROR, undefined, clientError);
616
738
  }
@@ -649,19 +771,25 @@ export class Registration {
649
771
  isReconnectPending() {
650
772
  return this.reconnectPending;
651
773
  }
652
- async deregister() {
774
+ async deregister(closeMobiusWss = false) {
775
+ const loggerContext = {
776
+ file: REGISTRATION_FILE,
777
+ method: METHODS.DEREGISTER,
778
+ };
779
+ log.info(METHOD_START_MESSAGE, loggerContext);
653
780
  try {
654
781
  await this.deleteRegistration(this.activeMobiusUrl, this.deviceInfo.device?.deviceId, this.deviceInfo.device?.clientDeviceUri);
655
- log.log('Registration successfully deregistered', {
656
- file: REGISTRATION_FILE,
657
- method: METHODS.DEREGISTER,
658
- });
782
+ log.log('Registration successfully deregistered', loggerContext);
659
783
  }
660
784
  catch (err) {
661
- log.warn(`Delete failed with Mobius: ${JSON.stringify(err)}`, {
662
- file: REGISTRATION_FILE,
663
- method: METHODS.DEREGISTER,
785
+ log.warn(`Delete failed with Mobius: ${JSON.stringify(err)}`, loggerContext);
786
+ }
787
+ if (closeMobiusWss) {
788
+ await this.apiRequest.disconnectFromMobiusSocket({
789
+ code: 3050,
790
+ reason: 'done (permanent)',
664
791
  });
792
+ log.log('Mobius socket disconnect complete after deregistration', loggerContext);
665
793
  }
666
794
  this.clearKeepaliveTimer();
667
795
  this.setStatus(RegistrationStatus.INACTIVE);
@@ -683,7 +811,10 @@ export class Registration {
683
811
  rehomingIntervalMin: DEFAULT_REHOMING_INTERVAL_MIN,
684
812
  };
685
813
  const stringToReplace = `${DEVICES_ENDPOINT_RESOURCE}/${restoreData.devices[0].deviceId}`;
686
- const uri = restoreData.devices[0].uri.replace(stringToReplace, '');
814
+ let uri = restoreData.devices[0].uri.replace(stringToReplace, '');
815
+ if (this.apiRequest.isSocketEnabled()) {
816
+ uri = uri.replace('https://', 'wss://');
817
+ }
687
818
  this.setActiveMobiusUrl(uri);
688
819
  this.registrationStatus = RegistrationStatus.ACTIVE;
689
820
  return true;
@@ -709,5 +840,46 @@ export class Registration {
709
840
  }
710
841
  }
711
842
  }
843
+ async handleRegistrationDownEvent(event) {
844
+ const loggerContext = {
845
+ file: REGISTRATION_FILE,
846
+ method: METHODS.HANDLE_REGISTRATION_DOWN_EVENT,
847
+ };
848
+ log.info(`Registration down received - trackingId: ${event?.trackingId ?? 'unknown'}, eventId: ${event?.eventId ?? 'unknown'}`, loggerContext);
849
+ const [activeCall] = Object.values(this.callManager.getActiveCalls());
850
+ activeCall?.end();
851
+ await this.performRegistrationDownCleanup(METHODS.HANDLE_REGISTRATION_DOWN_EVENT);
852
+ }
853
+ async performRegistrationDownCleanup(caller) {
854
+ const loggerContext = {
855
+ file: REGISTRATION_FILE,
856
+ method: METHODS.HANDLE_REGISTRATION_DOWN_EVENT,
857
+ };
858
+ log.info(`[${caller}] : Running registration-down cleanup`, loggerContext);
859
+ await this.mutex.runExclusive(async () => {
860
+ this.clearFailbackTimer();
861
+ this.clearKeepaliveTimer();
862
+ this.reconnectPending = false;
863
+ this.scheduled429Retry = false;
864
+ this.failoverImmediately = false;
865
+ this.retryAfter = undefined;
866
+ this.registerRetry = false;
867
+ this.clearFailoverState();
868
+ this.setStatus(RegistrationStatus.INACTIVE);
869
+ if (this.apiRequest.isSocketEnabled()) {
870
+ try {
871
+ await this.apiRequest.disconnectFromMobiusSocket({
872
+ code: 3050,
873
+ reason: 'done (permanent)',
874
+ });
875
+ log.log('Mobius socket disconnect complete after registration-down', loggerContext);
876
+ }
877
+ catch (err) {
878
+ log.warn(`Mobius socket disconnect failed after registration-down: ${String(err)}`, loggerContext);
879
+ }
880
+ }
881
+ this.lineEmitter(LINE_EVENTS.UNREGISTERED);
882
+ });
883
+ }
712
884
  }
713
885
  export const createRegistration = (webex, serviceData, mutex, lineEmitter, logLevel, jwe) => new Registration(webex, serviceData, mutex, lineEmitter, logLevel, jwe);
@@ -1,73 +1,54 @@
1
- import { v4 as uuid } from 'uuid';
2
- import { HTTP_METHODS, WorkerMessageType } from '../../common/types';
1
+ import { WorkerMessageType } from '../../common/types';
3
2
  let keepaliveTimer;
3
+ let keepAliveRetryCount = 0;
4
+ let keepaliveInFlight = false;
5
+ const clearKeepaliveTimer = () => {
6
+ if (keepaliveTimer) {
7
+ clearInterval(keepaliveTimer);
8
+ keepaliveTimer = undefined;
9
+ }
10
+ };
4
11
  const messageHandler = (event) => {
5
12
  const { type } = event.data;
6
- const postKeepAlive = async (accessToken, deviceUrl, url) => {
7
- const response = await fetch(`${url}/status`, {
8
- method: HTTP_METHODS.POST,
9
- headers: {
10
- 'cisco-device-url': deviceUrl,
11
- 'spark-user-agent': 'webex-calling/beta',
12
- Authorization: `${accessToken}`,
13
- trackingId: `web_worker_${uuid()}`,
14
- },
15
- });
16
- if (!response.ok) {
17
- throw response;
18
- }
19
- return response;
20
- };
21
13
  if (type === WorkerMessageType.START_KEEPALIVE) {
22
- let keepAliveRetryCount = 0;
23
- const { accessToken, deviceUrl, interval, retryCountThreshold, url } = event.data;
24
- if (keepaliveTimer) {
25
- clearInterval(keepaliveTimer);
26
- keepaliveTimer = undefined;
27
- }
28
- keepaliveTimer = setInterval(async () => {
29
- if (keepAliveRetryCount < retryCountThreshold) {
30
- try {
31
- const res = await postKeepAlive(accessToken, deviceUrl, url);
32
- const statusCode = res.status;
33
- if (keepAliveRetryCount > 0) {
34
- postMessage({
35
- type: WorkerMessageType.KEEPALIVE_SUCCESS,
36
- statusCode,
37
- });
38
- }
39
- keepAliveRetryCount = 0;
40
- }
41
- catch (err) {
42
- const headers = {};
43
- if (err.headers?.has('Retry-After')) {
44
- headers['retry-after'] = err.headers.get('Retry-After');
45
- }
46
- if (err.headers?.has('Trackingid')) {
47
- headers['trackingid'] = err.headers.get('Trackingid');
48
- }
49
- const error = {
50
- headers,
51
- statusCode: err.status,
52
- statusText: err.statusText,
53
- type: err.type,
54
- };
55
- keepAliveRetryCount += 1;
56
- postMessage({
57
- type: WorkerMessageType.KEEPALIVE_FAILURE,
58
- err: error,
59
- keepAliveRetryCount,
60
- });
61
- }
14
+ const { interval, retryCountThreshold } = event.data;
15
+ clearKeepaliveTimer();
16
+ keepAliveRetryCount = 0;
17
+ keepaliveInFlight = false;
18
+ keepaliveTimer = setInterval(() => {
19
+ if (keepAliveRetryCount < retryCountThreshold && !keepaliveInFlight) {
20
+ keepaliveInFlight = true;
21
+ postMessage({
22
+ type: WorkerMessageType.SEND_KEEPALIVE,
23
+ });
62
24
  }
63
25
  }, interval * 1000);
64
26
  }
65
- if (type === WorkerMessageType.CLEAR_KEEPALIVE) {
66
- if (keepaliveTimer) {
67
- clearInterval(keepaliveTimer);
68
- keepaliveTimer = undefined;
27
+ if (type === WorkerMessageType.KEEPALIVE_RESULT) {
28
+ keepaliveInFlight = false;
29
+ if (event.data.err === undefined) {
30
+ if (keepAliveRetryCount > 0) {
31
+ postMessage({
32
+ type: WorkerMessageType.KEEPALIVE_SUCCESS,
33
+ statusCode: event.data.statusCode,
34
+ });
35
+ }
36
+ keepAliveRetryCount = 0;
37
+ }
38
+ else {
39
+ keepAliveRetryCount += 1;
40
+ postMessage({
41
+ type: WorkerMessageType.KEEPALIVE_FAILURE,
42
+ err: event.data.err,
43
+ keepAliveRetryCount,
44
+ });
69
45
  }
70
46
  }
47
+ if (type === WorkerMessageType.CLEAR_KEEPALIVE) {
48
+ clearKeepaliveTimer();
49
+ keepAliveRetryCount = 0;
50
+ keepaliveInFlight = false;
51
+ }
71
52
  };
72
53
  self.addEventListener('message', messageHandler);
73
54
  export default messageHandler;