@webex/plugin-meetings 3.5.0-wxcc.1 → 3.6.0-next.1

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 (52) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/config.js +4 -1
  4. package/dist/config.js.map +1 -1
  5. package/dist/constants.js +1 -0
  6. package/dist/constants.js.map +1 -1
  7. package/dist/interpretation/index.js +1 -1
  8. package/dist/interpretation/siLanguage.js +1 -1
  9. package/dist/media/index.js +3 -1
  10. package/dist/media/index.js.map +1 -1
  11. package/dist/meeting/in-meeting-actions.js +3 -1
  12. package/dist/meeting/in-meeting-actions.js.map +1 -1
  13. package/dist/meeting/index.js +39 -4
  14. package/dist/meeting/index.js.map +1 -1
  15. package/dist/meeting/util.js +8 -10
  16. package/dist/meeting/util.js.map +1 -1
  17. package/dist/meetings/index.js +100 -26
  18. package/dist/meetings/index.js.map +1 -1
  19. package/dist/roap/request.js +1 -1
  20. package/dist/roap/request.js.map +1 -1
  21. package/dist/types/config.d.ts +2 -0
  22. package/dist/types/constants.d.ts +2 -1
  23. package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
  24. package/dist/types/meeting/index.d.ts +11 -0
  25. package/dist/types/meetings/index.d.ts +43 -2
  26. package/dist/webinar/index.js +1 -1
  27. package/package.json +22 -22
  28. package/src/config.ts +3 -0
  29. package/src/constants.ts +1 -0
  30. package/src/media/index.ts +4 -1
  31. package/src/meeting/in-meeting-actions.ts +3 -0
  32. package/src/meeting/index.ts +42 -2
  33. package/src/meeting/util.ts +27 -31
  34. package/src/meetings/index.ts +126 -37
  35. package/src/roap/request.ts +3 -1
  36. package/test/unit/spec/media/index.ts +4 -0
  37. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
  38. package/test/unit/spec/meeting/index.js +58 -17
  39. package/test/unit/spec/meeting/utils.js +50 -85
  40. package/test/unit/spec/meetings/index.js +128 -13
  41. package/dist/networkQualityMonitor/index.js +0 -227
  42. package/dist/networkQualityMonitor/index.js.map +0 -1
  43. package/dist/rtcMetrics/constants.js +0 -11
  44. package/dist/rtcMetrics/constants.js.map +0 -1
  45. package/dist/rtcMetrics/index.js +0 -197
  46. package/dist/rtcMetrics/index.js.map +0 -1
  47. package/dist/types/networkQualityMonitor/index.d.ts +0 -70
  48. package/dist/types/rtcMetrics/constants.d.ts +0 -4
  49. package/dist/types/rtcMetrics/index.d.ts +0 -71
  50. package/src/rtcMetrics/constants.ts +0 -3
  51. package/src/rtcMetrics/index.ts +0 -186
  52. package/test/unit/spec/rtcMetrics/index.ts +0 -154
@@ -714,7 +714,8 @@ export declare enum SELF_POLICY {
714
714
  SUPPORT_HQV = "supportHQV",
715
715
  SUPPORT_HDV = "supportHDV",
716
716
  SUPPORT_PARTICIPANT_LIST = "supportParticipantList",
717
- SUPPORT_VOIP = "supportVoIP"
717
+ SUPPORT_VOIP = "supportVoIP",
718
+ SUPPORT_POLLING_AND_QA = "supportPollingAndQA"
718
719
  }
719
720
  export declare const DISPLAY_HINTS: {
720
721
  ADD_GUEST: string;
@@ -79,6 +79,7 @@ interface IInMeetingActions {
79
79
  supportHDV?: boolean;
80
80
  canShareWhiteBoard?: boolean;
81
81
  enforceVirtualBackground?: boolean;
82
+ canPollingAndQA?: boolean;
82
83
  }
83
84
  /**
84
85
  * @class InMeetingActions
@@ -158,6 +159,7 @@ export default class InMeetingActions implements IInMeetingActions {
158
159
  enforceVirtualBackground: any;
159
160
  supportHDV: any;
160
161
  canShareWhiteBoard: any;
162
+ canPollingAndQA: any;
161
163
  /**
162
164
  * Returns all meeting action options
163
165
  * @returns {Object}
@@ -67,6 +67,7 @@ export type AddMediaOptions = {
67
67
  };
68
68
  export type CallStateForMetrics = {
69
69
  correlationId?: string;
70
+ sessionCorrelationId?: string;
70
71
  joinTrigger?: string;
71
72
  loginType?: string;
72
73
  };
@@ -488,6 +489,16 @@ export default class Meeting extends StatelessWebexPlugin {
488
489
  * @param {string} correlationId
489
490
  */
490
491
  set correlationId(correlationId: string);
492
+ /**
493
+ * Getter - Returns callStateForMetrics.sessionCorrelationId
494
+ * @returns {string}
495
+ */
496
+ get sessionCorrelationId(): string;
497
+ /**
498
+ * Setter - sets callStateForMetrics.sessionCorrelationId
499
+ * @param {string} sessionCorrelationId
500
+ */
501
+ set sessionCorrelationId(sessionCorrelationId: string);
491
502
  /**
492
503
  * Getter - Returns isoLocalClientMeetingJoinTime
493
504
  * This will be set once on meeting join, and not updated again
@@ -2,6 +2,7 @@ import '@webex/internal-plugin-mercury';
2
2
  import '@webex/internal-plugin-conversation';
3
3
  import '@webex/internal-plugin-metrics';
4
4
  import { WebexPlugin } from '@webex/webex-core';
5
+ import { DeviceRegistrationOptions } from '@webex/internal-plugin-device';
5
6
  import * as mediaHelpersModule from '@webex/media-helpers';
6
7
  import 'webrtc-adapter';
7
8
  import { DESTINATION_TYPE } from '../constants';
@@ -51,6 +52,26 @@ import { INoiseReductionEffect, IVirtualBackgroundEffect } from './meetings.type
51
52
  * @property {String} type what type of meeting it was
52
53
  * @memberof Meetings
53
54
  */
55
+ /**
56
+ * Object containing only the most basic information about a meeting.
57
+ * This is the information that is kept even after the meeting is deleted from the MeetingCollection
58
+ */
59
+ export type BasicMeetingInformation = {
60
+ allowMediaInLobby: boolean;
61
+ correlationId: string;
62
+ environment: string;
63
+ id: string;
64
+ locusUrl: string;
65
+ locusInfo: {
66
+ url: string;
67
+ fullState: {
68
+ lastActive: string;
69
+ sessionId: string;
70
+ };
71
+ };
72
+ meetingInfo: any;
73
+ sessionCorrelationId: string;
74
+ };
54
75
  /**
55
76
  * Maintain a cache of meetings and sync with services.
56
77
  * @class
@@ -59,6 +80,7 @@ export default class Meetings extends WebexPlugin {
59
80
  loggerRequest: any;
60
81
  media: any;
61
82
  meetingCollection: any;
83
+ deletedMeetings: Map<string, BasicMeetingInformation>;
62
84
  personalMeetingRoom: any;
63
85
  preferredWebexSite: any;
64
86
  reachability: Reachability;
@@ -185,15 +207,25 @@ export default class Meetings extends WebexPlugin {
185
207
  * @returns {undefined}
186
208
  */
187
209
  private _toggleTlsReachability;
210
+ /**
211
+ * API to toggle backend ipv6 native support config, needs to be called before webex.meetings.register()
212
+ *
213
+ * @param {Boolean} newValue
214
+ * @private
215
+ * @memberof Meetings
216
+ * @returns {undefined}
217
+ */
218
+ private _toggleIpv6BackendNativeSupport;
188
219
  /**
189
220
  * Explicitly sets up the meetings plugin by registering
190
221
  * the device, connecting to mercury, and listening for locus events.
191
222
  *
223
+ * @param {DeviceRegistrationOptions} [deviceRegistrationOptions] - The options for registering the device (optional)
192
224
  * @returns {Promise}
193
225
  * @public
194
226
  * @memberof Meetings
195
227
  */
196
- register(): Promise<void>;
228
+ register(deviceRegistrationOptions?: DeviceRegistrationOptions): Promise<any>;
197
229
  /**
198
230
  * Explicitly tears down the meetings plugin by deregistering
199
231
  * the device, disconnecting from mercury, and stops listening to locus events
@@ -281,6 +313,14 @@ export default class Meetings extends WebexPlugin {
281
313
  * @memberof Meetings
282
314
  */
283
315
  getPersonalMeetingRoom(): any;
316
+ /**
317
+ * Returns basic information about a meeting that exists or
318
+ * used to exist in the MeetingCollection
319
+ *
320
+ * @param {string} meetingId
321
+ * @returns {BasicMeetingInformation|undefined}
322
+ */
323
+ getBasicMeetingInformation(meetingId: string): BasicMeetingInformation;
284
324
  /**
285
325
  * @param {Meeting} meeting
286
326
  * @param {Object} reason
@@ -304,11 +344,12 @@ export default class Meetings extends WebexPlugin {
304
344
  * @param {CallStateForMetrics} callStateForMetrics - information about call state for metrics
305
345
  * @param {Object} [meetingInfo] - Pre-fetched complete meeting info
306
346
  * @param {String} [meetingLookupUrl] - meeting info prefetch url
347
+ * @param {string} sessionCorrelationId - the optional specified sessionCorrelationId (callStateForMetrics.sessionCorrelationId) can be provided instead
307
348
  * @returns {Promise<Meeting>} A new Meeting.
308
349
  * @public
309
350
  * @memberof Meetings
310
351
  */
311
- create(destination: string, type?: DESTINATION_TYPE, useRandomDelayForInfo?: boolean, infoExtraParams?: {}, correlationId?: string, failOnMissingMeetingInfo?: boolean, callStateForMetrics?: CallStateForMetrics, meetingInfo?: any, meetingLookupUrl?: any): any;
352
+ create(destination: string, type?: DESTINATION_TYPE, useRandomDelayForInfo?: boolean, infoExtraParams?: {}, correlationId?: string, failOnMissingMeetingInfo?: boolean, callStateForMetrics?: CallStateForMetrics, meetingInfo?: any, meetingLookupUrl?: any, sessionCorrelationId?: string): any;
312
353
  /**
313
354
  * Create meeting
314
355
  *
@@ -62,7 +62,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
62
62
  updateCanManageWebcast: function updateCanManageWebcast(canManageWebcast) {
63
63
  this.set('canManageWebcast', canManageWebcast);
64
64
  },
65
- version: "3.5.0-wxcc.1"
65
+ version: "3.6.0-next.1"
66
66
  });
67
67
  var _default = exports.default = Webinar;
68
68
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -43,13 +43,13 @@
43
43
  "@webex/eslint-config-legacy": "0.0.0",
44
44
  "@webex/jest-config-legacy": "0.0.0",
45
45
  "@webex/legacy-tools": "0.0.0",
46
- "@webex/plugin-meetings": "3.5.0-wxcc.1",
47
- "@webex/plugin-rooms": "3.5.0-wxcc.1",
48
- "@webex/test-helper-chai": "3.5.0-wxcc.1",
49
- "@webex/test-helper-mocha": "3.5.0-wxcc.1",
50
- "@webex/test-helper-mock-webex": "3.5.0-wxcc.1",
51
- "@webex/test-helper-retry": "3.5.0-wxcc.1",
52
- "@webex/test-helper-test-users": "3.5.0-wxcc.1",
46
+ "@webex/plugin-meetings": "3.6.0-next.1",
47
+ "@webex/plugin-rooms": "3.5.0-next.23",
48
+ "@webex/test-helper-chai": "3.5.0-next.21",
49
+ "@webex/test-helper-mocha": "3.5.0-next.21",
50
+ "@webex/test-helper-mock-webex": "3.5.0-next.21",
51
+ "@webex/test-helper-retry": "3.5.0-next.21",
52
+ "@webex/test-helper-test-users": "3.5.0-next.21",
53
53
  "chai": "^4.3.4",
54
54
  "chai-as-promised": "^7.1.1",
55
55
  "eslint": "^8.24.0",
@@ -61,21 +61,21 @@
61
61
  "typescript": "^4.7.4"
62
62
  },
63
63
  "dependencies": {
64
- "@webex/common": "3.5.0-wxcc.1",
65
- "@webex/internal-media-core": "2.11.1",
66
- "@webex/internal-plugin-conversation": "3.5.0-wxcc.1",
67
- "@webex/internal-plugin-device": "3.5.0-wxcc.1",
68
- "@webex/internal-plugin-llm": "3.5.0-wxcc.1",
69
- "@webex/internal-plugin-mercury": "3.5.0-wxcc.1",
70
- "@webex/internal-plugin-metrics": "3.5.0-wxcc.1",
71
- "@webex/internal-plugin-support": "3.5.0-wxcc.1",
72
- "@webex/internal-plugin-user": "3.5.0-wxcc.1",
73
- "@webex/internal-plugin-voicea": "3.5.0-wxcc.1",
74
- "@webex/media-helpers": "3.5.0-wxcc.1",
75
- "@webex/plugin-people": "3.5.0-wxcc.1",
76
- "@webex/plugin-rooms": "3.5.0-wxcc.1",
64
+ "@webex/common": "3.5.0-next.21",
65
+ "@webex/internal-media-core": "2.11.3",
66
+ "@webex/internal-plugin-conversation": "3.5.0-next.23",
67
+ "@webex/internal-plugin-device": "3.5.0-next.21",
68
+ "@webex/internal-plugin-llm": "3.5.0-next.21",
69
+ "@webex/internal-plugin-mercury": "3.5.0-next.21",
70
+ "@webex/internal-plugin-metrics": "3.5.0-next.21",
71
+ "@webex/internal-plugin-support": "3.5.0-next.23",
72
+ "@webex/internal-plugin-user": "3.5.0-next.21",
73
+ "@webex/internal-plugin-voicea": "3.6.0-next.1",
74
+ "@webex/media-helpers": "3.5.0-next.22",
75
+ "@webex/plugin-people": "3.5.0-next.21",
76
+ "@webex/plugin-rooms": "3.5.0-next.23",
77
77
  "@webex/web-capabilities": "^1.4.0",
78
- "@webex/webex-core": "3.5.0-wxcc.1",
78
+ "@webex/webex-core": "3.5.0-next.21",
79
79
  "ampersand-collection": "^2.0.2",
80
80
  "bowser": "^2.11.0",
81
81
  "btoa": "^1.2.1",
@@ -91,5 +91,5 @@
91
91
  "//": [
92
92
  "TODO: upgrade jwt-decode when moving to node 18"
93
93
  ],
94
- "version": "3.5.0-wxcc.1"
94
+ "version": "3.6.0-next.1"
95
95
  }
package/src/config.ts CHANGED
@@ -92,5 +92,8 @@ export default {
92
92
  degradationPreferences: {
93
93
  maxMacroblocksLimit: 8192,
94
94
  },
95
+ // This only applies to non-multistream meetings
96
+ iceCandidatesGatheringTimeout: undefined,
97
+ backendIpv6NativeSupport: false,
95
98
  },
96
99
  };
package/src/constants.ts CHANGED
@@ -879,6 +879,7 @@ export enum SELF_POLICY {
879
879
  SUPPORT_HDV = 'supportHDV',
880
880
  SUPPORT_PARTICIPANT_LIST = 'supportParticipantList',
881
881
  SUPPORT_VOIP = 'supportVoIP',
882
+ SUPPORT_POLLING_AND_QA = 'supportPollingAndQA',
882
883
  }
883
884
 
884
885
  export const DISPLAY_HINTS = {
@@ -15,12 +15,12 @@ import {
15
15
  LocalSystemAudioStream,
16
16
  LocalMicrophoneStream,
17
17
  } from '@webex/media-helpers';
18
+ import {RtcMetrics} from '@webex/internal-plugin-metrics';
18
19
  import LoggerProxy from '../common/logs/logger-proxy';
19
20
  import {MEDIA_TRACK_CONSTRAINT} from '../constants';
20
21
  import Config from '../config';
21
22
  import StaticConfig from '../common/config';
22
23
  import BrowserDetection from '../common/browser-detection';
23
- import RtcMetrics from '../rtcMetrics';
24
24
 
25
25
  const {isBrowser} = BrowserDetection();
26
26
 
@@ -144,6 +144,7 @@ Media.createMediaConnection = (
144
144
  password: string;
145
145
  };
146
146
  bundlePolicy?: BundlePolicy;
147
+ iceCandidatesTimeout?: number;
147
148
  }
148
149
  ) => {
149
150
  const {
@@ -154,6 +155,7 @@ Media.createMediaConnection = (
154
155
  enableExtmap,
155
156
  turnServerInfo,
156
157
  bundlePolicy,
158
+ iceCandidatesTimeout,
157
159
  } = options;
158
160
 
159
161
  const iceServers = [];
@@ -210,6 +212,7 @@ Media.createMediaConnection = (
210
212
  return new RoapMediaConnection(
211
213
  {
212
214
  iceServers,
215
+ iceCandidatesTimeout,
213
216
  skipInactiveTransceivers: false,
214
217
  requireH264: true,
215
218
  sdpMunging: {
@@ -82,6 +82,7 @@ interface IInMeetingActions {
82
82
  supportHDV?: boolean;
83
83
  canShareWhiteBoard?: boolean;
84
84
  enforceVirtualBackground?: boolean;
85
+ canPollingAndQA?: boolean;
85
86
  }
86
87
 
87
88
  /**
@@ -236,6 +237,7 @@ export default class InMeetingActions implements IInMeetingActions {
236
237
 
237
238
  canShareWhiteBoard = null;
238
239
 
240
+ canPollingAndQA = null;
239
241
  /**
240
242
  * Returns all meeting action options
241
243
  * @returns {Object}
@@ -314,6 +316,7 @@ export default class InMeetingActions implements IInMeetingActions {
314
316
  supportHQV: this.supportHQV,
315
317
  supportHDV: this.supportHDV,
316
318
  canShareWhiteBoard: this.canShareWhiteBoard,
319
+ canPollingAndQA: this.canPollingAndQA,
317
320
  });
318
321
 
319
322
  /**
@@ -10,6 +10,7 @@ import {
10
10
  ClientEventLeaveReason,
11
11
  CallDiagnosticUtils,
12
12
  CALL_DIAGNOSTIC_CONFIG,
13
+ RtcMetrics,
13
14
  } from '@webex/internal-plugin-metrics';
14
15
  import {ClientEvent as RawClientEvent} from '@webex/event-dictionary-ts';
15
16
 
@@ -155,7 +156,6 @@ import ControlsOptionsManager from '../controls-options-manager';
155
156
  import PermissionError from '../common/errors/permission';
156
157
  import {LocusMediaRequest} from './locusMediaRequest';
157
158
  import {ConnectionStateHandler, ConnectionStateEvent} from './connectionStateHandler';
158
- import RtcMetrics from '../rtcMetrics';
159
159
 
160
160
  // default callback so we don't call an undefined function, but in practice it should never be used
161
161
  const DEFAULT_ICE_PHASE_CALLBACK = () => 'JOIN_MEETING_FINAL';
@@ -227,6 +227,7 @@ export type AddMediaOptions = {
227
227
 
228
228
  export type CallStateForMetrics = {
229
229
  correlationId?: string;
230
+ sessionCorrelationId?: string;
230
231
  joinTrigger?: string;
231
232
  loginType?: string;
232
233
  };
@@ -742,12 +743,29 @@ export default class Meeting extends StatelessWebexPlugin {
742
743
  */
743
744
  this.callStateForMetrics = attrs.callStateForMetrics || {};
744
745
  const correlationId = attrs.correlationId || attrs.callStateForMetrics?.correlationId;
746
+ const sessionCorrelationId =
747
+ attrs.sessionCorrelationId || attrs.callStateForMetrics?.sessionCorrelationId;
748
+ if (sessionCorrelationId) {
749
+ LoggerProxy.logger.log(
750
+ `Meetings:index#constructor --> Initializing the meeting object with session correlation id from app ${correlationId}`
751
+ );
752
+ this.callStateForMetrics.sessionCorrelationId = sessionCorrelationId;
753
+ } else {
754
+ LoggerProxy.logger.log(
755
+ `Meetings:index#constructor --> No session correlation id supplied. None will be generated and this field will remain blank`
756
+ );
757
+ // TODO: supply a session from the meetings instance
758
+ this.callStateForMetrics.sessionCorrelationId = '';
759
+ }
745
760
  if (correlationId) {
746
761
  LoggerProxy.logger.log(
747
762
  `Meetings:index#constructor --> Initializing the meeting object with correlation id from app ${correlationId}`
748
763
  );
749
764
  this.callStateForMetrics.correlationId = correlationId;
750
765
  } else {
766
+ LoggerProxy.logger.log(
767
+ `Meetings:index#constructor --> Initializing the meeting object with generated correlation id from sdk ${this.id}`
768
+ );
751
769
  this.callStateForMetrics.correlationId = this.id;
752
770
  }
753
771
  /**
@@ -1581,6 +1599,22 @@ export default class Meeting extends StatelessWebexPlugin {
1581
1599
  this.callStateForMetrics.correlationId = correlationId;
1582
1600
  }
1583
1601
 
1602
+ /**
1603
+ * Getter - Returns callStateForMetrics.sessionCorrelationId
1604
+ * @returns {string}
1605
+ */
1606
+ get sessionCorrelationId() {
1607
+ return this.callStateForMetrics.sessionCorrelationId;
1608
+ }
1609
+
1610
+ /**
1611
+ * Setter - sets callStateForMetrics.sessionCorrelationId
1612
+ * @param {string} sessionCorrelationId
1613
+ */
1614
+ set sessionCorrelationId(sessionCorrelationId: string) {
1615
+ this.callStateForMetrics.sessionCorrelationId = sessionCorrelationId;
1616
+ }
1617
+
1584
1618
  /**
1585
1619
  * Getter - Returns isoLocalClientMeetingJoinTime
1586
1620
  * This will be set once on meeting join, and not updated again
@@ -3792,6 +3826,10 @@ export default class Meeting extends StatelessWebexPlugin {
3792
3826
  requiredPolicies: [SELF_POLICY.SUPPORT_CHAT],
3793
3827
  policies: this.selfUserPolicies,
3794
3828
  }),
3829
+ canPollingAndQA: ControlsOptionsUtil.hasPolicies({
3830
+ requiredPolicies: [SELF_POLICY.SUPPORT_POLLING_AND_QA],
3831
+ policies: this.selfUserPolicies,
3832
+ }),
3795
3833
  canShareApplication:
3796
3834
  (ControlsOptionsUtil.hasHints({
3797
3835
  requiredHints: [DISPLAY_HINTS.SHARE_APPLICATION],
@@ -6338,7 +6376,7 @@ export default class Meeting extends StatelessWebexPlugin {
6338
6376
  private async createMediaConnection(turnServerInfo, bundlePolicy?: BundlePolicy) {
6339
6377
  this.rtcMetrics = this.isMultistream
6340
6378
  ? // @ts-ignore
6341
- new RtcMetrics(this.webex, this.id, this.correlationId)
6379
+ new RtcMetrics(this.webex, {meetingId: this.id}, this.correlationId)
6342
6380
  : undefined;
6343
6381
 
6344
6382
  const mc = Media.createMediaConnection(
@@ -6355,6 +6393,8 @@ export default class Meeting extends StatelessWebexPlugin {
6355
6393
  enableExtmap: this.config.enableExtmap,
6356
6394
  turnServerInfo,
6357
6395
  bundlePolicy,
6396
+ // @ts-ignore - config coming from registerPlugin
6397
+ iceCandidatesTimeout: this.config.iceCandidatesGatheringTimeout,
6358
6398
  }
6359
6399
  );
6360
6400
 
@@ -89,8 +89,12 @@ const MeetingUtil = {
89
89
  getIpVersion(webex: any): IP_VERSION | undefined {
90
90
  const {supportsIpV4, supportsIpV6} = webex.internal.device.ipNetworkDetector;
91
91
 
92
- if (BrowserDetection().isBrowser('firefox')) {
93
- // our ipv6 solution relies on FQDN ICE candidates, but Firefox doesn't support them,
92
+ if (
93
+ !webex.config.meetings.backendIpv6NativeSupport &&
94
+ BrowserDetection().isBrowser('firefox')
95
+ ) {
96
+ // when backend doesn't support native ipv6,
97
+ // then our NAT64/DNS64 based solution relies on FQDN ICE candidates, but Firefox doesn't support them,
94
98
  // see https://bugzilla.mozilla.org/show_bug.cgi?id=1713128
95
99
  // so for Firefox we don't want the backend to activate the "ipv6 feature"
96
100
  return undefined;
@@ -150,7 +154,9 @@ const MeetingUtil = {
150
154
  ipVersion: MeetingUtil.getIpVersion(meeting.getWebexObject()),
151
155
  })
152
156
  .then((res) => {
153
- // @ts-ignore
157
+ const parsed = MeetingUtil.parseLocusJoin(res);
158
+ meeting.setLocus(parsed);
159
+
154
160
  webex.internal.newMetrics.submitClientEvent({
155
161
  name: 'client.locus.join.response',
156
162
  payload: {
@@ -161,11 +167,11 @@ const MeetingUtil = {
161
167
  },
162
168
  options: {
163
169
  meetingId: meeting.id,
164
- mediaConnections: res.body.mediaConnections,
170
+ mediaConnections: parsed.mediaConnections,
165
171
  },
166
172
  });
167
173
 
168
- return MeetingUtil.parseLocusJoin(res);
174
+ return parsed;
169
175
  });
170
176
  },
171
177
 
@@ -313,34 +319,24 @@ const MeetingUtil = {
313
319
  }
314
320
 
315
321
  // normal join meeting, scenario A, D
316
- return MeetingUtil.joinMeeting(meeting, options)
317
- .then((response) => {
318
- meeting.setLocus(response);
319
-
320
- return Promise.resolve(response);
321
- })
322
- .catch((err) => {
323
- // joining a claimed PMR that is not my own, scenario B
324
- if (MeetingUtil.isPinOrGuest(err)) {
325
- // @ts-ignore
326
- webex.internal.newMetrics.submitClientEvent({
327
- name: 'client.pin.prompt',
328
- options: {
329
- meetingId: meeting.id,
330
- },
331
- });
322
+ return MeetingUtil.joinMeeting(meeting, options).catch((err) => {
323
+ // joining a claimed PMR that is not my own, scenario B
324
+ if (MeetingUtil.isPinOrGuest(err)) {
325
+ webex.internal.newMetrics.submitClientEvent({
326
+ name: 'client.pin.prompt',
327
+ options: {
328
+ meetingId: meeting.id,
329
+ },
330
+ });
332
331
 
333
- // request host pin or non host for unclaimed PMR, start of Scenario C
334
- // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature
335
- return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));
336
- }
337
- LoggerProxy.logger.error(
338
- 'Meeting:util#joinMeetingOptions --> Error joining the call, ',
339
- err
340
- );
332
+ // request host pin or non host for unclaimed PMR, start of Scenario C
333
+ // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature
334
+ return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));
335
+ }
336
+ LoggerProxy.logger.error('Meeting:util#joinMeetingOptions --> Error joining the call, ', err);
341
337
 
342
- return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));
343
- });
338
+ return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));
339
+ });
344
340
  },
345
341
 
346
342
  /**