@webex/plugin-meetings 1.153.3 → 1.154.2

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 (37) hide show
  1. package/dist/constants.js +13 -8
  2. package/dist/constants.js.map +1 -1
  3. package/dist/meeting/index.js +54 -41
  4. package/dist/meeting/index.js.map +1 -1
  5. package/dist/meeting/request.js +24 -20
  6. package/dist/meeting/request.js.map +1 -1
  7. package/dist/meeting/util.js +2 -1
  8. package/dist/meeting/util.js.map +1 -1
  9. package/dist/meetings/index.js +8 -1
  10. package/dist/meetings/index.js.map +1 -1
  11. package/dist/metrics/config.js +3 -1
  12. package/dist/metrics/config.js.map +1 -1
  13. package/dist/metrics/index.js +23 -9
  14. package/dist/metrics/index.js.map +1 -1
  15. package/dist/peer-connection-manager/index.js +22 -10
  16. package/dist/peer-connection-manager/index.js.map +1 -1
  17. package/dist/reconnection-manager/index.js +1 -1
  18. package/dist/reconnection-manager/index.js.map +1 -1
  19. package/dist/roap/handler.js +4 -4
  20. package/dist/roap/handler.js.map +1 -1
  21. package/package.json +5 -5
  22. package/src/constants.js +12 -6
  23. package/src/meeting/index.js +85 -68
  24. package/src/meeting/request.js +10 -5
  25. package/src/meeting/util.js +2 -1
  26. package/src/meetings/index.js +14 -3
  27. package/src/metrics/config.js +1 -0
  28. package/src/metrics/index.js +23 -9
  29. package/src/peer-connection-manager/index.js +29 -13
  30. package/src/reconnection-manager/index.js +3 -3
  31. package/src/roap/handler.js +5 -5
  32. package/test/unit/spec/meeting/index.js +20 -7
  33. package/test/unit/spec/meeting/request.js +53 -1
  34. package/test/unit/spec/meeting/utils.js +41 -0
  35. package/test/unit/spec/meetings/index.js +3 -1
  36. package/test/unit/spec/metrics/index.js +6 -6
  37. package/test/unit/spec/peerconnection-manager/index.js +5 -5
@@ -56,7 +56,7 @@ import {
56
56
  MEETING_STATE,
57
57
  MEETINGS,
58
58
  METRICS_JOIN_TIMES_MAX_DURATION,
59
- METRICS_OPERATIONAL_MEASURES,
59
+ BEHAVIORAL_METRICS,
60
60
  MQA_STATS,
61
61
  NETWORK_STATUS,
62
62
  ONLINE,
@@ -1057,8 +1057,8 @@ export default class Meeting extends StatelessWebexPlugin {
1057
1057
  // https:// jira-eng-gpk2.cisco.com/jira/browse/SPARK-240520
1058
1058
  // TODO: send custom parameter explaining why the inactivity happened
1059
1059
  // refresh , no media or network got dsconnected or something else
1060
- Metrics.sendOperationalMetric(
1061
- METRICS_OPERATIONAL_MEASURES.DISCONNECT_DUE_TO_INACTIVITY,
1060
+ Metrics.sendBehavioralMetric(
1061
+ BEHAVIORAL_METRICS.DISCONNECT_DUE_TO_INACTIVITY,
1062
1062
  {
1063
1063
  correlation_id: this.correlationId,
1064
1064
  locus_id: this.locusId
@@ -1950,8 +1950,8 @@ export default class Meeting extends StatelessWebexPlugin {
1950
1950
  });
1951
1951
 
1952
1952
  this.locusInfo.on(LOCUSINFO.EVENTS.MEDIA_INACTIVITY, () => {
1953
- Metrics.sendOperationalMetric(
1954
- METRICS_OPERATIONAL_MEASURES.MEETING_MEDIA_INACTIVE,
1953
+ Metrics.sendBehavioralMetric(
1954
+ BEHAVIORAL_METRICS.MEETING_MEDIA_INACTIVE,
1955
1955
  {
1956
1956
  correlation_id: this.correlationId,
1957
1957
  locus_id: this.locusId
@@ -2344,15 +2344,19 @@ export default class Meeting extends StatelessWebexPlugin {
2344
2344
  * @memberof Meeting
2345
2345
  */
2346
2346
  parseMeetingInfo(meetingInfo) {
2347
+ const webexMeetingInfo = meetingInfo?.body;
2348
+
2347
2349
  // MeetingInfo will be undefined for 1:1 calls
2348
- if (meetingInfo && meetingInfo.body && !(meetingInfo.errors && meetingInfo.errors.length > 0)) {
2349
- this.conversationUrl = meetingInfo.body.conversationUrl || this.conversationUrl;
2350
- this.locusUrl = meetingInfo.body.locusUrl || this.locusUrl;
2351
- this.setSipUri(this.config.experimental.enableUnifiedMeetings ? meetingInfo.body.sipUrl : meetingInfo.body.sipMeetingUri || this.sipUri);
2350
+ if (webexMeetingInfo && !(meetingInfo.errors && meetingInfo.errors.length > 0)) {
2351
+ this.conversationUrl = webexMeetingInfo.conversationUrl || this.conversationUrl;
2352
+ this.locusUrl = webexMeetingInfo.locusUrl || this.locusUrl;
2353
+ this.setSipUri(this.config.experimental.enableUnifiedMeetings ? webexMeetingInfo.sipUrl : webexMeetingInfo.sipMeetingUri || this.sipUri);
2352
2354
  if (this.config.experimental.enableUnifiedMeetings) {
2353
- this.meetingNumber = meetingInfo.body.meetingNumber;
2355
+ this.meetingNumber = webexMeetingInfo.meetingNumber;
2356
+ this.meetingJoinUrl = webexMeetingInfo.meetingJoinUrl;
2354
2357
  }
2355
- this.owner = meetingInfo.body.owner || meetingInfo.body.hostId || this.owner;
2358
+ this.owner = webexMeetingInfo.owner || webexMeetingInfo.hostId || this.owner;
2359
+ this.permissionToken = webexMeetingInfo.permissionToken;
2356
2360
  }
2357
2361
  }
2358
2362
 
@@ -2491,8 +2495,8 @@ export default class Meeting extends StatelessWebexPlugin {
2491
2495
  }
2492
2496
  else {
2493
2497
  trackMediaID = null;
2494
- Metrics.sendOperationalMetric(
2495
- METRICS_OPERATIONAL_MEASURES.MUTE_AUDIO_FAILURE,
2498
+ Metrics.sendBehavioralMetric(
2499
+ BEHAVIORAL_METRICS.MUTE_AUDIO_FAILURE,
2496
2500
  {
2497
2501
  correlation_id: this.correlationId,
2498
2502
  locus_id: this.locusUrl.split('/').pop()
@@ -2901,6 +2905,12 @@ export default class Meeting extends StatelessWebexPlugin {
2901
2905
  event: eventType.MERCURY_CONNECTION_RESTORED,
2902
2906
  meeting: this
2903
2907
  });
2908
+ Metrics.sendBehavioralMetric(
2909
+ BEHAVIORAL_METRICS.MERCURY_CONNECTION_RESTORED,
2910
+ {
2911
+ correlation_id: this.correlationId
2912
+ }
2913
+ );
2904
2914
  }
2905
2915
  this.hasWebsocketConnected = true;
2906
2916
  });
@@ -2911,8 +2921,8 @@ export default class Meeting extends StatelessWebexPlugin {
2911
2921
  event: eventType.MERCURY_CONNECTION_LOST,
2912
2922
  meeting: this
2913
2923
  });
2914
- Metrics.sendOperationalMetric(
2915
- METRICS_OPERATIONAL_MEASURES.MERCURY_CONNECTION_FAILURE,
2924
+ Metrics.sendBehavioralMetric(
2925
+ BEHAVIORAL_METRICS.MERCURY_CONNECTION_FAILURE,
2916
2926
  {
2917
2927
  correlation_id: this.correlationId
2918
2928
  }
@@ -2989,8 +2999,8 @@ export default class Meeting extends StatelessWebexPlugin {
2989
2999
  data: {trigger: trigger.USER_INTERACTION, mediaType: mediaType.AUDIO}
2990
3000
  });
2991
3001
  }).catch((error) => {
2992
- Metrics.sendOperationalMetric(
2993
- METRICS_OPERATIONAL_MEASURES.MUTE_AUDIO_FAILURE,
3002
+ Metrics.sendBehavioralMetric(
3003
+ BEHAVIORAL_METRICS.MUTE_AUDIO_FAILURE,
2994
3004
  {
2995
3005
  correlation_id: this.correlationId,
2996
3006
  locus_id: this.locusUrl.split('/').pop(),
@@ -3040,8 +3050,8 @@ export default class Meeting extends StatelessWebexPlugin {
3040
3050
  data: {trigger: trigger.USER_INTERACTION, mediaType: mediaType.AUDIO}
3041
3051
  });
3042
3052
  }).catch((error) => {
3043
- Metrics.sendOperationalMetric(
3044
- METRICS_OPERATIONAL_MEASURES.UNMUTE_AUDIO_FAILURE,
3053
+ Metrics.sendBehavioralMetric(
3054
+ BEHAVIORAL_METRICS.UNMUTE_AUDIO_FAILURE,
3045
3055
  {
3046
3056
  correlation_id: this.correlationId,
3047
3057
  locus_id: this.locusUrl.split('/').pop(),
@@ -3090,8 +3100,8 @@ export default class Meeting extends StatelessWebexPlugin {
3090
3100
  data: {trigger: trigger.USER_INTERACTION, mediaType: mediaType.VIDEO}
3091
3101
  });
3092
3102
  }).catch((error) => {
3093
- Metrics.sendOperationalMetric(
3094
- METRICS_OPERATIONAL_MEASURES.MUTE_VIDEO_FAILURE,
3103
+ Metrics.sendBehavioralMetric(
3104
+ BEHAVIORAL_METRICS.MUTE_VIDEO_FAILURE,
3095
3105
  {
3096
3106
  correlation_id: this.correlationId,
3097
3107
  locus_id: this.locusUrl.split('/').pop(),
@@ -3140,8 +3150,8 @@ export default class Meeting extends StatelessWebexPlugin {
3140
3150
  data: {trigger: trigger.USER_INTERACTION, mediaType: mediaType.VIDEO}
3141
3151
  });
3142
3152
  }).catch((error) => {
3143
- Metrics.sendOperationalMetric(
3144
- METRICS_OPERATIONAL_MEASURES.UNMUTE_VIDEO_FAILURE,
3153
+ Metrics.sendBehavioralMetric(
3154
+ BEHAVIORAL_METRICS.UNMUTE_VIDEO_FAILURE,
3145
3155
  {
3146
3156
  correlation_id: this.correlationId,
3147
3157
  locus_id: this.locusUrl.split('/').pop(),
@@ -3203,8 +3213,8 @@ export default class Meeting extends StatelessWebexPlugin {
3203
3213
  .catch((error) => {
3204
3214
  LoggerProxy.logger.error('Meeting:index#joinWithMedia --> ', error);
3205
3215
 
3206
- Metrics.sendOperationalMetric(
3207
- METRICS_OPERATIONAL_MEASURES.JOIN_WITH_MEDIA_FAILURE,
3216
+ Metrics.sendBehavioralMetric(
3217
+ BEHAVIORAL_METRICS.JOIN_WITH_MEDIA_FAILURE,
3208
3218
  {
3209
3219
  correlation_id: this.correlationId,
3210
3220
  locus_id: this.locusUrl.split('/').pop(),
@@ -3293,8 +3303,8 @@ export default class Meeting extends StatelessWebexPlugin {
3293
3303
 
3294
3304
  LoggerProxy.logger.error('Meeting:index#reconnect --> Meeting reconnect failed', error);
3295
3305
 
3296
- Metrics.sendOperationalMetric(
3297
- METRICS_OPERATIONAL_MEASURES.MEETING_RECONNECT_FAILURE,
3306
+ Metrics.sendBehavioralMetric(
3307
+ BEHAVIORAL_METRICS.MEETING_RECONNECT_FAILURE,
3298
3308
  {
3299
3309
  correlation_id: this.correlationId,
3300
3310
  locus_id: this.locusUrl.split('/').pop(),
@@ -3359,8 +3369,8 @@ export default class Meeting extends StatelessWebexPlugin {
3359
3369
 
3360
3370
  this.triggerStopReceivingTranscriptionEvent();
3361
3371
 
3362
- Metrics.sendOperationalMetric(
3363
- METRICS_OPERATIONAL_MEASURES.RECEIVE_TRANSCRIPTION_FAILURE,
3372
+ Metrics.sendBehavioralMetric(
3373
+ BEHAVIORAL_METRICS.RECEIVE_TRANSCRIPTION_FAILURE,
3364
3374
  {
3365
3375
  correlation_id: this.correlationId,
3366
3376
  reason: 'unexpected error: transcription LLM web socket connection error had occured.',
@@ -3423,8 +3433,8 @@ export default class Meeting extends StatelessWebexPlugin {
3423
3433
  }
3424
3434
  catch (error) {
3425
3435
  LoggerProxy.logger.error(`Meeting:index#receiveTranscription --> ${error}`);
3426
- Metrics.sendOperationalMetric(
3427
- METRICS_OPERATIONAL_MEASURES.RECEIVE_TRANSCRIPTION_FAILURE,
3436
+ Metrics.sendBehavioralMetric(
3437
+ BEHAVIORAL_METRICS.RECEIVE_TRANSCRIPTION_FAILURE,
3428
3438
  {
3429
3439
  correlation_id: this.correlationId,
3430
3440
  reason: error.message,
@@ -3516,13 +3526,6 @@ export default class Meeting extends StatelessWebexPlugin {
3516
3526
  data: {trigger: trigger.USER_INTERACTION}
3517
3527
  });
3518
3528
 
3519
- Metrics.sendOperationalMetric(
3520
- METRICS_OPERATIONAL_MEASURES.JOIN_ATTEMPT,
3521
- {
3522
- correlation_id: this.correlationId
3523
- }
3524
- );
3525
-
3526
3529
  LoggerProxy.logger.log('Meeting:index#join --> Joining a meeting');
3527
3530
 
3528
3531
  if (this.meetingFiniteStateMachine.state === MEETING_STATE_MACHINE.STATES.ENDED) {
@@ -3593,6 +3596,12 @@ export default class Meeting extends StatelessWebexPlugin {
3593
3596
  .then((join) => {
3594
3597
  joinSuccess(join);
3595
3598
  this.deferJoin = undefined;
3599
+ Metrics.sendBehavioralMetric(
3600
+ BEHAVIORAL_METRICS.JOIN_SUCCESS,
3601
+ {
3602
+ correlation_id: this.correlationId
3603
+ }
3604
+ );
3596
3605
 
3597
3606
  return join;
3598
3607
  }).then(async (join) => {
@@ -3616,8 +3625,8 @@ export default class Meeting extends StatelessWebexPlugin {
3616
3625
  LoggerProxy.logger.error('Meeting:index#join --> Failed', error);
3617
3626
 
3618
3627
  // TODO: change this to error codes and pre defined dictionary
3619
- Metrics.sendOperationalMetric(
3620
- METRICS_OPERATIONAL_MEASURES.JOIN_FAILURE,
3628
+ Metrics.sendBehavioralMetric(
3629
+ BEHAVIORAL_METRICS.JOIN_FAILURE,
3621
3630
  {
3622
3631
  correlation_id: this.correlationId,
3623
3632
  reason: error.error?.message,
@@ -3690,8 +3699,8 @@ export default class Meeting extends StatelessWebexPlugin {
3690
3699
  }).then((res) => {
3691
3700
  this.locusInfo.onFullLocus(res.body.locus);
3692
3701
  }).catch((error) => {
3693
- Metrics.sendOperationalMetric(
3694
- METRICS_OPERATIONAL_MEASURES.ADD_DIAL_IN_FAILURE,
3702
+ Metrics.sendBehavioralMetric(
3703
+ BEHAVIORAL_METRICS.ADD_DIAL_IN_FAILURE,
3695
3704
  {
3696
3705
  correlation_id: this.correlationId,
3697
3706
  dial_in_url: this.dialInUrl,
@@ -3729,8 +3738,8 @@ export default class Meeting extends StatelessWebexPlugin {
3729
3738
  }).then((res) => {
3730
3739
  this.locusInfo.onFullLocus(res.body.locus);
3731
3740
  }).catch((error) => {
3732
- Metrics.sendOperationalMetric(
3733
- METRICS_OPERATIONAL_MEASURES.ADD_DIAL_OUT_FAILURE,
3741
+ Metrics.sendBehavioralMetric(
3742
+ BEHAVIORAL_METRICS.ADD_DIAL_OUT_FAILURE,
3734
3743
  {
3735
3744
  correlation_id: this.correlationId,
3736
3745
  dial_out_url: this.dialOutUrl,
@@ -3956,10 +3965,10 @@ export default class Meeting extends StatelessWebexPlugin {
3956
3965
  )
3957
3966
  .catch((error) => {
3958
3967
  // Whenever there is a failure when trying to access a user's device
3959
- // report it as an operational metric
3968
+ // report it as an Behavioral metric
3960
3969
  // This gives visibility into common errors and can help
3961
3970
  // with further troubleshooting
3962
- const metricName = METRICS_OPERATIONAL_MEASURES.GET_USER_MEDIA_FAILURE;
3971
+ const metricName = BEHAVIORAL_METRICS.GET_USER_MEDIA_FAILURE;
3963
3972
  const data = {
3964
3973
  correlation_id: this.correlationId,
3965
3974
  locus_id: this.locusUrl?.split('/').pop(),
@@ -3970,7 +3979,7 @@ export default class Meeting extends StatelessWebexPlugin {
3970
3979
  type: error.name
3971
3980
  };
3972
3981
 
3973
- Metrics.sendOperationalMetric(metricName, data, metadata);
3982
+ Metrics.sendBehavioralMetric(metricName, data, metadata);
3974
3983
  throw new MediaError('Unable to retrieve media streams', error);
3975
3984
  }));
3976
3985
  }
@@ -4098,8 +4107,8 @@ export default class Meeting extends StatelessWebexPlugin {
4098
4107
  .catch((error) => {
4099
4108
  LoggerProxy.logger.error(`${LOG_HEADER} Error adding media , setting up peerconnection, `, error);
4100
4109
 
4101
- Metrics.sendOperationalMetric(
4102
- METRICS_OPERATIONAL_MEASURES.ADD_MEDIA_FAILURE,
4110
+ Metrics.sendBehavioralMetric(
4111
+ BEHAVIORAL_METRICS.ADD_MEDIA_FAILURE,
4103
4112
  {
4104
4113
  correlation_id: this.correlationId,
4105
4114
  locus_id: this.locusUrl.split('/').pop(),
@@ -4182,6 +4191,14 @@ export default class Meeting extends StatelessWebexPlugin {
4182
4191
  this.floorGrantPending = true;
4183
4192
  }
4184
4193
 
4194
+ Metrics.sendBehavioralMetric(
4195
+ BEHAVIORAL_METRICS.ADD_MEDIA_SUCCESS,
4196
+ {
4197
+ correlation_id: this.correlationId,
4198
+ locus_id: this.locusUrl.split('/').pop()
4199
+ }
4200
+ );
4201
+
4185
4202
  return Promise.resolve();
4186
4203
  }))
4187
4204
  .catch((error) => {
@@ -4197,8 +4214,8 @@ export default class Meeting extends StatelessWebexPlugin {
4197
4214
 
4198
4215
  LoggerProxy.logger.error(`${LOG_HEADER} Error adding media failed to initiate PC and send request, `, error);
4199
4216
 
4200
- Metrics.sendOperationalMetric(
4201
- METRICS_OPERATIONAL_MEASURES.ADD_MEDIA_FAILURE,
4217
+ Metrics.sendBehavioralMetric(
4218
+ BEHAVIORAL_METRICS.ADD_MEDIA_FAILURE,
4202
4219
  {
4203
4220
  correlation_id: this.correlationId,
4204
4221
  locus_id: this.locusUrl.split('/').pop(),
@@ -4351,8 +4368,8 @@ export default class Meeting extends StatelessWebexPlugin {
4351
4368
  .catch((error) => {
4352
4369
  LoggerProxy.logger.error(`${LOG_HEADER} Error updatedMedia, `, error);
4353
4370
 
4354
- Metrics.sendOperationalMetric(
4355
- METRICS_OPERATIONAL_MEASURES.UPDATE_MEDIA_FAILURE,
4371
+ Metrics.sendBehavioralMetric(
4372
+ BEHAVIORAL_METRICS.UPDATE_MEDIA_FAILURE,
4356
4373
  {
4357
4374
  correlation_id: this.correlationId,
4358
4375
  locus_id: this.locusUrl.split('/').pop(),
@@ -4750,8 +4767,8 @@ export default class Meeting extends StatelessWebexPlugin {
4750
4767
  EVENTS.REQUEST_UPLOAD_LOGS,
4751
4768
  this
4752
4769
  );
4753
- Metrics.sendOperationalMetric(
4754
- METRICS_OPERATIONAL_MEASURES.MEETING_LEAVE_FAILURE,
4770
+ Metrics.sendBehavioralMetric(
4771
+ BEHAVIORAL_METRICS.MEETING_LEAVE_FAILURE,
4755
4772
  {
4756
4773
  correlation_id: this.correlationId,
4757
4774
  locus_id: this.locusUrl.split('/').pop(),
@@ -4804,8 +4821,8 @@ export default class Meeting extends StatelessWebexPlugin {
4804
4821
  .catch((error) => {
4805
4822
  LoggerProxy.logger.error('Meeting:index#startWhiteboardShare --> Error ', error);
4806
4823
 
4807
- Metrics.sendOperationalMetric(
4808
- METRICS_OPERATIONAL_MEASURES.MEETING_START_WHITEBOARD_SHARE_FAILURE,
4824
+ Metrics.sendBehavioralMetric(
4825
+ BEHAVIORAL_METRICS.MEETING_START_WHITEBOARD_SHARE_FAILURE,
4809
4826
  {
4810
4827
  correlation_id: this.correlationId,
4811
4828
  locus_id: this.locusUrl.split('/').pop(),
@@ -4844,8 +4861,8 @@ export default class Meeting extends StatelessWebexPlugin {
4844
4861
  .catch((error) => {
4845
4862
  LoggerProxy.logger.error('Meeting:index#stopWhiteboardShare --> Error ', error);
4846
4863
 
4847
- Metrics.sendOperationalMetric(
4848
- METRICS_OPERATIONAL_MEASURES.STOP_WHITEBOARD_SHARE_FAILURE,
4864
+ Metrics.sendBehavioralMetric(
4865
+ BEHAVIORAL_METRICS.STOP_WHITEBOARD_SHARE_FAILURE,
4849
4866
  {
4850
4867
  correlation_id: this.correlationId,
4851
4868
  locus_id: this.locusUrl.split('/').pop(),
@@ -4891,8 +4908,8 @@ export default class Meeting extends StatelessWebexPlugin {
4891
4908
  .catch((error) => {
4892
4909
  LoggerProxy.logger.error('Meeting:index#share --> Error ', error);
4893
4910
 
4894
- Metrics.sendOperationalMetric(
4895
- METRICS_OPERATIONAL_MEASURES.MEETING_SHARE_FAILURE,
4911
+ Metrics.sendBehavioralMetric(
4912
+ BEHAVIORAL_METRICS.MEETING_SHARE_FAILURE,
4896
4913
  {
4897
4914
  correlation_id: this.correlationId,
4898
4915
  locus_id: this.locusUrl.split('/').pop(),
@@ -4954,8 +4971,8 @@ export default class Meeting extends StatelessWebexPlugin {
4954
4971
  .catch((error) => {
4955
4972
  LoggerProxy.logger.error('Meeting:index#stopFloorRequest --> Error ', error);
4956
4973
 
4957
- Metrics.sendOperationalMetric(
4958
- METRICS_OPERATIONAL_MEASURES.STOP_FLOOR_REQUEST_FAILURE,
4974
+ Metrics.sendBehavioralMetric(
4975
+ BEHAVIORAL_METRICS.STOP_FLOOR_REQUEST_FAILURE,
4959
4976
  {
4960
4977
  correlation_id: this.correlationId,
4961
4978
  locus_id: this.locusUrl.split('/').pop(),
@@ -5273,8 +5290,8 @@ export default class Meeting extends StatelessWebexPlugin {
5273
5290
 
5274
5291
  LoggerProxy.logger.error(`Meeting:index#setMeetingQuality --> ${error.message}`);
5275
5292
 
5276
- Metrics.sendOperationalMetric(
5277
- METRICS_OPERATIONAL_MEASURES.SET_MEETING_QUALITY_FAILURE,
5293
+ Metrics.sendBehavioralMetric(
5294
+ BEHAVIORAL_METRICS.SET_MEETING_QUALITY_FAILURE,
5278
5295
  {
5279
5296
  correlation_id: this.correlationId,
5280
5297
  locus_id: this.locusUrl.split('/').pop(),
@@ -5317,13 +5334,13 @@ export default class Meeting extends StatelessWebexPlugin {
5317
5334
  }))
5318
5335
  .catch((error) => {
5319
5336
  // Whenever there is a failure when trying to access a user's display
5320
- // report it as an operational metric
5337
+ // report it as an Behavioral metric
5321
5338
  // This gives visibility into common errors and can help
5322
5339
  // with further troubleshooting
5323
5340
 
5324
5341
  // This metrics will get erros for getDisplayMedia and share errors for now
5325
5342
  // TODO: The getDisplayMedia errors need to be moved inside `media.getDisplayMedia`
5326
- const metricName = METRICS_OPERATIONAL_MEASURES.GET_DISPLAY_MEDIA_FAILURE;
5343
+ const metricName = BEHAVIORAL_METRICS.GET_DISPLAY_MEDIA_FAILURE;
5327
5344
  const data = {
5328
5345
  correlation_id: this.correlationId,
5329
5346
  locus_id: this.locusUrl.split('/').pop(),
@@ -5334,7 +5351,7 @@ export default class Meeting extends StatelessWebexPlugin {
5334
5351
  type: error.name
5335
5352
  };
5336
5353
 
5337
- Metrics.sendOperationalMetric(metricName, data, metadata);
5354
+ Metrics.sendBehavioralMetric(metricName, data, metadata);
5338
5355
  throw new MediaError('Unable to retrieve display media stream', error);
5339
5356
  });
5340
5357
  }
@@ -50,8 +50,9 @@ export default class MeetingRequest extends StatelessWebexPlugin {
50
50
  async joinMeeting(options) {
51
51
  const {
52
52
  asResourceOccupant,
53
- sipUri,
53
+ inviteeAddress,
54
54
  meetingNumber,
55
+ permissionToken,
55
56
  deviceUrl,
56
57
  locusUrl,
57
58
  resourceId,
@@ -98,6 +99,10 @@ export default class MeetingRequest extends StatelessWebexPlugin {
98
99
  body.moderator = moderator;
99
100
  }
100
101
 
102
+ if (permissionToken) {
103
+ body.permissionToken = permissionToken;
104
+ }
105
+
101
106
  if (pin !== undefined) {
102
107
  body.pin = pin;
103
108
  }
@@ -105,16 +110,16 @@ export default class MeetingRequest extends StatelessWebexPlugin {
105
110
  if (locusUrl) {
106
111
  url = `${locusUrl}/${PARTICIPANT}`;
107
112
  }
108
- else if (sipUri || meetingNumber) {
113
+ else if (inviteeAddress || meetingNumber) {
109
114
  try {
110
115
  await this.webex.internal.services.waitForCatalog('postauth');
111
116
  url = `${this.webex.internal.services.get('locus')}/${LOCI}/${CALL}`;
112
117
  body.invitee = {
113
- address: sipUri || `wbxmn:${meetingNumber}`
118
+ address: inviteeAddress || `wbxmn:${meetingNumber}`
114
119
  };
115
120
  }
116
121
  catch (e) {
117
- LoggerProxy.logger.error(`Meeting:request#joinMeeting ${sipUri ? 'sipUri' : 'meetingNumber'} --> ${e}`);
122
+ LoggerProxy.logger.error(`Meeting:request#joinMeeting Error Joining ${inviteeAddress || meetingNumber} --> ${e}`);
118
123
  throw (e);
119
124
  }
120
125
  }
@@ -123,7 +128,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
123
128
  // TODO: -- this will be resolved in SDK request
124
129
  url = url.concat(`?${ALTERNATE_REDIRECT_TRUE}`);
125
130
 
126
- if (resourceId === sipUri) {
131
+ if (resourceId === inviteeAddress) {
127
132
  body.callPreferences = {
128
133
  requestedMedia: [_SLIDES_]
129
134
  };
@@ -90,12 +90,13 @@ MeetingUtil.joinMeeting = (meeting, options) => {
90
90
  // if Joining state termintate the request as user might click multiple times
91
91
  return meeting.meetingRequest
92
92
  .joinMeeting({
93
- sipUri: meeting.sipUri,
93
+ inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,
94
94
  meetingNumber: meeting.meetingNumber,
95
95
  deviceUrl: meeting.deviceUrl,
96
96
  locusUrl: meeting.locusUrl,
97
97
  correlationId: meeting.correlationId,
98
98
  roapMessage: options.roapMessage,
99
+ permissionToken: meeting.permissionToken,
99
100
  resourceId: options.resourceId || null,
100
101
  moderator: options.moderator,
101
102
  pin: options.pin,
@@ -38,7 +38,7 @@ import {
38
38
  MEETING_REMOVED_REASON,
39
39
  _CONVERSATION_URL_,
40
40
  CONVERSATION_URL,
41
- METRICS_OPERATIONAL_MEASURES
41
+ BEHAVIORAL_METRICS
42
42
  } from '../constants';
43
43
  import MeetingInfo from '../meeting-info';
44
44
  import MeetingInfoV2 from '../meeting-info/meeting-info-v2';
@@ -456,10 +456,21 @@ export default class Meetings extends WebexPlugin {
456
456
  EVENT_TRIGGERS.MEETINGS_REGISTERED
457
457
  );
458
458
  this.registered = true;
459
+ Metrics.sendBehavioralMetric(
460
+ BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_SUCCESS,
461
+ );
459
462
  })
460
463
  .catch((error) => {
461
464
  LoggerProxy.logger.error(`Meetings:index#register --> ERROR, Unable to register, ${error.message}`);
462
465
 
466
+ Metrics.sendBehavioralMetric(
467
+ BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_FAILED,
468
+ {
469
+ reason: error.message,
470
+ stack: error.stack
471
+ }
472
+ );
473
+
463
474
  return Promise.reject(error);
464
475
  });
465
476
  }
@@ -542,8 +553,8 @@ export default class Meetings extends WebexPlugin {
542
553
  }
543
554
  );
544
555
 
545
- Metrics.sendOperationalMetric(
546
- METRICS_OPERATIONAL_MEASURES.UPLOAD_LOGS_FAILURE,
556
+ Metrics.sendBehavioralMetric(
557
+ BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE,
547
558
  {
548
559
  meetingId: options.meetingsId,
549
560
  reason: uploadError.message,
@@ -320,3 +320,4 @@ export const OS_NAME = {
320
320
  };
321
321
 
322
322
  export const CLIENT_NAME = 'webex-js-sdk';
323
+ export const PLATFORM = 'Web';
@@ -14,7 +14,7 @@ import BrowserDetection from '../common/browser-detection';
14
14
 
15
15
  import {
16
16
  error, eventType, errorCodes as ERROR_CODE, OS_NAME, UNKNOWN, CLIENT_NAME,
17
- mediaType
17
+ mediaType, PLATFORM
18
18
  } from './config';
19
19
 
20
20
  const OSMap = {
@@ -489,11 +489,11 @@ class Metrics {
489
489
  }
490
490
 
491
491
  /**
492
- * Uploads given metric to the Metrics service as an operational metric.
492
+ * Uploads given metric to the Metrics service as an Behavioral metric.
493
493
  * Metadata about the environment such as browser, OS, SDK and their versions
494
494
  * are automatically added when the metric is sent.
495
495
  *
496
- * The Metrics service will send an operational metric to InfluxDB for
496
+ * The Metrics service will send an Behavioral metric to InfluxDB for
497
497
  * aggregation.
498
498
  * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.
499
499
  *
@@ -503,12 +503,24 @@ class Metrics {
503
503
  *
504
504
  * @returns {void}
505
505
  */
506
- sendOperationalMetric(metricName, metricFields = {}, metricTags = {}) {
506
+ sendBehavioralMetric(metricName, metricFields = {}, metricTags = {}) {
507
507
  const fields = {
508
508
  ...metricFields,
509
509
  browser_version: getBrowserVersion(),
510
510
  os_version: getOSVersion(),
511
- sdk_version: this.webex.version
511
+ sdk_version: this.webex.version,
512
+ platform: PLATFORM
513
+ };
514
+
515
+ const context = {
516
+ app: {
517
+ version: this.webex.version
518
+ },
519
+ locale: 'en-US',
520
+ os: {
521
+ name: getOSName(),
522
+ version: getOSVersion()
523
+ }
512
524
  };
513
525
 
514
526
  const tags = {
@@ -517,17 +529,19 @@ class Metrics {
517
529
  org_id: this.webex.credentials.getOrgId(),
518
530
  os: getOSName(),
519
531
  domain: window.location.hostname,
520
- client_id: this.webex.credentials.config.client_id
532
+ client_id: this.webex.credentials.config.client_id,
533
+ user_id: this.webex.internal.device.userId
521
534
  };
522
535
 
523
536
  if (!metricName) {
524
- throw Error('Missing operational metric name. Please provide one');
537
+ throw Error('Missing behavioral metric name. Please provide one');
525
538
  }
526
539
 
527
540
  this.webex.internal.metrics.submitClientMetrics(metricName, {
528
- type: ['operational'],
541
+ type: ['behavioral', 'operational'],
529
542
  fields,
530
- tags
543
+ tags,
544
+ context
531
545
  });
532
546
  }
533
547
  }