@webex/plugin-meetings 3.5.0 → 3.6.0-next.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 (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 +133 -87
  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 +57 -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"
65
+ version: "3.6.0-next.2"
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",
47
- "@webex/plugin-rooms": "3.5.0",
48
- "@webex/test-helper-chai": "3.5.0",
49
- "@webex/test-helper-mocha": "3.5.0",
50
- "@webex/test-helper-mock-webex": "3.5.0",
51
- "@webex/test-helper-retry": "3.5.0",
52
- "@webex/test-helper-test-users": "3.5.0",
46
+ "@webex/plugin-meetings": "3.6.0-next.2",
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",
65
- "@webex/internal-media-core": "2.11.1",
66
- "@webex/internal-plugin-conversation": "3.5.0",
67
- "@webex/internal-plugin-device": "3.5.0",
68
- "@webex/internal-plugin-llm": "3.5.0",
69
- "@webex/internal-plugin-mercury": "3.5.0",
70
- "@webex/internal-plugin-metrics": "3.5.0",
71
- "@webex/internal-plugin-support": "3.5.0",
72
- "@webex/internal-plugin-user": "3.5.0",
73
- "@webex/internal-plugin-voicea": "3.5.0",
74
- "@webex/media-helpers": "3.5.0",
75
- "@webex/plugin-people": "3.5.0",
76
- "@webex/plugin-rooms": "3.5.0",
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.2",
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",
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"
94
+ "version": "3.6.0-next.2"
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
@@ -2705,6 +2739,9 @@ export default class Meeting extends StatelessWebexPlugin {
2705
2739
  newShareStatus = SHARE_STATUS.NO_SHARE;
2706
2740
  }
2707
2741
 
2742
+ LoggerProxy.logger.info(
2743
+ `Meeting:index#setUpLocusInfoMediaInactiveListener --> this.shareStatus=${this.shareStatus} newShareStatus=${newShareStatus}`
2744
+ );
2708
2745
  if (newShareStatus !== this.shareStatus) {
2709
2746
  const oldShareStatus = this.shareStatus;
2710
2747
 
@@ -3792,6 +3829,10 @@ export default class Meeting extends StatelessWebexPlugin {
3792
3829
  requiredPolicies: [SELF_POLICY.SUPPORT_CHAT],
3793
3830
  policies: this.selfUserPolicies,
3794
3831
  }),
3832
+ canPollingAndQA: ControlsOptionsUtil.hasPolicies({
3833
+ requiredPolicies: [SELF_POLICY.SUPPORT_POLLING_AND_QA],
3834
+ policies: this.selfUserPolicies,
3835
+ }),
3795
3836
  canShareApplication:
3796
3837
  (ControlsOptionsUtil.hasHints({
3797
3838
  requiredHints: [DISPLAY_HINTS.SHARE_APPLICATION],
@@ -6338,7 +6379,7 @@ export default class Meeting extends StatelessWebexPlugin {
6338
6379
  private async createMediaConnection(turnServerInfo, bundlePolicy?: BundlePolicy) {
6339
6380
  this.rtcMetrics = this.isMultistream
6340
6381
  ? // @ts-ignore
6341
- new RtcMetrics(this.webex, this.id, this.correlationId)
6382
+ new RtcMetrics(this.webex, {meetingId: this.id}, this.correlationId)
6342
6383
  : undefined;
6343
6384
 
6344
6385
  const mc = Media.createMediaConnection(
@@ -6355,6 +6396,8 @@ export default class Meeting extends StatelessWebexPlugin {
6355
6396
  enableExtmap: this.config.enableExtmap,
6356
6397
  turnServerInfo,
6357
6398
  bundlePolicy,
6399
+ // @ts-ignore - config coming from registerPlugin
6400
+ iceCandidatesTimeout: this.config.iceCandidatesGatheringTimeout,
6358
6401
  }
6359
6402
  );
6360
6403
 
@@ -8142,6 +8185,9 @@ export default class Meeting extends StatelessWebexPlugin {
8142
8185
  * @returns {undefined}
8143
8186
  */
8144
8187
  private handleShareAudioStreamEnded = async () => {
8188
+ LoggerProxy.logger.info(
8189
+ `Meeting:index#handleShareAudioStreamEnded --> audio share stream ended`
8190
+ );
8145
8191
  // current share audio stream has ended, but there might be an active
8146
8192
  // share video stream. we only leave from wireless share if share has
8147
8193
  // completely ended, which means no share audio or video streams active
@@ -8184,6 +8230,9 @@ export default class Meeting extends StatelessWebexPlugin {
8184
8230
  * @returns {undefined}
8185
8231
  */
8186
8232
  private handleShareVideoStreamEnded = async () => {
8233
+ LoggerProxy.logger.info(
8234
+ `Meeting:index#handleShareVideoStreamEnded --> video share stream ended`
8235
+ );
8187
8236
  // current share video stream has ended, but there might be an active
8188
8237
  // share audio stream. we only leave from wireless share if share has
8189
8238
  // completely ended, which means no share audio or video streams active
@@ -8672,6 +8721,9 @@ export default class Meeting extends StatelessWebexPlugin {
8672
8721
  * @returns {Promise}
8673
8722
  */
8674
8723
  async publishStreams(streams: LocalStreams): Promise<void> {
8724
+ LoggerProxy.logger.info(
8725
+ `Meeting:index#publishStreams --> called with: ${JSON.stringify(streams)}`
8726
+ );
8675
8727
  this.checkMediaConnection();
8676
8728
  if (
8677
8729
  !streams.microphone &&
@@ -8753,6 +8805,9 @@ export default class Meeting extends StatelessWebexPlugin {
8753
8805
  * @returns {Promise}
8754
8806
  */
8755
8807
  async unpublishStreams(streams: LocalStream[]): Promise<void> {
8808
+ LoggerProxy.logger.info(
8809
+ `Meeting:index#unpublishStreams --> called with: ${JSON.stringify(streams)}`
8810
+ );
8756
8811
  this.checkMediaConnection();
8757
8812
 
8758
8813
  const promises = [];
@@ -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
  /**