@webex/calling 3.8.0 → 3.8.1-next.10

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 (180) hide show
  1. package/dist/CallHistory/CallHistory.js +100 -63
  2. package/dist/CallHistory/CallHistory.js.map +1 -1
  3. package/dist/CallHistory/CallHistory.test.js +115 -19
  4. package/dist/CallHistory/CallHistory.test.js.map +1 -1
  5. package/dist/CallHistory/constants.js +9 -1
  6. package/dist/CallHistory/constants.js.map +1 -1
  7. package/dist/CallSettings/CallSettings.js +46 -13
  8. package/dist/CallSettings/CallSettings.js.map +1 -1
  9. package/dist/CallSettings/UcmBackendConnector.js +62 -18
  10. package/dist/CallSettings/UcmBackendConnector.js.map +1 -1
  11. package/dist/CallSettings/UcmBackendConnector.test.js +70 -7
  12. package/dist/CallSettings/UcmBackendConnector.test.js.map +1 -1
  13. package/dist/CallSettings/WxCallBackendConnector.js +153 -103
  14. package/dist/CallSettings/WxCallBackendConnector.js.map +1 -1
  15. package/dist/CallSettings/WxCallBackendConnector.test.js +52 -15
  16. package/dist/CallSettings/WxCallBackendConnector.test.js.map +1 -1
  17. package/dist/CallSettings/constants.js +15 -1
  18. package/dist/CallSettings/constants.js.map +1 -1
  19. package/dist/CallingClient/CallingClient.js +220 -159
  20. package/dist/CallingClient/CallingClient.js.map +1 -1
  21. package/dist/CallingClient/CallingClient.test.js +58 -27
  22. package/dist/CallingClient/CallingClient.test.js.map +1 -1
  23. package/dist/CallingClient/calling/call.js +251 -189
  24. package/dist/CallingClient/calling/call.js.map +1 -1
  25. package/dist/CallingClient/calling/call.test.js +96 -41
  26. package/dist/CallingClient/calling/call.test.js.map +1 -1
  27. package/dist/CallingClient/calling/callManager.js +73 -48
  28. package/dist/CallingClient/calling/callManager.js.map +1 -1
  29. package/dist/CallingClient/calling/callManager.test.js +96 -37
  30. package/dist/CallingClient/calling/callManager.test.js.map +1 -1
  31. package/dist/CallingClient/constants.js +105 -3
  32. package/dist/CallingClient/constants.js.map +1 -1
  33. package/dist/CallingClient/line/index.js +47 -18
  34. package/dist/CallingClient/line/index.js.map +1 -1
  35. package/dist/CallingClient/line/line.test.js +6 -12
  36. package/dist/CallingClient/line/line.test.js.map +1 -1
  37. package/dist/CallingClient/registration/register.js +590 -522
  38. package/dist/CallingClient/registration/register.js.map +1 -1
  39. package/dist/CallingClient/registration/register.test.js +821 -394
  40. package/dist/CallingClient/registration/register.test.js.map +1 -1
  41. package/dist/CallingClient/registration/types.js.map +1 -1
  42. package/dist/CallingClient/registration/webWorker.js +115 -0
  43. package/dist/CallingClient/registration/webWorker.js.map +1 -0
  44. package/dist/CallingClient/registration/webWorker.test.js +256 -0
  45. package/dist/CallingClient/registration/webWorker.test.js.map +1 -0
  46. package/dist/CallingClient/registration/webWorkerStr.js +15 -0
  47. package/dist/CallingClient/registration/webWorkerStr.js.map +1 -0
  48. package/dist/Contacts/ContactsClient.js +156 -102
  49. package/dist/Contacts/ContactsClient.js.map +1 -1
  50. package/dist/Contacts/ContactsClient.test.js +197 -49
  51. package/dist/Contacts/ContactsClient.test.js.map +1 -1
  52. package/dist/Contacts/constants.js +11 -1
  53. package/dist/Contacts/constants.js.map +1 -1
  54. package/dist/Errors/types.js +2 -0
  55. package/dist/Errors/types.js.map +1 -1
  56. package/dist/Events/impl/index.js +1 -1
  57. package/dist/Events/impl/index.js.map +1 -1
  58. package/dist/Metrics/index.js +102 -41
  59. package/dist/Metrics/index.js.map +1 -1
  60. package/dist/Metrics/index.test.js +10 -4
  61. package/dist/Metrics/index.test.js.map +1 -1
  62. package/dist/Metrics/types.js +4 -1
  63. package/dist/Metrics/types.js.map +1 -1
  64. package/dist/SDKConnector/types.js.map +1 -1
  65. package/dist/Voicemail/BroadworksBackendConnector.js +154 -91
  66. package/dist/Voicemail/BroadworksBackendConnector.js.map +1 -1
  67. package/dist/Voicemail/BroadworksBackendConnector.test.js +99 -19
  68. package/dist/Voicemail/BroadworksBackendConnector.test.js.map +1 -1
  69. package/dist/Voicemail/UcmBackendConnector.js +105 -54
  70. package/dist/Voicemail/UcmBackendConnector.js.map +1 -1
  71. package/dist/Voicemail/UcmBackendConnector.test.js +127 -17
  72. package/dist/Voicemail/UcmBackendConnector.test.js.map +1 -1
  73. package/dist/Voicemail/Voicemail.js +198 -79
  74. package/dist/Voicemail/Voicemail.js.map +1 -1
  75. package/dist/Voicemail/Voicemail.test.js +188 -23
  76. package/dist/Voicemail/Voicemail.test.js.map +1 -1
  77. package/dist/Voicemail/WxCallBackendConnector.js +277 -161
  78. package/dist/Voicemail/WxCallBackendConnector.js.map +1 -1
  79. package/dist/Voicemail/WxCallBackendConnector.test.js +268 -10
  80. package/dist/Voicemail/WxCallBackendConnector.test.js.map +1 -1
  81. package/dist/Voicemail/constants.js +25 -1
  82. package/dist/Voicemail/constants.js.map +1 -1
  83. package/dist/Voicemail/types.js.map +1 -1
  84. package/dist/common/Utils.js +168 -104
  85. package/dist/common/Utils.js.map +1 -1
  86. package/dist/common/Utils.test.js +199 -35
  87. package/dist/common/Utils.test.js.map +1 -1
  88. package/dist/common/constants.js +2 -1
  89. package/dist/common/constants.js.map +1 -1
  90. package/dist/common/testUtil.js +3 -0
  91. package/dist/common/testUtil.js.map +1 -1
  92. package/dist/common/types.js +8 -1
  93. package/dist/common/types.js.map +1 -1
  94. package/dist/index.js +12 -0
  95. package/dist/index.js.map +1 -1
  96. package/dist/module/CallHistory/CallHistory.js +32 -13
  97. package/dist/module/CallHistory/constants.js +6 -0
  98. package/dist/module/CallSettings/CallSettings.js +36 -3
  99. package/dist/module/CallSettings/UcmBackendConnector.js +50 -5
  100. package/dist/module/CallSettings/WxCallBackendConnector.js +54 -18
  101. package/dist/module/CallSettings/constants.js +12 -0
  102. package/dist/module/CallingClient/CallingClient.js +54 -16
  103. package/dist/module/CallingClient/calling/call.js +172 -121
  104. package/dist/module/CallingClient/calling/callManager.js +51 -26
  105. package/dist/module/CallingClient/constants.js +102 -2
  106. package/dist/module/CallingClient/line/index.js +37 -8
  107. package/dist/module/CallingClient/registration/register.js +151 -112
  108. package/dist/module/CallingClient/registration/webWorker.js +59 -0
  109. package/dist/module/CallingClient/registration/webWorkerStr.js +93 -0
  110. package/dist/module/Contacts/ContactsClient.js +65 -21
  111. package/dist/module/Contacts/constants.js +10 -0
  112. package/dist/module/Errors/types.js +2 -0
  113. package/dist/module/Events/impl/index.js +1 -1
  114. package/dist/module/Metrics/index.js +57 -2
  115. package/dist/module/Metrics/types.js +3 -0
  116. package/dist/module/Voicemail/BroadworksBackendConnector.js +66 -17
  117. package/dist/module/Voicemail/UcmBackendConnector.js +51 -11
  118. package/dist/module/Voicemail/Voicemail.js +109 -9
  119. package/dist/module/Voicemail/WxCallBackendConnector.js +67 -18
  120. package/dist/module/Voicemail/constants.js +21 -0
  121. package/dist/module/common/Utils.js +51 -12
  122. package/dist/module/common/constants.js +1 -0
  123. package/dist/module/common/testUtil.js +3 -0
  124. package/dist/module/common/types.js +7 -0
  125. package/dist/module/index.js +1 -0
  126. package/dist/types/CallHistory/CallHistory.d.ts.map +1 -1
  127. package/dist/types/CallHistory/constants.d.ts +6 -0
  128. package/dist/types/CallHistory/constants.d.ts.map +1 -1
  129. package/dist/types/CallSettings/CallSettings.d.ts.map +1 -1
  130. package/dist/types/CallSettings/UcmBackendConnector.d.ts.map +1 -1
  131. package/dist/types/CallSettings/WxCallBackendConnector.d.ts.map +1 -1
  132. package/dist/types/CallSettings/constants.d.ts +12 -0
  133. package/dist/types/CallSettings/constants.d.ts.map +1 -1
  134. package/dist/types/CallingClient/CallingClient.d.ts +2 -3
  135. package/dist/types/CallingClient/CallingClient.d.ts.map +1 -1
  136. package/dist/types/CallingClient/calling/call.d.ts.map +1 -1
  137. package/dist/types/CallingClient/calling/callManager.d.ts.map +1 -1
  138. package/dist/types/CallingClient/constants.d.ts +102 -2
  139. package/dist/types/CallingClient/constants.d.ts.map +1 -1
  140. package/dist/types/CallingClient/line/index.d.ts.map +1 -1
  141. package/dist/types/CallingClient/registration/register.d.ts +4 -3
  142. package/dist/types/CallingClient/registration/register.d.ts.map +1 -1
  143. package/dist/types/CallingClient/registration/types.d.ts +1 -0
  144. package/dist/types/CallingClient/registration/types.d.ts.map +1 -1
  145. package/dist/types/CallingClient/registration/webWorker.d.ts +2 -0
  146. package/dist/types/CallingClient/registration/webWorker.d.ts.map +1 -0
  147. package/dist/types/CallingClient/registration/webWorkerStr.d.ts +3 -0
  148. package/dist/types/CallingClient/registration/webWorkerStr.d.ts.map +1 -0
  149. package/dist/types/Contacts/ContactsClient.d.ts.map +1 -1
  150. package/dist/types/Contacts/constants.d.ts +10 -0
  151. package/dist/types/Contacts/constants.d.ts.map +1 -1
  152. package/dist/types/Errors/types.d.ts +2 -0
  153. package/dist/types/Errors/types.d.ts.map +1 -1
  154. package/dist/types/Metrics/index.d.ts +1 -1
  155. package/dist/types/Metrics/index.d.ts.map +1 -1
  156. package/dist/types/Metrics/types.d.ts +7 -2
  157. package/dist/types/Metrics/types.d.ts.map +1 -1
  158. package/dist/types/SDKConnector/types.d.ts +11 -2
  159. package/dist/types/SDKConnector/types.d.ts.map +1 -1
  160. package/dist/types/Voicemail/BroadworksBackendConnector.d.ts.map +1 -1
  161. package/dist/types/Voicemail/UcmBackendConnector.d.ts.map +1 -1
  162. package/dist/types/Voicemail/Voicemail.d.ts +1 -1
  163. package/dist/types/Voicemail/Voicemail.d.ts.map +1 -1
  164. package/dist/types/Voicemail/WxCallBackendConnector.d.ts +3 -1
  165. package/dist/types/Voicemail/WxCallBackendConnector.d.ts.map +1 -1
  166. package/dist/types/Voicemail/constants.d.ts +21 -0
  167. package/dist/types/Voicemail/constants.d.ts.map +1 -1
  168. package/dist/types/Voicemail/types.d.ts +1 -1
  169. package/dist/types/Voicemail/types.d.ts.map +1 -1
  170. package/dist/types/common/Utils.d.ts +4 -4
  171. package/dist/types/common/Utils.d.ts.map +1 -1
  172. package/dist/types/common/constants.d.ts +1 -0
  173. package/dist/types/common/constants.d.ts.map +1 -1
  174. package/dist/types/common/testUtil.d.ts +3 -0
  175. package/dist/types/common/testUtil.d.ts.map +1 -1
  176. package/dist/types/common/types.d.ts +24 -0
  177. package/dist/types/common/types.d.ts.map +1 -1
  178. package/dist/types/index.d.ts +2 -0
  179. package/dist/types/index.d.ts.map +1 -1
  180. package/package.json +4 -3
@@ -1,10 +1,10 @@
1
- import { FAILURE_MESSAGE, SCIM_ENTERPRISE_USER, SCIM_WEBEXIDENTITY_USER, STATUS_CODE, SUCCESS_MESSAGE, } from '../common/constants';
1
+ import { FAILURE_MESSAGE, METHOD_START_MESSAGE, SCIM_ENTERPRISE_USER, SCIM_WEBEXIDENTITY_USER, STATUS_CODE, SUCCESS_MESSAGE, } from '../common/constants';
2
2
  import { HTTP_METHODS } from '../common/types';
3
3
  import SDKConnector from '../SDKConnector';
4
4
  import log from '../Logger';
5
- import { CONTACTS_FILE, CONTACTS_SCHEMA, CONTACT_FILTER, DEFAULT_GROUP_NAME, ENCRYPT_FILTER, GROUP_FILTER, OR, SCIM_ID_FILTER, USERS, encryptedFields, } from './constants';
5
+ import { CONTACTS_FILE, CONTACTS_SCHEMA, CONTACT_FILTER, DEFAULT_GROUP_NAME, ENCRYPT_FILTER, GROUP_FILTER, METHODS, OR, SCIM_ID_FILTER, USERS, encryptedFields, } from './constants';
6
6
  import { ContactType, GroupType, } from './types';
7
- import { scimQuery, serviceErrorCodeHandler } from '../common/Utils';
7
+ import { scimQuery, serviceErrorCodeHandler, uploadLogs } from '../common/Utils';
8
8
  export class ContactsClient {
9
9
  sdkConnector;
10
10
  encryptionKeyUrl;
@@ -188,8 +188,9 @@ export class ContactsClient {
188
188
  async getContacts() {
189
189
  const loggerContext = {
190
190
  file: CONTACTS_FILE,
191
- method: 'getContacts',
191
+ method: METHODS.GET_CONTACTS,
192
192
  };
193
+ log.info(METHOD_START_MESSAGE, loggerContext);
193
194
  const contactList = [];
194
195
  const cloudContactsMap = {};
195
196
  try {
@@ -244,19 +245,24 @@ export class ContactsClient {
244
245
  },
245
246
  message: SUCCESS_MESSAGE,
246
247
  };
248
+ log.log('Successfully fetched contacts and groups', loggerContext);
247
249
  return contactResponse;
248
250
  }
249
251
  catch (err) {
250
252
  const errorInfo = err;
253
+ const extendedError = new Error(`Error fetching contacts: ${err}`);
254
+ log.error(extendedError, loggerContext);
251
255
  const errorStatus = serviceErrorCodeHandler(errorInfo, loggerContext);
256
+ await uploadLogs();
252
257
  return errorStatus;
253
258
  }
254
259
  }
255
260
  async createNewEncryptionKeyUrl() {
256
261
  const loggerContext = {
257
262
  file: CONTACTS_FILE,
258
- method: this.createNewEncryptionKeyUrl.name,
263
+ method: METHODS.CREATE_NEW_ENCRYPTION_KEY_URL,
259
264
  };
265
+ log.info(METHOD_START_MESSAGE, loggerContext);
260
266
  let unboundedKeyUri = '';
261
267
  log.info('Requesting kms for a new KRO and key', loggerContext);
262
268
  const unboundedKeys = await this.webex.internal.encryption.kms.createUnboundKeys({ count: 1 });
@@ -265,6 +271,11 @@ export class ContactsClient {
265
271
  return unboundedKeyUri;
266
272
  }
267
273
  async fetchEncryptionKeyUrl() {
274
+ const loggerContext = {
275
+ file: CONTACTS_FILE,
276
+ method: METHODS.FETCH_ENCRYPTION_KEY_URL,
277
+ };
278
+ log.info(METHOD_START_MESSAGE, loggerContext);
268
279
  if (this.encryptionKeyUrl) {
269
280
  return this.encryptionKeyUrl;
270
281
  }
@@ -275,45 +286,67 @@ export class ContactsClient {
275
286
  return this.groups[0].encryptionKeyUrl;
276
287
  }
277
288
  this.encryptionKeyUrl = await this.createNewEncryptionKeyUrl();
278
- log.info(`Creating a default group: ${DEFAULT_GROUP_NAME}`, {
289
+ log.log(`Creating a default group: ${DEFAULT_GROUP_NAME}`, {
279
290
  file: CONTACTS_FILE,
280
291
  method: this.fetchEncryptionKeyUrl.name,
281
292
  });
282
293
  const response = await this.createContactGroup(DEFAULT_GROUP_NAME, this.encryptionKeyUrl);
283
294
  if (response.data.group?.groupId) {
284
295
  this.defaultGroupId = response.data.group?.groupId;
296
+ log.log(`Successfully created default group with ID: ${this.defaultGroupId}`, {
297
+ file: CONTACTS_FILE,
298
+ method: this.fetchEncryptionKeyUrl.name,
299
+ });
285
300
  }
286
301
  return this.encryptionKeyUrl;
287
302
  }
288
303
  async fetchDefaultGroup() {
304
+ const loggerContext = {
305
+ file: CONTACTS_FILE,
306
+ method: METHODS.FETCH_DEFAULT_GROUP,
307
+ };
308
+ log.info(METHOD_START_MESSAGE, loggerContext);
289
309
  if (this.defaultGroupId) {
310
+ log.log(`Using existing default group with ID: ${this.defaultGroupId}`, {
311
+ file: CONTACTS_FILE,
312
+ method: this.fetchDefaultGroup.name,
313
+ });
290
314
  return this.defaultGroupId;
291
315
  }
292
316
  if (this.groups && this.groups.length) {
293
317
  for (let i = 0; i < this.groups.length; i += 1) {
294
318
  if (this.groups[i].displayName === DEFAULT_GROUP_NAME) {
295
319
  this.defaultGroupId = this.groups[i].groupId;
320
+ log.log(`Found default group with ID: ${this.defaultGroupId}`, {
321
+ file: CONTACTS_FILE,
322
+ method: this.fetchDefaultGroup.name,
323
+ });
296
324
  return this.defaultGroupId;
297
325
  }
298
326
  }
299
327
  }
300
- log.info('No default group found.', {
328
+ log.log('No default group found.', {
301
329
  file: CONTACTS_FILE,
302
330
  method: this.fetchDefaultGroup.name,
303
331
  });
304
332
  const response = await this.createContactGroup(DEFAULT_GROUP_NAME);
305
333
  const { group } = response.data;
306
334
  if (group) {
307
- return group.groupId;
335
+ const groupId = group.groupId;
336
+ log.log(`Successfully created new default group with ID: ${groupId}`, {
337
+ file: CONTACTS_FILE,
338
+ method: this.fetchDefaultGroup.name,
339
+ });
340
+ return groupId;
308
341
  }
309
342
  return '';
310
343
  }
311
344
  async createContactGroup(displayName, encryptionKeyUrl, groupType) {
312
345
  const loggerContext = {
313
346
  file: CONTACTS_FILE,
314
- method: this.createContactGroup.name,
347
+ method: METHODS.CREATE_CONTACT_GROUP,
315
348
  };
316
- log.info(`Creating contact group ${displayName}`, loggerContext);
349
+ log.info(`${METHOD_START_MESSAGE} with displayName: ${displayName}`, loggerContext);
317
350
  const encryptionKeyUrlFinal = encryptionKeyUrl || (await this.fetchEncryptionKeyUrl());
318
351
  if (this.groups === undefined) {
319
352
  await this.getContacts();
@@ -354,20 +387,24 @@ export class ContactsClient {
354
387
  message: SUCCESS_MESSAGE,
355
388
  };
356
389
  this.groups?.push(group);
390
+ log.log(`Contact group ${displayName} successfully created`, loggerContext);
357
391
  return contactResponse;
358
392
  }
359
393
  catch (err) {
360
- log.warn('Unable to create contact group.', loggerContext);
361
394
  const errorInfo = err;
395
+ const extendedError = new Error(`Unable to create contact group: ${err}`);
396
+ log.error(extendedError, loggerContext);
362
397
  const errorStatus = serviceErrorCodeHandler(errorInfo, loggerContext);
398
+ await uploadLogs();
363
399
  return errorStatus;
364
400
  }
365
401
  }
366
402
  async deleteContactGroup(groupId) {
367
403
  const loggerContext = {
368
404
  file: CONTACTS_FILE,
369
- method: this.deleteContactGroup.name,
405
+ method: METHODS.DELETE_CONTACT_GROUP,
370
406
  };
407
+ log.info(`${METHOD_START_MESSAGE} with groupId: ${groupId}`, loggerContext);
371
408
  try {
372
409
  log.info(`Deleting contact group: ${groupId}`, loggerContext);
373
410
  const response = await this.webex.request({
@@ -386,21 +423,24 @@ export class ContactsClient {
386
423
  if (!this.groups?.length) {
387
424
  this.defaultGroupId = '';
388
425
  }
426
+ log.log(`Contact group ${groupId} successfully deleted`, loggerContext);
389
427
  return contactResponse;
390
428
  }
391
429
  catch (err) {
392
- log.warn(`Unable to delete contact group ${groupId}`, loggerContext);
393
430
  const errorInfo = err;
431
+ const extendedError = new Error(`Unable to delete contact group ${groupId}: ${err}`);
432
+ log.error(extendedError, loggerContext);
394
433
  const errorStatus = serviceErrorCodeHandler(errorInfo, loggerContext);
434
+ await uploadLogs();
395
435
  return errorStatus;
396
436
  }
397
437
  }
398
438
  async createContact(contactInfo) {
399
439
  const loggerContext = {
400
440
  file: CONTACTS_FILE,
401
- method: this.createContact.name,
441
+ method: METHODS.CREATE_CONTACT,
402
442
  };
403
- log.info(`Request to create contact: contactType: ${contactInfo.contactType}`, loggerContext);
443
+ log.info(`${METHOD_START_MESSAGE} with contactType: ${contactInfo.contactType}`, loggerContext);
404
444
  try {
405
445
  const contact = { ...contactInfo };
406
446
  if (!contact.encryptionKeyUrl) {
@@ -467,23 +507,24 @@ export class ContactsClient {
467
507
  else {
468
508
  this.contacts?.push(contact);
469
509
  }
510
+ log.log(`Contact successfully created`, loggerContext);
470
511
  return contactResponse;
471
512
  }
472
513
  catch (err) {
473
- log.warn('Failed to create contact.', {
474
- file: CONTACTS_FILE,
475
- method: this.createContact.name,
476
- });
477
514
  const errorInfo = err;
515
+ const extendedError = new Error(`Failed to create contact: ${err}`);
516
+ log.error(extendedError, loggerContext);
478
517
  const errorStatus = serviceErrorCodeHandler(errorInfo, loggerContext);
518
+ await uploadLogs();
479
519
  return errorStatus;
480
520
  }
481
521
  }
482
522
  async deleteContact(contactId) {
483
523
  const loggerContext = {
484
524
  file: CONTACTS_FILE,
485
- method: this.deleteContact.name,
525
+ method: METHODS.DELETE_CONTACT,
486
526
  };
527
+ log.info(`${METHOD_START_MESSAGE} with contactId: ${contactId}`, loggerContext);
487
528
  try {
488
529
  log.info(`Deleting contact : ${contactId}`, loggerContext);
489
530
  const response = await this.webex.request({
@@ -499,12 +540,15 @@ export class ContactsClient {
499
540
  if (contactToDelete !== undefined && contactToDelete !== -1) {
500
541
  this.contacts?.splice(contactToDelete, 1);
501
542
  }
543
+ log.log(`Contact ${contactId} successfully deleted`, loggerContext);
502
544
  return contactResponse;
503
545
  }
504
546
  catch (err) {
505
- log.warn(`Unable to delete contact ${contactId}`, loggerContext);
506
547
  const errorInfo = err;
548
+ const extendedError = new Error(`Unable to delete contact ${contactId}: ${err}`);
549
+ log.error(extendedError, loggerContext);
507
550
  const errorStatus = serviceErrorCodeHandler(errorInfo, loggerContext);
551
+ await uploadLogs();
508
552
  return errorStatus;
509
553
  }
510
554
  }
@@ -20,3 +20,13 @@ export var encryptedFields;
20
20
  encryptedFields["SIP_ADDRESSES"] = "sipAddresses";
21
21
  encryptedFields["TITLE"] = "title";
22
22
  })(encryptedFields || (encryptedFields = {}));
23
+ export const METHODS = {
24
+ GET_CONTACTS: 'getContacts',
25
+ CREATE_NEW_ENCRYPTION_KEY_URL: 'createNewEncryptionKeyUrl',
26
+ FETCH_ENCRYPTION_KEY_URL: 'fetchEncryptionKeyUrl',
27
+ FETCH_DEFAULT_GROUP: 'fetchDefaultGroup',
28
+ CREATE_CONTACT_GROUP: 'createContactGroup',
29
+ DELETE_CONTACT_GROUP: 'deleteContactGroup',
30
+ CREATE_CONTACT: 'createContact',
31
+ DELETE_CONTACT: 'deleteContact',
32
+ };
@@ -7,12 +7,14 @@ export var ERROR_TYPE;
7
7
  (function (ERROR_TYPE) {
8
8
  ERROR_TYPE["CALL_ERROR"] = "call_error";
9
9
  ERROR_TYPE["DEFAULT"] = "default_error";
10
+ ERROR_TYPE["BAD_REQUEST"] = "bad_request";
10
11
  ERROR_TYPE["FORBIDDEN_ERROR"] = "forbidden";
11
12
  ERROR_TYPE["NOT_FOUND"] = "not_found";
12
13
  ERROR_TYPE["REGISTRATION_ERROR"] = "registration_error";
13
14
  ERROR_TYPE["SERVICE_UNAVAILABLE"] = "service_unavailable";
14
15
  ERROR_TYPE["TIMEOUT"] = "timeout";
15
16
  ERROR_TYPE["TOKEN_ERROR"] = "token_error";
17
+ ERROR_TYPE["TOO_MANY_REQUESTS"] = "too_many_requests";
16
18
  ERROR_TYPE["SERVER_ERROR"] = "server_error";
17
19
  })(ERROR_TYPE || (ERROR_TYPE = {}));
18
20
  export var ERROR_CODE;
@@ -4,7 +4,7 @@ import { LOG_PREFIX } from '../../Logger/types';
4
4
  export class Eventing extends EventEmitter {
5
5
  emit(event, ...args) {
6
6
  const timestamp = new Date().toUTCString();
7
- Logger.log(`${timestamp} ${LOG_PREFIX.EVENT}: ${event.toString()} - event emitted with parameters -> ${args} = `, {
7
+ Logger.info(`${timestamp} ${LOG_PREFIX.EVENT}: ${event.toString()} - event emitted with parameters -> ${args} = `, {
8
8
  file: 'Events/impl/index.ts',
9
9
  method: 'emit',
10
10
  });
@@ -11,10 +11,58 @@ class MetricManager {
11
11
  this.webex = webex;
12
12
  this.serviceIndicator = indicator;
13
13
  }
14
+ submitUploadLogsMetric(name, action, type, trackingId, feedbackId, correlationId, stack, callId) {
15
+ let data;
16
+ switch (name) {
17
+ case METRIC_EVENT.UPLOAD_LOGS_SUCCESS: {
18
+ data = {
19
+ tags: {
20
+ action,
21
+ device_id: this.deviceInfo?.device?.deviceId,
22
+ service_indicator: this.serviceIndicator,
23
+ },
24
+ fields: {
25
+ device_url: this.deviceInfo?.device?.clientDeviceUri,
26
+ mobius_url: this.deviceInfo?.device?.uri,
27
+ calling_sdk_version: process.env.CALLING_SDK_VERSION || VERSION,
28
+ correlation_id: correlationId,
29
+ tracking_id: trackingId,
30
+ feedback_id: feedbackId,
31
+ call_id: callId,
32
+ },
33
+ type,
34
+ };
35
+ break;
36
+ }
37
+ case METRIC_EVENT.UPLOAD_LOGS_FAILED: {
38
+ data = {
39
+ tags: {
40
+ action,
41
+ device_id: this.deviceInfo?.device?.deviceId,
42
+ service_indicator: this.serviceIndicator,
43
+ },
44
+ fields: {
45
+ device_url: this.deviceInfo?.device?.clientDeviceUri,
46
+ mobius_url: this.deviceInfo?.device?.uri,
47
+ calling_sdk_version: process.env.CALLING_SDK_VERSION || VERSION,
48
+ correlation_id: correlationId,
49
+ tracking_id: trackingId,
50
+ feedback_id: feedbackId,
51
+ error: stack,
52
+ call_id: callId,
53
+ },
54
+ type,
55
+ };
56
+ }
57
+ }
58
+ if (data) {
59
+ this.webex.internal.metrics.submitClientMetrics(name, data);
60
+ }
61
+ }
14
62
  setDeviceInfo(deviceInfo) {
15
63
  this.deviceInfo = deviceInfo;
16
64
  }
17
- submitRegistrationMetric(name, metricAction, type, clientError) {
65
+ submitRegistrationMetric(name, metricAction, type, caller, serverType, trackingId, keepaliveCount, clientError) {
18
66
  let data;
19
67
  switch (name) {
20
68
  case METRIC_EVENT.REGISTRATION: {
@@ -28,6 +76,9 @@ class MetricManager {
28
76
  device_url: this.deviceInfo?.device?.clientDeviceUri,
29
77
  mobius_url: this.deviceInfo?.device?.uri,
30
78
  calling_sdk_version: process.env.CALLING_SDK_VERSION || VERSION,
79
+ reg_source: caller,
80
+ server_type: serverType,
81
+ trackingId,
31
82
  },
32
83
  type,
33
84
  };
@@ -45,6 +96,10 @@ class MetricManager {
45
96
  device_url: this.deviceInfo?.device?.clientDeviceUri,
46
97
  mobius_url: this.deviceInfo?.device?.uri,
47
98
  calling_sdk_version: process.env.CALLING_SDK_VERSION || VERSION,
99
+ reg_source: caller,
100
+ server_type: serverType,
101
+ trackingId,
102
+ keepalive_count: keepaliveCount,
48
103
  error: clientError.getError().message,
49
104
  error_type: clientError.getError().type,
50
105
  },
@@ -256,7 +311,7 @@ class MetricManager {
256
311
  }
257
312
  }
258
313
  export const getMetricManager = (webex, indicator) => {
259
- if (!metricManager) {
314
+ if (!metricManager && webex) {
260
315
  metricManager = new MetricManager(webex, indicator);
261
316
  }
262
317
  return metricManager;
@@ -15,6 +15,8 @@ export var METRIC_EVENT;
15
15
  METRIC_EVENT["REGISTRATION_ERROR"] = "web-calling-sdk-registration-error";
16
16
  METRIC_EVENT["VOICEMAIL"] = "web-calling-sdk-voicemail";
17
17
  METRIC_EVENT["VOICEMAIL_ERROR"] = "web-calling-sdk-voicemail-error";
18
+ METRIC_EVENT["UPLOAD_LOGS_SUCCESS"] = "web-calling-sdk-upload-logs-success";
19
+ METRIC_EVENT["UPLOAD_LOGS_FAILED"] = "web-calling-sdk-upload-logs-failed";
18
20
  })(METRIC_EVENT || (METRIC_EVENT = {}));
19
21
  export var REG_ACTION;
20
22
  (function (REG_ACTION) {
@@ -37,3 +39,4 @@ export var VOICEMAIL_ACTION;
37
39
  VOICEMAIL_ACTION["DELETE"] = "delete";
38
40
  VOICEMAIL_ACTION["TRANSCRIPT"] = "transcript";
39
41
  })(VOICEMAIL_ACTION || (VOICEMAIL_ACTION = {}));
42
+ export const UPLOAD_LOGS_ACTION = 'upload_logs';
@@ -1,10 +1,10 @@
1
1
  import { ERROR_CODE } from '../Errors/types';
2
2
  import SDKConnector from '../SDKConnector';
3
- import { BASE64, BEARER, BINARY, SUCCESS_MESSAGE, SUCCESS_STATUS_CODE, OBJECT, TOKEN, USER, XML_TYPE, BW_XSI_ENDPOINT_VERSION, } from '../common/constants';
4
- import { serviceErrorCodeHandler, getXsiActionEndpoint, getSortedVoicemailList, storeVoicemailList, fetchVoicemailList, } from '../common/Utils';
3
+ import { BASE64, BEARER, BINARY, SUCCESS_MESSAGE, SUCCESS_STATUS_CODE, OBJECT, TOKEN, USER, XML_TYPE, BW_XSI_ENDPOINT_VERSION, METHOD_START_MESSAGE, } from '../common/constants';
4
+ import { serviceErrorCodeHandler, getXsiActionEndpoint, getSortedVoicemailList, storeVoicemailList, fetchVoicemailList, uploadLogs, } from '../common/Utils';
5
5
  import { CALLING_BACKEND, HTTP_METHODS, SORT, } from '../common/types';
6
6
  import log from '../Logger';
7
- import { BROADWORKS_VOICEMAIL_FILE, BW_TOKEN_FETCH_ENDPOINT, JSON_FORMAT, MARK_AS_READ, MARK_AS_UNREAD, MESSAGE_MEDIA_CONTENT, VOICE_MESSAGING_MESSAGES, NO_VOICEMAIL_MSG, NO_VOICEMAIL_STATUS_CODE, RADIX_RAND, PREFIX, } from './constants';
7
+ import { BROADWORKS_VOICEMAIL_FILE, BW_TOKEN_FETCH_ENDPOINT, JSON_FORMAT, MARK_AS_READ, MARK_AS_UNREAD, MESSAGE_MEDIA_CONTENT, VOICE_MESSAGING_MESSAGES, NO_VOICEMAIL_MSG, NO_VOICEMAIL_STATUS_CODE, RADIX_RAND, PREFIX, METHODS, } from './constants';
8
8
  export class BroadworksBackendConnector {
9
9
  bwtoken;
10
10
  userId;
@@ -26,10 +26,11 @@ export class BroadworksBackendConnector {
26
26
  init() {
27
27
  const loggerContext = {
28
28
  file: BROADWORKS_VOICEMAIL_FILE,
29
- method: 'init',
29
+ method: METHODS.INIT,
30
30
  };
31
- log.info('Initializing Broadworks voicemail connector', loggerContext);
31
+ log.info(METHOD_START_MESSAGE, loggerContext);
32
32
  const response = this.setXsiVoiceMessageURI();
33
+ log.log('Successfully initialized Broadworks voicemail connector', loggerContext);
33
34
  return response;
34
35
  }
35
36
  getSDKConnector() {
@@ -38,8 +39,9 @@ export class BroadworksBackendConnector {
38
39
  async getUserId() {
39
40
  const loggerContext = {
40
41
  file: BROADWORKS_VOICEMAIL_FILE,
41
- method: 'getUserId',
42
+ method: METHODS.GET_USER_ID,
42
43
  };
44
+ log.info(METHOD_START_MESSAGE, loggerContext);
43
45
  try {
44
46
  await this.getBwToken();
45
47
  if (this.bwtoken && this.bwtoken.split('.').length > 1) {
@@ -54,10 +56,18 @@ export class BroadworksBackendConnector {
54
56
  const errorInfo = {
55
57
  statusCode: err instanceof Error ? Number(err.message) : '',
56
58
  };
59
+ const extendedError = new Error(`Failed to get userId: ${err}`);
60
+ log.error(extendedError, loggerContext);
61
+ await uploadLogs();
57
62
  return serviceErrorCodeHandler(errorInfo, loggerContext);
58
63
  }
59
64
  }
60
65
  async getBwToken() {
66
+ const loggerContext = {
67
+ file: BROADWORKS_VOICEMAIL_FILE,
68
+ method: METHODS.GET_BW_TOKEN,
69
+ };
70
+ log.info(METHOD_START_MESSAGE, loggerContext);
61
71
  try {
62
72
  const bwTokenResponse = await this.webex.request({
63
73
  uri: `${this.webex.internal.services._serviceUrls.broadworksIdpProxy}${BW_TOKEN_FETCH_ENDPOINT}`,
@@ -65,16 +75,23 @@ export class BroadworksBackendConnector {
65
75
  });
66
76
  const response = bwTokenResponse.body;
67
77
  this.bwtoken = response[TOKEN][BEARER];
78
+ log.log('Successfully fetched Broadworks token', loggerContext);
68
79
  }
69
80
  catch (err) {
70
- log.info(`Broadworks token exception ${err}`, {});
81
+ const extendedError = new Error(`Broadworks token exception: ${err}`);
82
+ log.error(extendedError, {
83
+ file: BROADWORKS_VOICEMAIL_FILE,
84
+ method: METHODS.GET_BW_TOKEN,
85
+ });
86
+ await uploadLogs();
71
87
  }
72
88
  }
73
89
  async setXsiVoiceMessageURI() {
74
90
  const loggerContext = {
75
91
  file: BROADWORKS_VOICEMAIL_FILE,
76
- method: 'setXsiVoiceMessageURI',
92
+ method: METHODS.SET_XSI_VOICE_MESSAGE_URI,
77
93
  };
94
+ log.info(METHOD_START_MESSAGE, loggerContext);
78
95
  let userIdResponse = await this.getUserId();
79
96
  this.xsiEndpoint = await getXsiActionEndpoint(this.webex, loggerContext, CALLING_BACKEND.BWRKS);
80
97
  this.xsiAccessToken = `${BEARER} ${this.bwtoken}`;
@@ -87,14 +104,15 @@ export class BroadworksBackendConnector {
87
104
  message: SUCCESS_MESSAGE,
88
105
  };
89
106
  }
107
+ log.log('Successfully set XSI voice message URI', loggerContext);
90
108
  return userIdResponse;
91
109
  }
92
110
  async getVoicemailList(offset, offsetLimit, sort, refresh) {
93
111
  const loggerContext = {
94
112
  file: BROADWORKS_VOICEMAIL_FILE,
95
- method: 'getVoicemailList',
113
+ method: METHODS.GET_VOICEMAIL_LIST,
96
114
  };
97
- log.info(`Offset: ${offset} Offset limit: ${offsetLimit} Sort type:${sort}`, loggerContext);
115
+ log.info(`${METHOD_START_MESSAGE} with offset: ${offset}, offsetLimit: ${offsetLimit}, sort type: ${sort}`, loggerContext);
98
116
  const urlXsi = `${this.xsiVoiceMessageURI}${JSON_FORMAT}`;
99
117
  let messageinfo;
100
118
  const sortParam = Object.values(SORT).includes(sort) ? sort : SORT.DEFAULT;
@@ -127,11 +145,15 @@ export class BroadworksBackendConnector {
127
145
  const errorInfo = {
128
146
  statusCode: err instanceof Error ? Number(err.message) : '',
129
147
  };
148
+ const extendedError = new Error(`Failed to get voicemail list: ${err}`);
149
+ log.error(extendedError, loggerContext);
150
+ await uploadLogs();
130
151
  const errorStatus = serviceErrorCodeHandler(errorInfo, loggerContext);
131
152
  return errorStatus;
132
153
  }
133
154
  }
134
155
  const { messages, moreVMAvailable } = fetchVoicemailList(this.context, offset, offsetLimit, loggerContext);
156
+ log.log(`Successfully fetched voicemail list with ${messages.length} messages`, loggerContext);
135
157
  const responseDetails = {
136
158
  statusCode: moreVMAvailable ? SUCCESS_STATUS_CODE : NO_VOICEMAIL_STATUS_CODE,
137
159
  data: {
@@ -144,8 +166,9 @@ export class BroadworksBackendConnector {
144
166
  async getVoicemailContent(messageId) {
145
167
  const loggerContext = {
146
168
  file: BROADWORKS_VOICEMAIL_FILE,
147
- method: 'getVoicemailContent',
169
+ method: METHODS.GET_VOICEMAIL_CONTENT,
148
170
  };
171
+ log.info(`${METHOD_START_MESSAGE} with messageId: ${messageId}`, loggerContext);
149
172
  try {
150
173
  const voicemailContentUrl = `${this.xsiEndpoint}${messageId}`;
151
174
  const response = await fetch(`${voicemailContentUrl}`, {
@@ -163,7 +186,8 @@ export class BroadworksBackendConnector {
163
186
  const mediaDetails = xmlDOM.getElementsByTagName(MESSAGE_MEDIA_CONTENT)[0];
164
187
  const mediaType = mediaDetails.childNodes[1]?.textContent;
165
188
  const mediaContent = mediaDetails.childNodes[2]?.textContent;
166
- log.info(`Media type is ${mediaType}`, loggerContext);
189
+ log.info(`Media type is ${mediaType}`, loggerContext);
190
+ log.log(`Successfully fetched voicemail content for message ID: ${messageId}`, loggerContext);
167
191
  const responseDetails = {
168
192
  statusCode: response?.status,
169
193
  data: {
@@ -180,6 +204,9 @@ export class BroadworksBackendConnector {
180
204
  const errorInfo = {
181
205
  statusCode: err instanceof Error ? Number(err.message) : '',
182
206
  };
207
+ const extendedError = new Error(`Failed to get voicemail content: ${err}`);
208
+ log.error(extendedError, loggerContext);
209
+ await uploadLogs();
183
210
  const errorStatus = serviceErrorCodeHandler(errorInfo, loggerContext);
184
211
  return errorStatus;
185
212
  }
@@ -190,8 +217,9 @@ export class BroadworksBackendConnector {
190
217
  async voicemailMarkAsRead(messageId) {
191
218
  const loggerContext = {
192
219
  file: BROADWORKS_VOICEMAIL_FILE,
193
- method: 'voicemailMarkAsRead',
220
+ method: METHODS.VOICEMAIL_MARK_AS_READ,
194
221
  };
222
+ log.info(`${METHOD_START_MESSAGE} with messageId: ${messageId}`, loggerContext);
195
223
  try {
196
224
  const voicemailContentUrl = `${this.xsiEndpoint}${messageId}/${MARK_AS_READ}`;
197
225
  const response = await fetch(voicemailContentUrl, {
@@ -203,6 +231,7 @@ export class BroadworksBackendConnector {
203
231
  if (!response.ok) {
204
232
  throw new Error(`${response.status}`);
205
233
  }
234
+ log.log(`Successfully marked voicemail with ID ${messageId} as read`, loggerContext);
206
235
  const responseDetails = {
207
236
  statusCode: response.status,
208
237
  data: {},
@@ -214,6 +243,9 @@ export class BroadworksBackendConnector {
214
243
  const errorInfo = {
215
244
  statusCode: err instanceof Error ? Number(err.message) : '',
216
245
  };
246
+ const extendedError = new Error(`Failed to mark voicemail as read: ${err}`);
247
+ log.error(extendedError, loggerContext);
248
+ await uploadLogs();
217
249
  const errorStatus = serviceErrorCodeHandler(errorInfo, loggerContext);
218
250
  return errorStatus;
219
251
  }
@@ -221,8 +253,9 @@ export class BroadworksBackendConnector {
221
253
  async voicemailMarkAsUnread(messageId) {
222
254
  const loggerContext = {
223
255
  file: BROADWORKS_VOICEMAIL_FILE,
224
- method: 'voicemailMarkAsUnread',
256
+ method: METHODS.VOICEMAIL_MARK_AS_UNREAD,
225
257
  };
258
+ log.info(`${METHOD_START_MESSAGE} with messageId: ${messageId}`, loggerContext);
226
259
  try {
227
260
  const voicemailContentUrl = `${this.xsiEndpoint}${messageId}/${MARK_AS_UNREAD}`;
228
261
  const response = await fetch(voicemailContentUrl, {
@@ -234,6 +267,7 @@ export class BroadworksBackendConnector {
234
267
  if (!response.ok) {
235
268
  throw new Error(`${response.status}`);
236
269
  }
270
+ log.log(`Successfully marked voicemail with ID ${messageId} as unread`, loggerContext);
237
271
  const responseDetails = {
238
272
  statusCode: response.status,
239
273
  data: {},
@@ -245,6 +279,9 @@ export class BroadworksBackendConnector {
245
279
  const errorInfo = {
246
280
  statusCode: err instanceof Error ? Number(err.message) : '',
247
281
  };
282
+ const extendedError = new Error(`Failed to mark voicemail as unread: ${err}`);
283
+ log.error(extendedError, loggerContext);
284
+ await uploadLogs();
248
285
  const errorStatus = serviceErrorCodeHandler(errorInfo, loggerContext);
249
286
  return errorStatus;
250
287
  }
@@ -252,8 +289,9 @@ export class BroadworksBackendConnector {
252
289
  async deleteVoicemail(messageId) {
253
290
  const loggerContext = {
254
291
  file: BROADWORKS_VOICEMAIL_FILE,
255
- method: 'deleteVoicemail',
292
+ method: METHODS.DELETE_VOICEMAIL,
256
293
  };
294
+ log.info(`${METHOD_START_MESSAGE} with messageId: ${messageId}`, loggerContext);
257
295
  try {
258
296
  const voicemailContentUrl = `${this.xsiEndpoint}${messageId}`;
259
297
  const response = await fetch(voicemailContentUrl, {
@@ -265,6 +303,7 @@ export class BroadworksBackendConnector {
265
303
  if (!response.ok) {
266
304
  throw new Error(`${response.status}`);
267
305
  }
306
+ log.log(`Successfully deleted voicemail with ID ${messageId}`, loggerContext);
268
307
  const responseDetails = {
269
308
  statusCode: response.status,
270
309
  data: {},
@@ -276,16 +315,26 @@ export class BroadworksBackendConnector {
276
315
  const errorInfo = {
277
316
  statusCode: err instanceof Error ? Number(err.message) : '',
278
317
  };
318
+ const extendedError = new Error(`Failed to delete voicemail: ${err}`);
319
+ log.error(extendedError, loggerContext);
320
+ await uploadLogs();
279
321
  const errorStatus = serviceErrorCodeHandler(errorInfo, loggerContext);
280
322
  return errorStatus;
281
323
  }
282
324
  }
283
325
  async getVMTranscript(messageId) {
284
- log.info(`Message Id: ${messageId}`, {});
326
+ const loggerContext = {
327
+ file: BROADWORKS_VOICEMAIL_FILE,
328
+ method: METHODS.GET_VM_TRANSCRIPT,
329
+ };
330
+ log.info(`${METHOD_START_MESSAGE} with messageId: ${messageId}`, loggerContext);
285
331
  return Promise.resolve(null);
286
332
  }
287
333
  resolveContact(callingPartyInfo) {
288
- log.info(`Calling Party Info: ${callingPartyInfo}`, {});
334
+ log.info(`${METHOD_START_MESSAGE} with Calling Party Info: ${callingPartyInfo}`, {
335
+ file: BROADWORKS_VOICEMAIL_FILE,
336
+ method: METHODS.RESOLVE_CONTACT,
337
+ });
289
338
  return Promise.resolve(null);
290
339
  }
291
340
  }