@webex/calling 3.10.0-next.1 → 3.10.0-next.11

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 (61) hide show
  1. package/dist/CallHistory/CallHistory.js +26 -20
  2. package/dist/CallHistory/CallHistory.js.map +1 -1
  3. package/dist/CallHistory/CallHistory.test.js +109 -0
  4. package/dist/CallHistory/CallHistory.test.js.map +1 -1
  5. package/dist/CallSettings/WxCallBackendConnector.js +2 -1
  6. package/dist/CallSettings/WxCallBackendConnector.js.map +1 -1
  7. package/dist/CallingClient/CallingClient.js +160 -205
  8. package/dist/CallingClient/CallingClient.js.map +1 -1
  9. package/dist/CallingClient/CallingClient.test.js +152 -290
  10. package/dist/CallingClient/CallingClient.test.js.map +1 -1
  11. package/dist/CallingClient/calling/call.js +61 -43
  12. package/dist/CallingClient/calling/call.js.map +1 -1
  13. package/dist/CallingClient/calling/call.test.js +594 -361
  14. package/dist/CallingClient/calling/call.test.js.map +1 -1
  15. package/dist/CallingClient/constants.js +3 -1
  16. package/dist/CallingClient/constants.js.map +1 -1
  17. package/dist/Contacts/ContactsClient.js +8 -5
  18. package/dist/Contacts/ContactsClient.js.map +1 -1
  19. package/dist/Events/impl/index.js +1 -2
  20. package/dist/Events/impl/index.js.map +1 -1
  21. package/dist/SDKConnector/types.js.map +1 -1
  22. package/dist/Voicemail/BroadworksBackendConnector.js +14 -12
  23. package/dist/Voicemail/BroadworksBackendConnector.js.map +1 -1
  24. package/dist/Voicemail/UcmBackendConnector.js +2 -1
  25. package/dist/Voicemail/UcmBackendConnector.js.map +1 -1
  26. package/dist/common/Utils.js +68 -39
  27. package/dist/common/Utils.js.map +1 -1
  28. package/dist/common/Utils.test.js +392 -143
  29. package/dist/common/Utils.test.js.map +1 -1
  30. package/dist/common/testUtil.js +2 -1
  31. package/dist/common/testUtil.js.map +1 -1
  32. package/dist/module/CallHistory/CallHistory.js +7 -3
  33. package/dist/module/CallSettings/WxCallBackendConnector.js +3 -1
  34. package/dist/module/CallingClient/CallingClient.js +83 -121
  35. package/dist/module/CallingClient/calling/call.js +35 -23
  36. package/dist/module/CallingClient/constants.js +1 -0
  37. package/dist/module/Contacts/ContactsClient.js +9 -5
  38. package/dist/module/Events/impl/index.js +1 -2
  39. package/dist/module/Voicemail/BroadworksBackendConnector.js +3 -1
  40. package/dist/module/Voicemail/UcmBackendConnector.js +2 -1
  41. package/dist/module/common/Utils.js +27 -3
  42. package/dist/module/common/testUtil.js +1 -0
  43. package/dist/types/CallHistory/CallHistory.d.ts.map +1 -1
  44. package/dist/types/CallSettings/WxCallBackendConnector.d.ts.map +1 -1
  45. package/dist/types/CallingClient/CallingClient.d.ts.map +1 -1
  46. package/dist/types/CallingClient/calling/call.d.ts +2 -0
  47. package/dist/types/CallingClient/calling/call.d.ts.map +1 -1
  48. package/dist/types/CallingClient/constants.d.ts +1 -0
  49. package/dist/types/CallingClient/constants.d.ts.map +1 -1
  50. package/dist/types/Contacts/ContactsClient.d.ts +1 -0
  51. package/dist/types/Contacts/ContactsClient.d.ts.map +1 -1
  52. package/dist/types/Events/impl/index.d.ts.map +1 -1
  53. package/dist/types/SDKConnector/types.d.ts +10 -0
  54. package/dist/types/SDKConnector/types.d.ts.map +1 -1
  55. package/dist/types/Voicemail/BroadworksBackendConnector.d.ts.map +1 -1
  56. package/dist/types/Voicemail/UcmBackendConnector.d.ts.map +1 -1
  57. package/dist/types/common/Utils.d.ts +1 -1
  58. package/dist/types/common/Utils.d.ts.map +1 -1
  59. package/dist/types/common/testUtil.d.ts +1 -0
  60. package/dist/types/common/testUtil.d.ts.map +1 -1
  61. package/package.json +4 -4
@@ -9,7 +9,7 @@ import { MOBIUS_EVENT_KEYS, SessionType, CALLING_CLIENT_EVENT_KEYS, } from '../E
9
9
  import { ServiceIndicator, ALLOWED_SERVICES, HTTP_METHODS, RegistrationStatus, } from '../common/types';
10
10
  import log from '../Logger';
11
11
  import { getCallManager } from './calling/callManager';
12
- import { CALLING_CLIENT_FILE, CALLS_CLEARED_HANDLER_UTIL, CALLING_USER_AGENT, CISCO_DEVICE_URL, DISCOVERY_URL, GET_MOBIUS_SERVERS_UTIL, IP_ENDPOINT, SPARK_USER_AGENT, URL_ENDPOINT, API_V1, MOBIUS_US_PROD, MOBIUS_EU_PROD, MOBIUS_US_INT, MOBIUS_EU_INT, METHODS, NETWORK_FLAP_TIMEOUT, } from './constants';
12
+ import { CALLING_CLIENT_FILE, CALLS_CLEARED_HANDLER_UTIL, CALLING_USER_AGENT, CISCO_DEVICE_URL, DISCOVERY_URL, GET_MOBIUS_SERVERS_UTIL, SPARK_USER_AGENT, URL_ENDPOINT, API_V1, METHODS, NETWORK_FLAP_TIMEOUT, } from './constants';
13
13
  import Line from './line';
14
14
  import { METRIC_EVENT, REG_ACTION, METRIC_TYPE, CONNECTION_ACTION, MOBIUS_SERVER_ACTION, } from '../Metrics/types';
15
15
  import { getMetricManager } from '../Metrics';
@@ -65,28 +65,7 @@ export class CallingClient extends Eventing {
65
65
  this.mediaEngine.setLogger(adaptedLogger);
66
66
  this.primaryMobiusUris = [];
67
67
  this.backupMobiusUris = [];
68
- let mobiusServiceHost = '';
69
- try {
70
- mobiusServiceHost = new URL(this.webex.internal.services._serviceUrls.mobius).host;
71
- }
72
- catch (error) {
73
- log.warn(`Failed to parse mobius service URL`, {
74
- file: CALLING_CLIENT_FILE,
75
- method: this.constructor.name,
76
- });
77
- }
78
- if (this.webex.internal.services._hostCatalog) {
79
- this.mobiusClusters =
80
- (mobiusServiceHost && this.webex.internal.services._hostCatalog[mobiusServiceHost]) ||
81
- this.webex.internal.services._hostCatalog[MOBIUS_US_PROD] ||
82
- this.webex.internal.services._hostCatalog[MOBIUS_EU_PROD] ||
83
- this.webex.internal.services._hostCatalog[MOBIUS_US_INT] ||
84
- this.webex.internal.services._hostCatalog[MOBIUS_EU_INT];
85
- }
86
- else {
87
- const mobiusObject = this.webex.internal.services._services.find((item) => item.serviceName === 'mobius');
88
- this.mobiusClusters = [mobiusObject.serviceUrls[0].baseUrl];
89
- }
68
+ this.mobiusClusters = this.webex.internal.services.getMobiusClusters();
90
69
  this.mobiusHost = '';
91
70
  this.registerSessionsListener();
92
71
  this.registerCallsClearedListener();
@@ -237,67 +216,38 @@ export class CallingClient extends Eventing {
237
216
  method: METHODS.GET_CLIENT_REGION_INFO,
238
217
  });
239
218
  const regionInfo = {};
240
- for (const mobius of this.mobiusClusters) {
241
- if (mobius.host) {
242
- this.mobiusHost = `https://${mobius.host}${API_V1}`;
243
- }
244
- else {
245
- this.mobiusHost = mobius;
246
- }
247
- try {
248
- const temp = await this.webex.request({
249
- uri: `${this.mobiusHost}${URL_ENDPOINT}${IP_ENDPOINT}`,
250
- method: HTTP_METHODS.GET,
251
- headers: {
252
- [CISCO_DEVICE_URL]: this.webex.internal.device.url,
253
- [SPARK_USER_AGENT]: CALLING_USER_AGENT,
254
- },
255
- service: ALLOWED_SERVICES.MOBIUS,
256
- });
257
- log.log(`Response trackingId: ${temp?.headers?.trackingid}`, {
258
- file: CALLING_CLIENT_FILE,
259
- method: METHODS.GET_CLIENT_REGION_INFO,
260
- });
261
- const myIP = temp.body.ipv4;
262
- const response = await this.webex.request({
263
- uri: `${DISCOVERY_URL}/${myIP}`,
264
- method: HTTP_METHODS.GET,
265
- addAuthHeader: false,
266
- headers: {
267
- [SPARK_USER_AGENT]: null,
268
- },
269
- });
270
- log.log(`Response trackingId: ${response?.headers?.trackingid}`, {
271
- file: CALLING_CLIENT_FILE,
272
- method: METHODS.GET_CLIENT_REGION_INFO,
273
- });
274
- const clientRegionInfo = response.body;
275
- regionInfo.clientRegion = clientRegionInfo?.clientRegion
276
- ? clientRegionInfo.clientRegion
277
- : '';
278
- regionInfo.countryCode = clientRegionInfo?.countryCode ? clientRegionInfo.countryCode : '';
279
- log.log(`Successfully fetched Client region info: ${regionInfo.clientRegion}, countryCode: ${regionInfo.countryCode}, and response trackingid: ${response?.headers?.trackingid}`, {
280
- file: CALLING_CLIENT_FILE,
281
- method: METHODS.GET_CLIENT_REGION_INFO,
282
- });
283
- this.metricManager.submitRegionInfoMetric(METRIC_EVENT.MOBIUS_DISCOVERY, MOBIUS_SERVER_ACTION.REGION_INFO, METRIC_TYPE.BEHAVIORAL, this.mobiusHost, clientRegionInfo.clientRegion, clientRegionInfo.countryCode, response?.headers?.trackingid ?? '');
284
- break;
285
- }
286
- catch (err) {
287
- log.error(`Failed to get client region info: ${JSON.stringify(err)}`, {
288
- method: METHODS.GET_CLIENT_REGION_INFO,
289
- file: CALLING_CLIENT_FILE,
290
- });
291
- abort = await handleCallingClientErrors(err, (clientError) => {
292
- this.metricManager.submitRegistrationMetric(METRIC_EVENT.REGISTRATION_ERROR, REG_ACTION.REGISTER, METRIC_TYPE.BEHAVIORAL, GET_MOBIUS_SERVERS_UTIL, 'UNKNOWN', err.headers?.trackingId ?? '', undefined, clientError);
293
- this.emit(CALLING_CLIENT_EVENT_KEYS.ERROR, clientError);
294
- }, { method: GET_MOBIUS_SERVERS_UTIL, file: CALLING_CLIENT_FILE });
295
- regionInfo.clientRegion = '';
296
- regionInfo.countryCode = '';
297
- if (abort) {
298
- await uploadLogs();
299
- return regionInfo;
300
- }
219
+ try {
220
+ const response = await this.webex.request({
221
+ uri: `${DISCOVERY_URL}`,
222
+ method: HTTP_METHODS.GET,
223
+ addAuthHeader: false,
224
+ headers: {
225
+ [SPARK_USER_AGENT]: null,
226
+ },
227
+ });
228
+ const clientRegionInfo = response.body;
229
+ regionInfo.clientRegion = clientRegionInfo?.clientRegion || '';
230
+ regionInfo.countryCode = clientRegionInfo?.countryCode || '';
231
+ log.log(`Successfully fetched Client region info: ${regionInfo.clientRegion}, countryCode: ${regionInfo.countryCode}, and response trackingid: ${response?.headers?.trackingid}`, {
232
+ file: CALLING_CLIENT_FILE,
233
+ method: METHODS.GET_CLIENT_REGION_INFO,
234
+ });
235
+ this.metricManager.submitRegionInfoMetric(METRIC_EVENT.MOBIUS_DISCOVERY, MOBIUS_SERVER_ACTION.REGION_INFO, METRIC_TYPE.BEHAVIORAL, this.mobiusHost, clientRegionInfo.clientRegion, clientRegionInfo.countryCode, response?.headers?.trackingid ?? '');
236
+ }
237
+ catch (err) {
238
+ log.error(`Failed to get client region info: ${JSON.stringify(err)}`, {
239
+ method: METHODS.GET_CLIENT_REGION_INFO,
240
+ file: CALLING_CLIENT_FILE,
241
+ });
242
+ abort = await handleCallingClientErrors(err, (clientError) => {
243
+ this.metricManager.submitRegistrationMetric(METRIC_EVENT.REGISTRATION_ERROR, REG_ACTION.REGISTER, METRIC_TYPE.BEHAVIORAL, GET_MOBIUS_SERVERS_UTIL, 'UNKNOWN', err.headers?.trackingId ?? '', undefined, clientError);
244
+ this.emit(CALLING_CLIENT_EVENT_KEYS.ERROR, clientError);
245
+ }, { method: GET_MOBIUS_SERVERS_UTIL, file: CALLING_CLIENT_FILE });
246
+ regionInfo.clientRegion = '';
247
+ regionInfo.countryCode = '';
248
+ if (abort) {
249
+ await uploadLogs();
250
+ return regionInfo;
301
251
  }
302
252
  }
303
253
  return regionInfo;
@@ -317,7 +267,9 @@ export class CallingClient extends Eventing {
317
267
  });
318
268
  clientRegion = this.sdkConfig?.discovery?.region;
319
269
  countryCode = this.sdkConfig?.discovery?.country;
320
- this.mobiusHost = this.webex.internal.services._serviceUrls.mobius;
270
+ this.mobiusHost =
271
+ this.webex.internal.services._serviceUrls?.mobius ||
272
+ this.webex.internal.services.get(this.webex.internal.services._activeServices.mobius);
321
273
  }
322
274
  else {
323
275
  log.log('Updating region and country through Region discovery', {
@@ -333,43 +285,53 @@ export class CallingClient extends Eventing {
333
285
  file: CALLING_CLIENT_FILE,
334
286
  method: GET_MOBIUS_SERVERS_UTIL,
335
287
  });
336
- try {
337
- const response = await this.webex.request({
338
- uri: `${this.mobiusHost}${URL_ENDPOINT}?regionCode=${clientRegion}&countryCode=${countryCode}`,
339
- method: HTTP_METHODS.GET,
340
- headers: {
341
- [CISCO_DEVICE_URL]: this.webex.internal.device.url,
342
- [SPARK_USER_AGENT]: CALLING_USER_AGENT,
343
- },
344
- service: ALLOWED_SERVICES.MOBIUS,
345
- });
346
- log.log(`Mobius Server found for the region. Response trackingId: ${response?.headers?.trackingid}`, {
347
- file: CALLING_CLIENT_FILE,
348
- method: GET_MOBIUS_SERVERS_UTIL,
349
- });
350
- const mobiusServers = response.body;
351
- this.metricManager.submitMobiusServersMetric(METRIC_EVENT.MOBIUS_DISCOVERY, MOBIUS_SERVER_ACTION.MOBIUS_SERVERS, METRIC_TYPE.BEHAVIORAL, mobiusServers, response?.headers?.trackingid ?? '');
352
- const mobiusUris = filterMobiusUris(mobiusServers, this.mobiusHost);
353
- this.primaryMobiusUris = mobiusUris.primary;
354
- this.backupMobiusUris = mobiusUris.backup;
355
- log.log(`Final list of Mobius Servers, primary: ${mobiusUris.primary} and backup: ${mobiusUris.backup}`, {
356
- file: CALLING_CLIENT_FILE,
357
- method: GET_MOBIUS_SERVERS_UTIL,
358
- });
359
- }
360
- catch (err) {
361
- log.error(`Failed to get Mobius servers: ${JSON.stringify(err)}`, {
362
- method: METHODS.GET_MOBIUS_SERVERS,
363
- file: CALLING_CLIENT_FILE,
364
- });
365
- const abort = await handleCallingClientErrors(err, (clientError) => {
366
- this.metricManager.submitRegistrationMetric(METRIC_EVENT.REGISTRATION_ERROR, REG_ACTION.REGISTER, METRIC_TYPE.BEHAVIORAL, GET_MOBIUS_SERVERS_UTIL, 'UNKNOWN', err.headers?.trackingId ?? '', undefined, clientError);
367
- this.emit(CALLING_CLIENT_EVENT_KEYS.ERROR, clientError);
368
- }, { method: GET_MOBIUS_SERVERS_UTIL, file: CALLING_CLIENT_FILE });
369
- if (abort) {
370
- await uploadLogs();
288
+ for (const mobius of this.mobiusClusters) {
289
+ if (mobius.host) {
290
+ this.mobiusHost = `https://${mobius.host}${API_V1}`;
291
+ }
292
+ else {
293
+ this.mobiusHost = mobius;
294
+ }
295
+ try {
296
+ const response = await this.webex.request({
297
+ uri: `${this.mobiusHost}${URL_ENDPOINT}?regionCode=${clientRegion}&countryCode=${countryCode}`,
298
+ method: HTTP_METHODS.GET,
299
+ headers: {
300
+ [CISCO_DEVICE_URL]: this.webex.internal.device.url,
301
+ [SPARK_USER_AGENT]: CALLING_USER_AGENT,
302
+ },
303
+ service: ALLOWED_SERVICES.MOBIUS,
304
+ });
305
+ log.log(`Mobius Server found for the region. Response trackingId: ${response?.headers?.trackingid}`, {
306
+ file: CALLING_CLIENT_FILE,
307
+ method: GET_MOBIUS_SERVERS_UTIL,
308
+ });
309
+ const mobiusServers = response.body;
310
+ this.metricManager.submitMobiusServersMetric(METRIC_EVENT.MOBIUS_DISCOVERY, MOBIUS_SERVER_ACTION.MOBIUS_SERVERS, METRIC_TYPE.BEHAVIORAL, mobiusServers, response?.headers?.trackingid ?? '');
311
+ const mobiusUris = filterMobiusUris(mobiusServers, this.mobiusHost);
312
+ this.primaryMobiusUris = mobiusUris.primary;
313
+ this.backupMobiusUris = mobiusUris.backup;
314
+ log.log(`Final list of Mobius Servers, primary: ${mobiusUris.primary} and backup: ${mobiusUris.backup}`, {
315
+ file: CALLING_CLIENT_FILE,
316
+ method: GET_MOBIUS_SERVERS_UTIL,
317
+ });
318
+ break;
319
+ }
320
+ catch (err) {
321
+ log.error(`Failed to get Mobius servers: ${JSON.stringify(err)}`, {
322
+ method: METHODS.GET_MOBIUS_SERVERS,
323
+ file: CALLING_CLIENT_FILE,
324
+ });
325
+ const abort = await handleCallingClientErrors(err, (clientError) => {
326
+ this.metricManager.submitRegistrationMetric(METRIC_EVENT.REGISTRATION_ERROR, REG_ACTION.REGISTER, METRIC_TYPE.BEHAVIORAL, GET_MOBIUS_SERVERS_UTIL, 'UNKNOWN', err.headers?.trackingId ?? '', undefined, clientError);
327
+ this.emit(CALLING_CLIENT_EVENT_KEYS.ERROR, clientError);
328
+ }, { method: GET_MOBIUS_SERVERS_UTIL, file: CALLING_CLIENT_FILE });
329
+ if (abort) {
330
+ useDefault = true;
331
+ await uploadLogs();
332
+ break;
333
+ }
371
334
  }
372
- useDefault = true;
373
335
  }
374
336
  }
375
337
  else {
@@ -7,7 +7,7 @@ import { ERROR_LAYER, ERROR_TYPE } from '../../Errors/types';
7
7
  import { handleCallErrors, modifySdpForIPv4, parseMediaQualityStatistics, serviceErrorCodeHandler, uploadLogs, } from '../../common/Utils';
8
8
  import { ALLOWED_SERVICES, CallDirection, HTTP_METHODS, } from '../../common/types';
9
9
  import { createCallError } from '../../Errors/catalog/CallError';
10
- import { CALL_ENDPOINT_RESOURCE, CALL_FILE, CALL_HOLD_SERVICE, CALL_STATUS_RESOURCE, CALL_TRANSFER_SERVICE, CALLING_USER_AGENT, CALLS_ENDPOINT_RESOURCE, CISCO_DEVICE_URL, DEFAULT_LOCAL_CALL_ID, DEFAULT_SESSION_TIMER, DEVICES_ENDPOINT_RESOURCE, HOLD_ENDPOINT, ICE_CANDIDATES_TIMEOUT, INITIAL_SEQ_NUMBER, MEDIA_ENDPOINT_RESOURCE, METHODS, NOISE_REDUCTION_EFFECT, RESUME_ENDPOINT, SPARK_USER_AGENT, SUPPLEMENTARY_SERVICES_TIMEOUT, TRANSFER_ENDPOINT, } from '../constants';
10
+ import { CALL_ENDPOINT_RESOURCE, CALL_FILE, CALL_HOLD_SERVICE, CALL_STATUS_RESOURCE, CALL_TRANSFER_SERVICE, CALLING_USER_AGENT, CALLS_ENDPOINT_RESOURCE, CISCO_DEVICE_URL, DEFAULT_LOCAL_CALL_ID, DEFAULT_SESSION_TIMER, DEVICES_ENDPOINT_RESOURCE, HOLD_ENDPOINT, ICE_CANDIDATES_TIMEOUT, INITIAL_SEQ_NUMBER, MAX_CALL_KEEPALIVE_RETRY_COUNT, MEDIA_ENDPOINT_RESOURCE, METHODS, NOISE_REDUCTION_EFFECT, RESUME_ENDPOINT, SPARK_USER_AGENT, SUPPLEMENTARY_SERVICES_TIMEOUT, TRANSFER_ENDPOINT, } from '../constants';
11
11
  import SDKConnector from '../../SDKConnector';
12
12
  import { Eventing } from '../../Events/impl';
13
13
  import { CALL_EVENT_KEYS, MEDIA_CONNECTION_EVENT_KEYS, MOBIUS_MIDCALL_STATE, SUPPLEMENTARY_SERVICES, } from '../../Events/types';
@@ -51,6 +51,8 @@ export class Call extends Eventing {
51
51
  receivedRoapOKSeq;
52
52
  localAudioStream;
53
53
  rtcMetrics;
54
+ callKeepaliveRetryCount = 0;
55
+ callKeepaliveInterval;
54
56
  isMuted() {
55
57
  return this.muted;
56
58
  }
@@ -881,20 +883,21 @@ export class Call extends Eventing {
881
883
  async handleIncomingCallDisconnect(event) {
882
884
  log.info(`${METHOD_START_MESSAGE} with: ${this.getCorrelationId()}`, {
883
885
  file: CALL_FILE,
884
- method: METHODS.HANDLE_OUTGOING_CALL_DISCONNECT,
886
+ method: METHODS.HANDLE_INCOMING_CALL_DISCONNECT,
885
887
  });
888
+ this.emit(CALL_EVENT_KEYS.DISCONNECT, this.correlationId);
886
889
  this.setDisconnectReason();
887
890
  try {
888
891
  const response = await this.delete();
889
892
  log.log(`Response code: ${response.statusCode}`, {
890
893
  file: CALL_FILE,
891
- method: METHODS.HANDLE_OUTGOING_CALL_DISCONNECT,
894
+ method: METHODS.HANDLE_INCOMING_CALL_DISCONNECT,
892
895
  });
893
896
  }
894
897
  catch (e) {
895
898
  log.warn(`Failed to delete the call: ${JSON.stringify(e)}`, {
896
899
  file: CALL_FILE,
897
- method: METHODS.HANDLE_OUTGOING_CALL_DISCONNECT,
900
+ method: METHODS.HANDLE_INCOMING_CALL_DISCONNECT,
898
901
  });
899
902
  uploadLogs({
900
903
  correlationId: this.correlationId,
@@ -916,7 +919,6 @@ export class Call extends Eventing {
916
919
  }
917
920
  this.sendMediaStateMachineEvt({ type: 'E_ROAP_TEARDOWN' });
918
921
  this.sendCallStateMachineEvt({ type: 'E_CALL_CLEARED' });
919
- this.emit(CALL_EVENT_KEYS.DISCONNECT, this.correlationId);
920
922
  }
921
923
  async handleOutgoingCallDisconnect(event) {
922
924
  log.info(`${METHOD_START_MESSAGE} with: ${this.getCorrelationId()}`, {
@@ -962,49 +964,59 @@ export class Call extends Eventing {
962
964
  this.sendCallStateMachineEvt({ type: 'E_CALL_CLEARED' });
963
965
  }
964
966
  handleCallEstablished(event) {
965
- log.info(`${METHOD_START_MESSAGE} with: ${this.getCorrelationId()}`, {
967
+ const loggerContext = {
966
968
  file: CALL_FILE,
967
969
  method: METHODS.HANDLE_CALL_ESTABLISHED,
968
- });
970
+ };
971
+ log.info(`${METHOD_START_MESSAGE} with: ${this.getCorrelationId()}`, loggerContext);
969
972
  this.emit(CALL_EVENT_KEYS.ESTABLISHED, this.correlationId);
970
973
  this.earlyMedia = false;
971
974
  this.connected = true;
972
975
  if (this.sessionTimer) {
973
- log.log('Resetting session timer', {
974
- file: CALL_FILE,
975
- method: METHODS.HANDLE_CALL_ESTABLISHED,
976
- });
976
+ log.log('Resetting session timer', loggerContext);
977
977
  clearInterval(this.sessionTimer);
978
978
  }
979
979
  this.sessionTimer = setInterval(async () => {
980
980
  try {
981
981
  const res = await this.postStatus();
982
- log.info(`Session refresh successful`, {
983
- file: CALL_FILE,
984
- method: METHODS.HANDLE_CALL_ESTABLISHED,
985
- });
982
+ this.callKeepaliveRetryCount = 0;
983
+ this.callKeepaliveInterval = undefined;
984
+ log.info(`Session refresh successful`, loggerContext);
986
985
  }
987
986
  catch (err) {
988
987
  const error = err;
989
988
  if (this.sessionTimer) {
990
989
  clearInterval(this.sessionTimer);
991
990
  }
992
- handleCallErrors((callError) => {
991
+ const abort = await handleCallErrors((callError) => {
993
992
  this.emit(CALL_EVENT_KEYS.CALL_ERROR, callError);
994
993
  this.submitCallErrorMetric(callError);
995
994
  }, ERROR_LAYER.CALL_CONTROL, (interval) => {
996
- setTimeout(() => {
997
- this.postStatus();
998
- this.sendCallStateMachineEvt({ type: 'E_CALL_ESTABLISHED' });
999
- }, interval * 1000);
1000
- }, this.getCorrelationId(), error, this.handleCallEstablished.name, CALL_FILE);
995
+ this.callKeepaliveRetryCount += 1;
996
+ this.callKeepaliveInterval = interval * 1000;
997
+ if (this.callKeepaliveRetryCount === MAX_CALL_KEEPALIVE_RETRY_COUNT) {
998
+ this.callKeepaliveRetryCount = 0;
999
+ clearInterval(this.sessionTimer);
1000
+ this.sessionTimer = undefined;
1001
+ this.callKeepaliveInterval = undefined;
1002
+ log.warn(`Max call keepalive retry attempts reached for call: ${this.getCorrelationId()}`, loggerContext);
1003
+ return;
1004
+ }
1005
+ this.sendCallStateMachineEvt({ type: 'E_CALL_ESTABLISHED' });
1006
+ }, this.getCorrelationId(), error, 'handleCallEstablished', CALL_FILE);
1007
+ if (abort) {
1008
+ this.sendCallStateMachineEvt({ type: 'E_SEND_CALL_DISCONNECT' });
1009
+ this.emit(CALL_EVENT_KEYS.DISCONNECT, this.getCorrelationId());
1010
+ this.callKeepaliveRetryCount = 0;
1011
+ this.callKeepaliveInterval = undefined;
1012
+ }
1001
1013
  await uploadLogs({
1002
1014
  correlationId: this.correlationId,
1003
1015
  callId: this.callId,
1004
1016
  broadworksCorrelationInfo: this.broadworksCorrelationInfo,
1005
1017
  });
1006
1018
  }
1007
- }, DEFAULT_SESSION_TIMER);
1019
+ }, this.callKeepaliveInterval || DEFAULT_SESSION_TIMER);
1008
1020
  }
1009
1021
  async handleUnknownState(event) {
1010
1022
  log.info(`${METHOD_START_MESSAGE} with: ${this.getCorrelationId()}`, {
@@ -1159,7 +1171,7 @@ export class Call extends Eventing {
1159
1171
  method: METHODS.HANDLE_ROAP_ERROR,
1160
1172
  });
1161
1173
  const message = event.data;
1162
- if (message) {
1174
+ if (message && message.messageType === 'ERROR') {
1163
1175
  try {
1164
1176
  const res = await this.postMedia(message);
1165
1177
  log.info(`Response code: ${res.statusCode}`, {
@@ -12,6 +12,7 @@ export const DEFAULT_LOCAL_CALL_ID = 'DefaultLocalId';
12
12
  export const DEFAULT_REHOMING_INTERVAL_MAX = 120;
13
13
  export const DEFAULT_REHOMING_INTERVAL_MIN = 60;
14
14
  export const DEFAULT_SESSION_TIMER = 1000 * 60 * 10;
15
+ export const MAX_CALL_KEEPALIVE_RETRY_COUNT = 4;
15
16
  export const DEVICES_ENDPOINT_RESOURCE = 'devices';
16
17
  export const DISCOVERY_URL = 'https://ds.ciscospark.com/v1/region';
17
18
  export const DUMMY_METRICS = {
@@ -12,6 +12,7 @@ export class ContactsClient {
12
12
  groups;
13
13
  contacts;
14
14
  defaultGroupId;
15
+ contactsServiceUrl;
15
16
  constructor(webex, logger) {
16
17
  this.sdkConnector = SDKConnector;
17
18
  if (!this.sdkConnector.getWebex()) {
@@ -22,6 +23,9 @@ export class ContactsClient {
22
23
  this.groups = undefined;
23
24
  this.contacts = undefined;
24
25
  this.defaultGroupId = '';
26
+ this.contactsServiceUrl =
27
+ this.webex.internal.services._serviceUrls?.contactsService ||
28
+ this.webex.internal.services.get(this.webex.internal.services._activeServices.contactsService);
25
29
  log.setLogger(logger.level, CONTACTS_CLIENT);
26
30
  }
27
31
  async decryptContactDetail(encryptionKeyUrl, contactDetails) {
@@ -195,7 +199,7 @@ export class ContactsClient {
195
199
  const cloudContactsMap = {};
196
200
  try {
197
201
  const response = await this.webex.request({
198
- uri: `${this.webex.internal.services._serviceUrls.contactsService}/${ENCRYPT_FILTER}/${USERS}/${CONTACT_FILTER}`,
202
+ uri: `${this.contactsServiceUrl}/${ENCRYPT_FILTER}/${USERS}/${CONTACT_FILTER}`,
199
203
  method: HTTP_METHODS.GET,
200
204
  });
201
205
  log.log(`Response code: ${response.statusCode} and Response trackingId: ${response?.headers?.trackingid}`, loggerContext);
@@ -372,7 +376,7 @@ export class ContactsClient {
372
376
  };
373
377
  try {
374
378
  const response = await this.webex.request({
375
- uri: `${this.webex.internal.services._serviceUrls.contactsService}/${ENCRYPT_FILTER}/${USERS}/${GROUP_FILTER}`,
379
+ uri: `${this.contactsServiceUrl}/${ENCRYPT_FILTER}/${USERS}/${GROUP_FILTER}`,
376
380
  method: HTTP_METHODS.POST,
377
381
  body: groupInfo,
378
382
  });
@@ -407,7 +411,7 @@ export class ContactsClient {
407
411
  try {
408
412
  log.info(`Deleting contact group: ${groupId}`, loggerContext);
409
413
  const response = await this.webex.request({
410
- uri: `${this.webex.internal.services._serviceUrls.contactsService}/${ENCRYPT_FILTER}/${USERS}/${GROUP_FILTER}/${groupId}`,
414
+ uri: `${this.contactsServiceUrl}/${ENCRYPT_FILTER}/${USERS}/${GROUP_FILTER}/${groupId}`,
411
415
  method: HTTP_METHODS.DELETE,
412
416
  });
413
417
  log.log(`Response trackingId: ${response?.headers?.trackingid}`, loggerContext);
@@ -481,7 +485,7 @@ export class ContactsClient {
481
485
  }
482
486
  }
483
487
  const response = await this.webex.request({
484
- uri: `${this.webex.internal.services._serviceUrls.contactsService}/${ENCRYPT_FILTER}/${USERS}/${CONTACT_FILTER}`,
488
+ uri: `${this.contactsServiceUrl}/${ENCRYPT_FILTER}/${USERS}/${CONTACT_FILTER}`,
485
489
  method: HTTP_METHODS.POST,
486
490
  body: requestBody,
487
491
  });
@@ -526,7 +530,7 @@ export class ContactsClient {
526
530
  try {
527
531
  log.info(`Deleting contact : ${contactId}`, loggerContext);
528
532
  const response = await this.webex.request({
529
- uri: `${this.webex.internal.services._serviceUrls.contactsService}/${ENCRYPT_FILTER}/${USERS}/${CONTACT_FILTER}/${contactId}`,
533
+ uri: `${this.contactsServiceUrl}/${ENCRYPT_FILTER}/${USERS}/${CONTACT_FILTER}/${contactId}`,
530
534
  method: HTTP_METHODS.DELETE,
531
535
  });
532
536
  const contactResponse = {
@@ -1,11 +1,10 @@
1
1
  import EventEmitter from 'events';
2
- import { stringify } from 'flatted';
3
2
  import Logger from '../../Logger';
4
3
  import { LOG_PREFIX } from '../../Logger/types';
5
4
  export class Eventing extends EventEmitter {
6
5
  emit(event, ...args) {
7
6
  const timestamp = new Date().toUTCString();
8
- Logger.info(`${timestamp} ${LOG_PREFIX.EVENT}: ${event.toString()} - event emitted with parameters -> ${stringify(args)}`, {
7
+ Logger.info(`${timestamp} ${LOG_PREFIX.EVENT}: ${event.toString()} - event emitted with parameters -> ${args}`, {
9
8
  file: 'Events/impl/index.ts',
10
9
  method: 'emit',
11
10
  });
@@ -67,9 +67,11 @@ export class BroadworksBackendConnector {
67
67
  method: METHODS.GET_BW_TOKEN,
68
68
  };
69
69
  log.info(METHOD_START_MESSAGE, loggerContext);
70
+ const broadworksIdpProxyUrl = this.webex.internal.services._serviceUrls?.broadworksIdpProxy ||
71
+ this.webex.internal.services.get(this.webex.internal.services._activeServices.broadworksIdpProxy);
70
72
  try {
71
73
  const bwTokenResponse = await this.webex.request({
72
- uri: `${this.webex.internal.services._serviceUrls.broadworksIdpProxy}${BW_TOKEN_FETCH_ENDPOINT}`,
74
+ uri: `${broadworksIdpProxyUrl}${BW_TOKEN_FETCH_ENDPOINT}`,
73
75
  method: HTTP_METHODS.GET,
74
76
  });
75
77
  const response = bwTokenResponse.body;
@@ -140,7 +140,8 @@ export class UcmBackendConnector {
140
140
  log.info(`${METHOD_START_MESSAGE} with Message ID: ${messageId}`, loggerContext);
141
141
  return new Promise((resolve, reject) => {
142
142
  const voicemailContentUrl = `${this.vgVoiceMessageURI}${VOICEMAILS}/${messageId}/${CONTENT}`;
143
- const mercuryApi = `${this.webex.internal.services._serviceUrls.mercuryApi}`;
143
+ const mercuryApi = this.webex.internal.services._serviceUrls?.mercuryApi ||
144
+ this.webex.internal.services.get(this.webex.internal.services._activeServices.mercuryApi);
144
145
  this.returnUcmPromise(voicemailContentUrl, mercuryApi)
145
146
  .then((response) => {
146
147
  if (response.statusCode === 200) {
@@ -7,7 +7,7 @@ import { DEVICE_ERROR_CODE, ERROR_CODE, ERROR_TYPE, CALL_ERROR_CODE, } from '../
7
7
  import { CALLING_BACKEND, HTTP_METHODS, RegistrationStatus, SORT, ServiceIndicator, } from './types';
8
8
  import log from '../Logger';
9
9
  import { createClientError } from '../Errors/catalog/CallingDeviceError';
10
- import { BYTES_RECEIVED, BYTES_SENT, CALLING_USER_AGENT, CISCO_DEVICE_URL, CODEC_ID, DUMMY_METRICS, INBOUND_CODEC_MATCH, INBOUND_RTP, JITTER_BUFFER_DELAY, JITTER_BUFFER_EMITTED_COUNT, LOCAL_CANDIDATE_ID, MEDIA_ID, MEDIA_SOURCE, MIME_TYPE, NETWORK_TYPE, OUTBOUND_CODEC_MATCH, OUTBOUND_RTP, PACKETS_DISCARDED, PACKETS_LOST, PACKETS_RECEIVED, PACKETS_SENT, REMOTE_INBOUND_RTP, ROUND_TRIP_TIME_MEASUREMENTS, RTC_CODEC, RTC_ICE_CANDIDATE, RTC_ICE_CANDIDATE_PAIR, RTP_RX_STAT, RTP_TX_STAT, SELECTED_CANDIDATE_PAIR_ID, SPARK_USER_AGENT, TARGET_BIT_RATE, TIMESTAMP, TOTAL_ROUND_TRIP_TIME, TOTAL_SAMPLES_DURATION, TRANSPORT, TYPE, URL_ENDPOINT, UTILS_FILE, } from '../CallingClient/constants';
10
+ import { BYTES_RECEIVED, BYTES_SENT, CALLING_USER_AGENT, CISCO_DEVICE_URL, CODEC_ID, DUMMY_METRICS, INBOUND_CODEC_MATCH, INBOUND_RTP, JITTER_BUFFER_DELAY, JITTER_BUFFER_EMITTED_COUNT, LOCAL_CANDIDATE_ID, MEDIA_ID, MEDIA_SOURCE, MIME_TYPE, NETWORK_TYPE, OUTBOUND_CODEC_MATCH, OUTBOUND_RTP, PACKETS_DISCARDED, PACKETS_LOST, PACKETS_RECEIVED, PACKETS_SENT, REMOTE_INBOUND_RTP, ROUND_TRIP_TIME_MEASUREMENTS, RTC_CODEC, RTC_ICE_CANDIDATE, RTC_ICE_CANDIDATE_PAIR, RTP_RX_STAT, RTP_TX_STAT, SELECTED_CANDIDATE_PAIR_ID, SPARK_USER_AGENT, TARGET_BIT_RATE, TIMESTAMP, TOTAL_ROUND_TRIP_TIME, TOTAL_SAMPLES_DURATION, TRANSPORT, TYPE, URL_ENDPOINT, UTILS_FILE, METHODS, DEFAULT_KEEPALIVE_INTERVAL, } from '../CallingClient/constants';
11
11
  import { DEVICES, ITEMS, SETTINGS, VALUES, KEY, TIME, PLACEHOLDER_KEY, XSI_ACTION_ENDPOINT_ORG_URL_PARAM, XSI_ACTION_ENDPOINT, INFER_ID_CONSTANT, BW_XSI_URL, ENTITLEMENT_BASIC, ENTITLEMENT_BROADWORKS_CONN, ENTITLEMENT_STANDARD, NATIVE_WEBEX_TEAMS_CALLING, NATIVE_SIP_CALL_TO_UCM, BW_XSI_ENDPOINT_VERSION, IDENTITY_ENDPOINT_RESOURCE, SCIM_ENDPOINT_RESOURCE, SCIM_USER_FILTER, WEBEX_API_PROD, WEBEX_API_BTS, BW_XSI_ENDPOINT_VERSION_WITH_SLASH, } from './constants';
12
12
  import SDKConnector from '../SDKConnector';
13
13
  import { createLineError } from '../Errors/catalog/LineError';
@@ -210,6 +210,7 @@ export async function handleCallingClientErrors(err, emitterCb, loggerContext) {
210
210
  return finalError;
211
211
  }
212
212
  export async function handleCallErrors(emitterCb, errorLayer, retryCb, correlationId, err, caller, file) {
213
+ let abort = false;
213
214
  const loggerContext = {
214
215
  file,
215
216
  method: caller,
@@ -217,14 +218,24 @@ export async function handleCallErrors(emitterCb, errorLayer, retryCb, correlati
217
218
  const callError = createCallError('', loggerContext, ERROR_TYPE.DEFAULT, '', errorLayer);
218
219
  const errorCode = Number(err.statusCode);
219
220
  log.warn(`Status code: ->${errorCode}`, loggerContext);
221
+ const isKeepalive = caller === METHODS.HANDLE_CALL_ESTABLISHED;
220
222
  switch (errorCode) {
221
223
  case ERROR_CODE.UNAUTHORIZED: {
222
224
  log.warn(`401 Unauthorized`, loggerContext);
223
225
  updateCallErrorContext(loggerContext, ERROR_TYPE.TOKEN_ERROR, 'User is unauthorized due to an expired token. Sign out, then sign back in.', correlationId, callError);
224
226
  emitterCb(callError);
227
+ if (isKeepalive) {
228
+ abort = true;
229
+ }
225
230
  break;
226
231
  }
227
232
  case ERROR_CODE.FORBIDDEN:
233
+ if (isKeepalive) {
234
+ abort = true;
235
+ updateCallErrorContext(loggerContext, ERROR_TYPE.FORBIDDEN_ERROR, 'An unauthorized action has been received. This action has been blocked. Please contact the administrator if this persists.', correlationId, callError);
236
+ emitterCb(callError);
237
+ break;
238
+ }
228
239
  case ERROR_CODE.SERVICE_UNAVAILABLE: {
229
240
  const errorBody = err.body;
230
241
  if (!errorBody) {
@@ -233,13 +244,16 @@ export async function handleCallErrors(emitterCb, errorLayer, retryCb, correlati
233
244
  ? 'An unauthorized action has been received. This action has been blocked. Please contact the administrator if this persists.'
234
245
  : 'An error occurred on the server while processing the request. Wait a moment and try again.', correlationId, callError);
235
246
  emitterCb(callError);
236
- return;
247
+ return abort;
237
248
  }
238
249
  if (err.headers && 'retry-after' in err.headers && retryCb) {
239
250
  const retryInterval = Number(err.headers['retry-after']);
240
251
  log.warn(`Retry Interval received: ${retryInterval}`, loggerContext);
241
252
  retryCb(retryInterval);
242
- return;
253
+ return abort;
254
+ }
255
+ if (isKeepalive) {
256
+ retryCb(DEFAULT_KEEPALIVE_INTERVAL);
243
257
  }
244
258
  const code = Number(errorBody.errorCode);
245
259
  let message;
@@ -299,18 +313,28 @@ export async function handleCallErrors(emitterCb, errorLayer, retryCb, correlati
299
313
  log.warn(`404 Call Not Found`, loggerContext);
300
314
  updateCallErrorContext(loggerContext, ERROR_TYPE.NOT_FOUND, 'Call is no longer active. Wait a moment and try again.', correlationId, callError);
301
315
  emitterCb(callError);
316
+ if (isKeepalive) {
317
+ abort = true;
318
+ }
302
319
  break;
303
320
  }
304
321
  case ERROR_CODE.INTERNAL_SERVER_ERROR: {
305
322
  log.warn(`500 Internal Server Error`, loggerContext);
306
323
  updateCallErrorContext(loggerContext, ERROR_TYPE.SERVER_ERROR, 'An unknown error occurred in the call. Wait a moment and try again.', correlationId, callError);
307
324
  emitterCb(callError);
325
+ if (isKeepalive && retryCb) {
326
+ const retryInterval = err.headers && 'retry-after' in err.headers
327
+ ? Number(err.headers['retry-after'])
328
+ : DEFAULT_KEEPALIVE_INTERVAL;
329
+ retryCb(retryInterval);
330
+ }
308
331
  break;
309
332
  }
310
333
  default: {
311
334
  log.warn(`Unknown Error`, loggerContext);
312
335
  }
313
336
  }
337
+ return abort;
314
338
  }
315
339
  export async function serviceErrorCodeHandler(err, loggerContext) {
316
340
  const errorCode = Number(err.statusCode);
@@ -63,6 +63,7 @@ export function getTestUtilsWebex() {
63
63
  contactsService: 'https://contacts-service-a.wbx2.com/contact/api/v1',
64
64
  },
65
65
  fetchClientRegionInfo: jest.fn(),
66
+ getMobiusClusters: jest.fn(),
66
67
  },
67
68
  },
68
69
  logger: {
@@ -1 +1 @@
1
- {"version":3,"file":"CallHistory.d.ts","sourceRoot":"","sources":["../../../src/CallHistory/CallHistory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAIL,IAAI,EACJ,OAAO,EAER,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EAEzB,gCAAgC,EACjC,MAAM,SAAS,CAAC;AAoCjB,OAAO,EAEL,qBAAqB,EACrB,gBAAgB,EAGhB,gBAAgB,EAChB,sBAAsB,EAGtB,uBAAuB,EACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAWxC,qBAAa,WAAY,SAAQ,QAAQ,CAAC,qBAAqB,CAAE,YAAW,YAAY;IACtF,OAAO,CAAC,YAAY,CAAgB;IAEpC,OAAO,CAAC,KAAK,CAAW;IAExB,OAAO,CAAC,QAAQ,CAAM;IAEtB,OAAO,CAAC,QAAQ,CAAM;IAEtB,OAAO,CAAC,aAAa,CAGnB;IAEF,OAAO,CAAC,YAAY,CAA4B;gBAKpC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe;IAmBvC,kBAAkB,CAC7B,IAAI,GAAE,MAAuB,EAC7B,KAAK,GAAE,MAAc,EACrB,IAAI,GAAE,IAAmB,EACzB,MAAM,GAAE,OAAyB,GAChC,OAAO,CAAC,kBAAkB,CAAC;IAoHjB,iBAAiB,CAC5B,iBAAiB,EAAE,gBAAgB,EAAE,GACpC,OAAO,CAAC,yBAAyB,CAAC;YAqEvB,iBAAiB;IAiDlB,wBAAwB,CACnC,gBAAgB,EAAE,gBAAgB,EAAE,GACnC,OAAO,CAAC,gCAAgC,CAAC;IA2F5C,mBAAmB,WAAkB,gBAAgB,mBAInD;IAEF,2BAA2B,WAAkB,sBAAsB,mBAOjE;IAEF,+BAA+B,WAAkB,uBAAuB,mBAOtE;IAKF,OAAO,CAAC,wBAAwB;CAkBjC;AAOD,eAAO,MAAM,uBAAuB,UAAW,QAAQ,UAAU,eAAe,KAAG,YACnD,CAAC"}
1
+ {"version":3,"file":"CallHistory.d.ts","sourceRoot":"","sources":["../../../src/CallHistory/CallHistory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAIL,IAAI,EACJ,OAAO,EAER,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EAEzB,gCAAgC,EACjC,MAAM,SAAS,CAAC;AAoCjB,OAAO,EAEL,qBAAqB,EACrB,gBAAgB,EAGhB,gBAAgB,EAChB,sBAAsB,EAGtB,uBAAuB,EACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAWxC,qBAAa,WAAY,SAAQ,QAAQ,CAAC,qBAAqB,CAAE,YAAW,YAAY;IACtF,OAAO,CAAC,YAAY,CAAgB;IAEpC,OAAO,CAAC,KAAK,CAAW;IAExB,OAAO,CAAC,QAAQ,CAAM;IAEtB,OAAO,CAAC,QAAQ,CAAM;IAEtB,OAAO,CAAC,aAAa,CAGnB;IAEF,OAAO,CAAC,YAAY,CAA4B;gBAKpC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe;IAqBvC,kBAAkB,CAC7B,IAAI,GAAE,MAAuB,EAC7B,KAAK,GAAE,MAAc,EACrB,IAAI,GAAE,IAAmB,EACzB,MAAM,GAAE,OAAyB,GAChC,OAAO,CAAC,kBAAkB,CAAC;IA6HjB,iBAAiB,CAC5B,iBAAiB,EAAE,gBAAgB,EAAE,GACpC,OAAO,CAAC,yBAAyB,CAAC;YAqEvB,iBAAiB;IAiDlB,wBAAwB,CACnC,gBAAgB,EAAE,gBAAgB,EAAE,GACnC,OAAO,CAAC,gCAAgC,CAAC;IA2F5C,mBAAmB,WAAkB,gBAAgB,mBAInD;IAEF,2BAA2B,WAAkB,sBAAsB,mBAOjE;IAEF,+BAA+B,WAAkB,uBAAuB,mBAOtE;IAKF,OAAO,CAAC,wBAAwB;CAkBjC;AAOD,eAAO,MAAM,uBAAuB,UAAW,QAAQ,UAAU,eAAe,KAAG,YACnD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"WxCallBackendConnector.d.ts","sourceRoot":"","sources":["../../../src/CallSettings/WxCallBackendConnector.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EACL,eAAe,EAEf,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EAExB,MAAM,SAAS,CAAC;AAiCjB,qBAAa,sBAAuB,YAAW,uBAAuB;IACpE,OAAO,CAAC,YAAY,CAAgB;IAEpC,OAAO,CAAC,KAAK,CAAW;IAExB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,WAAW,CAAU;IAE7B,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,SAAS,CAAe;gBAEpB,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe;IAoBvC,qBAAqB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAsErD,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA6CtD,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkDtE,qBAAqB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA0CrD,qBAAqB,CAChC,qBAAqB,EAAE,kBAAkB,GACxC,OAAO,CAAC,mBAAmB,CAAC;IA0ClB,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA0CnD,mBAAmB,CAC9B,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,mBAAmB,CAAC;IA4ClB,2BAA2B,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAuEzE"}
1
+ {"version":3,"file":"WxCallBackendConnector.d.ts","sourceRoot":"","sources":["../../../src/CallSettings/WxCallBackendConnector.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EACL,eAAe,EAEf,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EAExB,MAAM,SAAS,CAAC;AAiCjB,qBAAa,sBAAuB,YAAW,uBAAuB;IACpE,OAAO,CAAC,YAAY,CAAgB;IAEpC,OAAO,CAAC,KAAK,CAAW;IAExB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,WAAW,CAAU;IAE7B,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,SAAS,CAAe;gBAEpB,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe;IAsBvC,qBAAqB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAsErD,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA6CtD,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkDtE,qBAAqB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA0CrD,qBAAqB,CAChC,qBAAqB,EAAE,kBAAkB,GACxC,OAAO,CAAC,mBAAmB,CAAC;IA0ClB,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA0CnD,mBAAmB,CAC9B,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,mBAAmB,CAAC;IA4ClB,2BAA2B,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAuEzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"CallingClient.d.ts","sourceRoot":"","sources":["../../../src/CallingClient/CallingClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,4BAA4B,CAAC;AASpD,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAmB,aAAa,EAAe,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACxC,OAAO,EACL,uBAAuB,EAKxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EASL,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAC,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAC,KAAK,EAAe,MAAM,iBAAiB,CAAC;AAsBpD,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAuBnC,qBAAa,aAAc,SAAQ,QAAQ,CAAC,uBAAuB,CAAE,YAAW,cAAc;IAC5F,OAAO,CAAC,YAAY,CAAgB;IAEpC,OAAO,CAAC,KAAK,CAAW;IAExB,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,WAAW,CAAe;IAElC,OAAO,CAAC,aAAa,CAAiB;IAEtC,OAAO,CAAC,SAAS,CAAC,CAAsB;IAExC,OAAO,CAAC,iBAAiB,CAAW;IAEpC,OAAO,CAAC,gBAAgB,CAAW;IAEnC,OAAO,CAAC,cAAc,CAAgB;IAEtC,OAAO,CAAC,UAAU,CAAS;IAEpB,WAAW,EAAE,OAAO,KAAK,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAA6B;IAE7C,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,oBAAoB,CAAM;IAElC,OAAO,CAAC,kBAAkB,CAAM;IAEhC,OAAO,CAAC,oBAAoB,CAAM;IAElC,OAAO,CAAC,kBAAkB,CAAM;gBAKpB,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,mBAAmB;IAsF5C,IAAI;YAoCH,wBAAwB;YA2BxB,eAAe;IAwB7B,OAAO,CAAC,oBAAoB,CAY1B;IAGF,OAAO,CAAC,mBAAmB,CAMzB;IAEF,OAAO,CAAC,oBAAoB,CAa1B;IAEF,OAAO,CAAC,mBAAmB,CA6CzB;IAEF,OAAO,CAAC,0BAA0B;YAmBpB,mBAAmB;YAwHnB,gBAAgB;IAqJ9B,OAAO,CAAC,4BAA4B;IAgBpC,OAAO,CAAC,mBAAmB,CAoBzB;IAMK,eAAe,IAAI,MAAM;IAQzB,eAAe,IAAI,aAAa;IAIvC,OAAO,CAAC,wBAAwB;YAgClB,UAAU;IAuBjB,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAOjC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAiBzC,gBAAgB,IAAI,KAAK,GAAG,SAAS;IAuB/B,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;CAQvD;AAOD,eAAO,MAAM,YAAY,UAChB,QAAQ,WACN,mBAAmB,KAC3B,QAAQ,cAAc,CAKxB,CAAC"}
1
+ {"version":3,"file":"CallingClient.d.ts","sourceRoot":"","sources":["../../../src/CallingClient/CallingClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,4BAA4B,CAAC;AASpD,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAmB,aAAa,EAAe,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACxC,OAAO,EACL,uBAAuB,EAKxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAQL,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAC,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAC,KAAK,EAAe,MAAM,iBAAiB,CAAC;AAiBpD,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAuBnC,qBAAa,aAAc,SAAQ,QAAQ,CAAC,uBAAuB,CAAE,YAAW,cAAc;IAC5F,OAAO,CAAC,YAAY,CAAgB;IAEpC,OAAO,CAAC,KAAK,CAAW;IAExB,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,WAAW,CAAe;IAElC,OAAO,CAAC,aAAa,CAAiB;IAEtC,OAAO,CAAC,SAAS,CAAC,CAAsB;IAExC,OAAO,CAAC,iBAAiB,CAAW;IAEpC,OAAO,CAAC,gBAAgB,CAAW;IAEnC,OAAO,CAAC,cAAc,CAAgB;IAEtC,OAAO,CAAC,UAAU,CAAS;IAEpB,WAAW,EAAE,OAAO,KAAK,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAA6B;IAE7C,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,oBAAoB,CAAM;IAElC,OAAO,CAAC,kBAAkB,CAAM;IAEhC,OAAO,CAAC,oBAAoB,CAAM;IAElC,OAAO,CAAC,kBAAkB,CAAM;gBAKpB,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,mBAAmB;IA6D5C,IAAI;YAoCH,wBAAwB;YA2BxB,eAAe;IAwB7B,OAAO,CAAC,oBAAoB,CAY1B;IAGF,OAAO,CAAC,mBAAmB,CAMzB;IAEF,OAAO,CAAC,oBAAoB,CAa1B;IAEF,OAAO,CAAC,mBAAmB,CA6CzB;IAEF,OAAO,CAAC,0BAA0B;YAmBpB,mBAAmB;YAkFnB,gBAAgB;IAiK9B,OAAO,CAAC,4BAA4B;IAgBpC,OAAO,CAAC,mBAAmB,CAoBzB;IAMK,eAAe,IAAI,MAAM;IAQzB,eAAe,IAAI,aAAa;IAIvC,OAAO,CAAC,wBAAwB;YAgClB,UAAU;IAuBjB,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAOjC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAiBzC,gBAAgB,IAAI,KAAK,GAAG,SAAS;IAuB/B,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;CAQvD;AAOD,eAAO,MAAM,YAAY,UAChB,QAAQ,WACN,mBAAmB,KAC3B,QAAQ,cAAc,CAKxB,CAAC"}
@@ -38,6 +38,8 @@ export declare class Call extends Eventing<CallEventTypes> implements ICall {
38
38
  private receivedRoapOKSeq;
39
39
  private localAudioStream?;
40
40
  private rtcMetrics;
41
+ private callKeepaliveRetryCount;
42
+ private callKeepaliveInterval?;
41
43
  isMuted(): boolean;
42
44
  isConnected(): boolean;
43
45
  isHeld(): boolean;