@webex/plugin-meetings 3.0.0-beta.251 → 3.0.0-beta.253

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.
@@ -71,20 +71,37 @@ export default class MeetingInfo {
71
71
  * @memberof MeetingInfo
72
72
  */
73
73
  private requestFetchInfo(options: any) {
74
- const {meetingId} = options;
75
- if (meetingId) {
74
+ const {meetingId, sendCAevents} = options;
75
+ if (meetingId && sendCAevents) {
76
76
  this.webex.internal.newMetrics.submitInternalEvent({
77
77
  name: 'internal.client.meetinginfo.request',
78
78
  });
79
+ this.webex.internal.newMetrics.submitClientEvent({
80
+ name: 'client.meetinginfo.request',
81
+ options: {
82
+ meetingId,
83
+ },
84
+ });
79
85
  }
80
86
 
81
87
  return this.meetingInfoRequest
82
88
  .fetchMeetingInfo(options)
83
89
  .then((info) => {
84
- if (meetingId) {
90
+ if (meetingId && sendCAevents) {
85
91
  this.webex.internal.newMetrics.submitInternalEvent({
86
92
  name: 'internal.client.meetinginfo.response',
87
93
  });
94
+ this.webex.internal.newMetrics.submitClientEvent({
95
+ name: 'client.meetinginfo.response',
96
+ payload: {
97
+ identifiers: {
98
+ meetingLookupUrl: info?.url,
99
+ },
100
+ },
101
+ options: {
102
+ meetingId,
103
+ },
104
+ });
88
105
  }
89
106
  if (info && info.body) {
90
107
  this.setMeetingInfo(info.body.sipMeetingUri || info.body.meetingLink, info.body);
@@ -96,21 +113,23 @@ export default class MeetingInfo {
96
113
  LoggerProxy.logger.error(
97
114
  `Meeting-info:index#requestFetchInfo --> ${error} fetch meetingInfo`
98
115
  );
99
- this.webex.internal.newMetrics.submitInternalEvent({
100
- name: 'internal.client.meetinginfo.response',
101
- });
102
- this.webex.internal.newMetrics.submitClientEvent({
103
- name: 'client.meetinginfo.response',
104
- payload: {
105
- identifiers: {
106
- meetingLookupUrl: error?.url,
116
+ if (meetingId && sendCAevents) {
117
+ this.webex.internal.newMetrics.submitInternalEvent({
118
+ name: 'internal.client.meetinginfo.response',
119
+ });
120
+ this.webex.internal.newMetrics.submitClientEvent({
121
+ name: 'client.meetinginfo.response',
122
+ payload: {
123
+ identifiers: {
124
+ meetingLookupUrl: error?.url,
125
+ },
126
+ },
127
+ options: {
128
+ meetingId,
129
+ rawError: error,
107
130
  },
108
- },
109
- options: {
110
- meetingId,
111
- rawError: error,
112
- },
113
- });
131
+ });
132
+ }
114
133
 
115
134
  return Promise.reject(error);
116
135
  });
@@ -137,6 +156,12 @@ export default class MeetingInfo {
137
156
  * Fetches meeting info from the server
138
157
  * @param {String} destination one of many different types of destinations to look up info for
139
158
  * @param {String} [type] to match up with the destination value
159
+ * @param {String} [password] meeting password
160
+ * @param {Object} [captchaInfo] captcha code and id
161
+ * @param {String} [installedOrgID]
162
+ * @param {String} [locusId]
163
+ * @param {Object} [extraParams]
164
+ * @param {Boolean} [options] meeting Id and whether Call Analyzer events should be sent
140
165
  * @returns {Promise} returns a meeting info object
141
166
  * @public
142
167
  * @memberof MeetingInfo
@@ -157,7 +182,7 @@ export default class MeetingInfo {
157
182
  locusId = null,
158
183
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
159
184
  extraParams: object = {},
160
- options: {meetingId?: string} = {}
185
+ options: {meetingId?: string; sendCAevents?: boolean} = {}
161
186
  ) {
162
187
  if (type === _PERSONAL_ROOM_ && !destination) {
163
188
  destination = this.webex.internal.device.userId;
@@ -166,13 +191,13 @@ export default class MeetingInfo {
166
191
  return this.fetchInfoOptions(MeetingInfoUtil.extractDestination(destination, type), type).then(
167
192
  (infoOptions) =>
168
193
  // fetch meeting info
169
- this.requestFetchInfo({...infoOptions, meetingId: options.meetingId}).catch((error) => {
194
+ this.requestFetchInfo({...infoOptions, ...options}).catch((error) => {
170
195
  // if it failed the first time as meeting link
171
196
  if (infoOptions.type === _MEETING_LINK_) {
172
197
  // convert the meeting link to sip URI and retry
173
198
  return this.requestFetchInfo({
174
199
  ...this.fetchInfoOptions(MeetingInfoUtil.convertLinkToSip(destination), _SIP_URI_),
175
- meetingId: options.meetingId,
200
+ ...options,
176
201
  });
177
202
  }
178
203
 
@@ -279,9 +279,9 @@ export default class MeetingInfoV2 {
279
279
  installedOrgID = null,
280
280
  locusId = null,
281
281
  extraParams: object = {},
282
- options: {meetingId?: string} = {}
282
+ options: {meetingId?: string; sendCAevents?: boolean} = {}
283
283
  ) {
284
- const {meetingId} = options;
284
+ const {meetingId, sendCAevents} = options;
285
285
 
286
286
  const destinationType = await MeetingInfoUtil.getDestinationType({
287
287
  destination,
@@ -336,29 +336,49 @@ export default class MeetingInfoV2 {
336
336
  requestOptions.resource = 'meetingInfo';
337
337
  }
338
338
 
339
- if (meetingId) {
339
+ if (meetingId && sendCAevents) {
340
340
  this.webex.internal.newMetrics.submitInternalEvent({
341
341
  name: 'internal.client.meetinginfo.request',
342
342
  });
343
+
344
+ this.webex.internal.newMetrics.submitClientEvent({
345
+ name: 'client.meetinginfo.request',
346
+ options: {
347
+ meetingId,
348
+ },
349
+ });
343
350
  }
344
351
 
345
352
  return this.webex
346
353
  .request(requestOptions)
347
354
  .then((response) => {
348
- if (meetingId) {
355
+ if (meetingId && sendCAevents) {
349
356
  this.webex.internal.newMetrics.submitInternalEvent({
350
357
  name: 'internal.client.meetinginfo.response',
351
358
  });
359
+
360
+ this.webex.internal.newMetrics.submitClientEvent({
361
+ name: 'client.meetinginfo.response',
362
+ payload: {
363
+ identifiers: {
364
+ meetingLookupUrl: response?.url,
365
+ },
366
+ },
367
+ options: {
368
+ meetingId,
369
+ },
370
+ });
352
371
  }
353
372
  Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS);
354
373
 
355
374
  return response;
356
375
  })
357
376
  .catch((err) => {
358
- if (meetingId) {
377
+ if (meetingId && sendCAevents) {
359
378
  this.webex.internal.newMetrics.submitInternalEvent({
360
379
  name: 'internal.client.meetinginfo.response',
361
380
  });
381
+
362
382
  this.webex.internal.newMetrics.submitClientEvent({
363
383
  name: 'client.meetinginfo.response',
364
384
  payload: {
@@ -1219,12 +1219,19 @@ export default class Meetings extends WebexPlugin {
1219
1219
 
1220
1220
  if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {
1221
1221
  meeting.fetchMeetingInfoTimeoutId = setTimeout(
1222
- () => meeting.fetchMeetingInfo({extraParams: infoExtraParams}),
1222
+ () =>
1223
+ meeting.fetchMeetingInfo({
1224
+ extraParams: infoExtraParams,
1225
+ sendCAevents: !!correlationId, // if client sends correlation id as argument of public create(), then it means that this meeting creation is part of a pre-join intent from user
1226
+ }),
1223
1227
  waitingTime
1224
1228
  );
1225
1229
  meeting.parseMeetingInfo(undefined, destination);
1226
1230
  } else {
1227
- await meeting.fetchMeetingInfo({extraParams: infoExtraParams});
1231
+ await meeting.fetchMeetingInfo({
1232
+ extraParams: infoExtraParams,
1233
+ sendCAevents: !!correlationId, // if client sends correlation id as argument of public create(), then it means that this meeting creation is part of a pre-join intent from user
1234
+ });
1228
1235
  }
1229
1236
  } catch (err) {
1230
1237
  if (
@@ -856,75 +856,8 @@ describe('plugin-meetings', () => {
856
856
  sinon.assert.called(setCorrelationIdSpy);
857
857
  assert.equal(meeting.correlationId, '123');
858
858
  });
859
-
860
- it('should send Meeting Info CA events if meetingInfo is not empty', async () => {
861
- meeting.meetingInfo = {info: 'info', meetingLookupUrl: 'url'};
862
-
863
- const join = meeting.join();
864
-
865
- assert.calledWithMatch(webex.internal.newMetrics.submitClientEvent, {
866
- name: 'client.call.initiated',
867
- payload: {trigger: 'user-interaction', isRoapCallEnabled: true},
868
- options: {meetingId: meeting.id},
869
- });
870
-
871
- assert.exists(join.then);
872
- const result = await join;
873
-
874
- assert.calledOnce(MeetingUtil.joinMeeting);
875
- assert.calledOnce(meeting.setLocus);
876
- assert.equal(result, joinMeetingResult);
877
-
878
- assert.calledThrice(webex.internal.newMetrics.submitClientEvent);
879
-
880
- assert.deepEqual(webex.internal.newMetrics.submitClientEvent.getCall(0).args[0], {
881
- name: 'client.call.initiated',
882
- payload: {
883
- trigger: 'user-interaction',
884
- isRoapCallEnabled: true,
885
- },
886
- options: {meetingId: meeting.id},
887
- });
888
-
889
- assert.deepEqual(webex.internal.newMetrics.submitClientEvent.getCall(1).args[0], {
890
- name: 'client.meetinginfo.request',
891
- options: {meetingId: meeting.id},
892
- });
893
- assert.deepEqual(webex.internal.newMetrics.submitClientEvent.getCall(2).args[0], {
894
- name: 'client.meetinginfo.response',
895
- payload: {
896
- identifiers: {meetingLookupUrl: 'url'},
897
- },
898
- options: {meetingId: meeting.id},
899
- });
900
- });
901
-
902
- it('should not send Meeting Info CA events if meetingInfo is empty', async () => {
903
- meeting.meetingInfo = {};
904
-
905
- const join = meeting.join();
906
-
907
- assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
908
- name: 'client.call.initiated',
909
- payload: {trigger: 'user-interaction', isRoapCallEnabled: true},
910
- options: {meetingId: meeting.id},
911
- });
912
-
913
- assert.exists(join.then);
914
- const result = await join;
915
-
916
- assert.calledOnce(MeetingUtil.joinMeeting);
917
- assert.calledOnce(meeting.setLocus);
918
- assert.equal(result, joinMeetingResult);
919
-
920
- assert.calledOnce(webex.internal.newMetrics.submitClientEvent);
921
-
922
- assert.equal(
923
- webex.internal.newMetrics.submitClientEvent.getCall(0).args[0].name,
924
- 'client.call.initiated'
925
- );
926
- });
927
859
  });
860
+
928
861
  describe('failure', () => {
929
862
  beforeEach(() => {
930
863
  sandbox.stub(MeetingUtil, 'joinMeeting').returns(Promise.reject());
@@ -3153,7 +3086,7 @@ describe('plugin-meetings', () => {
3153
3086
  beforeEach(() => {
3154
3087
  meeting.locusId = 'locus-id';
3155
3088
  meeting.id = 'meeting-id';
3156
- FAKE_OPTIONS = {meetingId: meeting.id};
3089
+ FAKE_OPTIONS = {meetingId: meeting.id, sendCAevents: true};
3157
3090
  });
3158
3091
 
3159
3092
  it('calls meetingInfoProvider with all the right parameters and parses the result', async () => {
@@ -3173,6 +3106,7 @@ describe('plugin-meetings', () => {
3173
3106
  password: FAKE_PASSWORD,
3174
3107
  captchaCode: FAKE_CAPTCHA_CODE,
3175
3108
  extraParams: FAKE_EXTRA_PARAMS,
3109
+ sendCAevents: true,
3176
3110
  });
3177
3111
 
3178
3112
  assert.calledWith(
@@ -3224,7 +3158,7 @@ describe('plugin-meetings', () => {
3224
3158
  const clock = sinon.useFakeTimers();
3225
3159
  const clearTimeoutSpy = sinon.spy(clock, 'clearTimeout');
3226
3160
 
3227
- await meeting.fetchMeetingInfo({});
3161
+ await meeting.fetchMeetingInfo({sendCAevents: false});
3228
3162
 
3229
3163
  // clear timer
3230
3164
  assert.calledWith(clearTimeoutSpy, FAKE_TIMEOUT_FETCHMEETINGINFO_ID);
@@ -3241,7 +3175,7 @@ describe('plugin-meetings', () => {
3241
3175
  undefined,
3242
3176
  meeting.locusId,
3243
3177
  {},
3244
- {meetingId: meeting.id}
3178
+ {meetingId: meeting.id, sendCAevents: false}
3245
3179
  );
3246
3180
 
3247
3181
  // parseMeeting info
@@ -3320,7 +3254,7 @@ describe('plugin-meetings', () => {
3320
3254
  .throws(new MeetingInfoV2PasswordError(403004, FAKE_MEETING_INFO)),
3321
3255
  };
3322
3256
 
3323
- await assert.isRejected(meeting.fetchMeetingInfo({}), PasswordError);
3257
+ await assert.isRejected(meeting.fetchMeetingInfo({sendCAevents: true}), PasswordError);
3324
3258
 
3325
3259
  assert.calledWith(
3326
3260
  meeting.attrs.meetingInfoProvider.fetchMeetingInfo,
@@ -3331,7 +3265,7 @@ describe('plugin-meetings', () => {
3331
3265
  undefined,
3332
3266
  'locus-id',
3333
3267
  {},
3334
- {meetingId: meeting.id}
3268
+ {meetingId: meeting.id, sendCAevents: true}
3335
3269
  );
3336
3270
 
3337
3271
  assert.deepEqual(meeting.meetingInfo, FAKE_MEETING_INFO);
@@ -3353,7 +3287,7 @@ describe('plugin-meetings', () => {
3353
3287
  .throws(new MeetingInfoV2PolicyError(123456, FAKE_MEETING_INFO, 'a message')),
3354
3288
  };
3355
3289
 
3356
- await assert.isRejected(meeting.fetchMeetingInfo({}), PermissionError);
3290
+ await assert.isRejected(meeting.fetchMeetingInfo({sendCAevents: true}), PermissionError);
3357
3291
 
3358
3292
  assert.calledWith(
3359
3293
  meeting.attrs.meetingInfoProvider.fetchMeetingInfo,
@@ -3364,7 +3298,7 @@ describe('plugin-meetings', () => {
3364
3298
  undefined,
3365
3299
  'locus-id',
3366
3300
  {},
3367
- {meetingId: meeting.id}
3301
+ {meetingId: meeting.id, sendCAevents: true}
3368
3302
  );
3369
3303
 
3370
3304
  assert.deepEqual(meeting.meetingInfo, FAKE_MEETING_INFO);
@@ -3385,6 +3319,7 @@ describe('plugin-meetings', () => {
3385
3319
  await assert.isRejected(
3386
3320
  meeting.fetchMeetingInfo({
3387
3321
  password: 'aaa',
3322
+ sendCAevents: true
3388
3323
  }),
3389
3324
  CaptchaError
3390
3325
  );
@@ -3398,7 +3333,7 @@ describe('plugin-meetings', () => {
3398
3333
  undefined,
3399
3334
  'locus-id',
3400
3335
  {},
3401
- {meetingId: meeting.id}
3336
+ {meetingId: meeting.id, sendCAevents: true}
3402
3337
  );
3403
3338
 
3404
3339
  assert.deepEqual(meeting.meetingInfo, {});
@@ -3430,6 +3365,7 @@ describe('plugin-meetings', () => {
3430
3365
  meeting.fetchMeetingInfo({
3431
3366
  password: 'aaa',
3432
3367
  captchaCode: 'bbb',
3368
+ sendCAevents: true,
3433
3369
  }),
3434
3370
  CaptchaError
3435
3371
  );
@@ -3443,7 +3379,7 @@ describe('plugin-meetings', () => {
3443
3379
  undefined,
3444
3380
  'locus-id',
3445
3381
  {},
3446
- {meetingId: meeting.id}
3382
+ {meetingId: meeting.id, sendCAevents: true}
3447
3383
  );
3448
3384
 
3449
3385
  assert.deepEqual(meeting.meetingInfo, {});
@@ -3465,6 +3401,7 @@ describe('plugin-meetings', () => {
3465
3401
 
3466
3402
  await meeting.fetchMeetingInfo({
3467
3403
  password: 'aaa',
3404
+ sendCAevents: true,
3468
3405
  });
3469
3406
 
3470
3407
  assert.calledWith(
@@ -3476,7 +3413,7 @@ describe('plugin-meetings', () => {
3476
3413
  undefined,
3477
3414
  'locus-id',
3478
3415
  {},
3479
- {meetingId: meeting.id}
3416
+ {meetingId: meeting.id, sendCAevents: true}
3480
3417
  );
3481
3418
 
3482
3419
  assert.deepEqual(meeting.meetingInfo, {
@@ -3516,6 +3453,7 @@ describe('plugin-meetings', () => {
3516
3453
  meeting.fetchMeetingInfo({
3517
3454
  password: 'aaa',
3518
3455
  captchaCode: 'bbb',
3456
+ sendCAevents: true,
3519
3457
  })
3520
3458
  );
3521
3459
 
@@ -3528,7 +3466,7 @@ describe('plugin-meetings', () => {
3528
3466
  undefined,
3529
3467
  'locus-id',
3530
3468
  {},
3531
- {meetingId: meeting.id}
3469
+ {meetingId: meeting.id, sendCAevents: true}
3532
3470
  );
3533
3471
 
3534
3472
  assert.deepEqual(meeting.meetingInfo, FAKE_MEETING_INFO);
@@ -3622,6 +3560,7 @@ describe('plugin-meetings', () => {
3622
3560
  assert.calledWith(meeting.fetchMeetingInfo, {
3623
3561
  password: 'password',
3624
3562
  captchaCode: 'captcha id',
3563
+ sendCAevents: false,
3625
3564
  });
3626
3565
  });
3627
3566
  it('handles PasswordError returned by fetchMeetingInfo', async () => {