@webex/plugin-meetings 3.5.0 → 3.6.0

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 (201) hide show
  1. package/dist/annotation/annotation.types.d.ts +42 -0
  2. package/dist/annotation/constants.d.ts +31 -0
  3. package/dist/annotation/index.d.ts +117 -0
  4. package/dist/breakouts/breakout.d.ts +8 -0
  5. package/dist/breakouts/breakout.js +1 -1
  6. package/dist/breakouts/collection.d.ts +5 -0
  7. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  8. package/dist/breakouts/events.d.ts +8 -0
  9. package/dist/breakouts/index.d.ts +5 -0
  10. package/dist/breakouts/index.js +1 -1
  11. package/dist/breakouts/request.d.ts +22 -0
  12. package/dist/breakouts/utils.d.ts +15 -0
  13. package/dist/common/browser-detection.d.ts +9 -0
  14. package/dist/common/collection.d.ts +48 -0
  15. package/dist/common/config.d.ts +2 -0
  16. package/dist/common/errors/captcha-error.d.ts +15 -0
  17. package/dist/common/errors/intent-to-join.d.ts +16 -0
  18. package/dist/common/errors/join-meeting.d.ts +17 -0
  19. package/dist/common/errors/media.d.ts +15 -0
  20. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  21. package/dist/common/errors/parameter.d.ts +15 -0
  22. package/dist/common/errors/password-error.d.ts +15 -0
  23. package/dist/common/errors/permission.d.ts +14 -0
  24. package/dist/common/errors/reclaim-host-role-error.js +149 -0
  25. package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
  26. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  27. package/dist/common/errors/reconnection-in-progress.d.ts +9 -0
  28. package/dist/common/errors/reconnection-in-progress.js +33 -0
  29. package/dist/common/errors/reconnection-in-progress.js.map +1 -0
  30. package/dist/common/errors/reconnection.d.ts +15 -0
  31. package/dist/common/errors/stats.d.ts +15 -0
  32. package/dist/common/errors/webex-errors.d.ts +93 -0
  33. package/dist/common/errors/webex-meetings-error.d.ts +20 -0
  34. package/dist/common/events/events-scope.d.ts +17 -0
  35. package/dist/common/events/events.d.ts +12 -0
  36. package/dist/common/events/trigger-proxy.d.ts +2 -0
  37. package/dist/common/events/util.d.ts +2 -0
  38. package/dist/common/logs/logger-config.d.ts +2 -0
  39. package/dist/common/logs/logger-proxy.d.ts +2 -0
  40. package/dist/common/logs/request.d.ts +36 -0
  41. package/dist/common/queue.d.ts +34 -0
  42. package/dist/config.d.ts +72 -0
  43. package/dist/config.js +3 -1
  44. package/dist/config.js.map +1 -1
  45. package/dist/constants.d.ts +1088 -0
  46. package/dist/constants.js +1 -0
  47. package/dist/constants.js.map +1 -1
  48. package/dist/controls-options-manager/constants.d.ts +4 -0
  49. package/dist/controls-options-manager/enums.d.ts +15 -0
  50. package/dist/controls-options-manager/index.d.ts +136 -0
  51. package/dist/controls-options-manager/types.d.ts +43 -0
  52. package/dist/controls-options-manager/util.d.ts +1 -0
  53. package/dist/index.d.ts +7 -0
  54. package/dist/interceptors/index.d.ts +2 -0
  55. package/dist/interceptors/locusRetry.d.ts +27 -0
  56. package/dist/interpretation/collection.d.ts +5 -0
  57. package/dist/interpretation/index.d.ts +5 -0
  58. package/dist/interpretation/index.js +1 -1
  59. package/dist/interpretation/siLanguage.d.ts +5 -0
  60. package/dist/interpretation/siLanguage.js +1 -1
  61. package/dist/locus-info/controlsUtils.d.ts +2 -0
  62. package/dist/locus-info/embeddedAppsUtils.d.ts +2 -0
  63. package/dist/locus-info/fullState.d.ts +2 -0
  64. package/dist/locus-info/hostUtils.d.ts +2 -0
  65. package/dist/locus-info/index.d.ts +322 -0
  66. package/dist/locus-info/infoUtils.d.ts +2 -0
  67. package/dist/locus-info/mediaSharesUtils.d.ts +2 -0
  68. package/dist/locus-info/parser.d.ts +272 -0
  69. package/dist/locus-info/selfUtils.d.ts +2 -0
  70. package/dist/media/index.d.ts +34 -0
  71. package/dist/media/index.js +3 -1
  72. package/dist/media/index.js.map +1 -1
  73. package/dist/media/properties.d.ts +93 -0
  74. package/dist/media/util.d.ts +2 -0
  75. package/dist/mediaQualityMetrics/config.d.ts +241 -0
  76. package/dist/mediaQualityMetrics/config.js +502 -0
  77. package/dist/mediaQualityMetrics/config.js.map +1 -0
  78. package/dist/meeting/effectsState.js +260 -0
  79. package/dist/meeting/effectsState.js.map +1 -0
  80. package/dist/meeting/in-meeting-actions.d.ts +167 -0
  81. package/dist/meeting/in-meeting-actions.js +3 -1
  82. package/dist/meeting/in-meeting-actions.js.map +1 -1
  83. package/dist/meeting/index.d.ts +1825 -0
  84. package/dist/meeting/index.js +39 -4
  85. package/dist/meeting/index.js.map +1 -1
  86. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  87. package/dist/meeting/muteState.d.ts +178 -0
  88. package/dist/meeting/request.d.ts +295 -0
  89. package/dist/meeting/request.type.d.ts +11 -0
  90. package/dist/meeting/state.d.ts +9 -0
  91. package/dist/meeting/util.d.ts +119 -0
  92. package/dist/meeting/util.js +5 -8
  93. package/dist/meeting/util.js.map +1 -1
  94. package/dist/meeting/voicea-meeting.d.ts +16 -0
  95. package/dist/meeting-info/collection.d.ts +20 -0
  96. package/dist/meeting-info/index.d.ts +69 -0
  97. package/dist/meeting-info/meeting-info-v2.d.ts +123 -0
  98. package/dist/meeting-info/request.d.ts +22 -0
  99. package/dist/meeting-info/util.d.ts +2 -0
  100. package/dist/meeting-info/utilv2.d.ts +2 -0
  101. package/dist/meetings/collection.d.ts +40 -0
  102. package/dist/meetings/index.d.ts +390 -0
  103. package/dist/meetings/index.js +79 -26
  104. package/dist/meetings/index.js.map +1 -1
  105. package/dist/meetings/meetings.types.d.ts +4 -0
  106. package/dist/meetings/request.d.ts +27 -0
  107. package/dist/meetings/util.d.ts +18 -0
  108. package/dist/member/index.d.ts +160 -0
  109. package/dist/member/member.types.js +17 -0
  110. package/dist/member/member.types.js.map +1 -0
  111. package/dist/member/types.d.ts +32 -0
  112. package/dist/member/util.d.ts +2 -0
  113. package/dist/members/collection.d.ts +29 -0
  114. package/dist/members/index.d.ts +353 -0
  115. package/dist/members/request.d.ts +114 -0
  116. package/dist/members/types.d.ts +25 -0
  117. package/dist/members/util.d.ts +215 -0
  118. package/dist/metrics/config.js +276 -0
  119. package/dist/metrics/config.js.map +1 -0
  120. package/dist/metrics/constants.d.ts +70 -0
  121. package/dist/metrics/index.d.ts +45 -0
  122. package/dist/multistream/mediaRequestManager.d.ts +119 -0
  123. package/dist/multistream/receiveSlot.d.ts +68 -0
  124. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  125. package/dist/multistream/remoteMedia.d.ts +72 -0
  126. package/dist/multistream/remoteMediaGroup.d.ts +49 -0
  127. package/dist/multistream/remoteMediaManager.d.ts +300 -0
  128. package/dist/multistream/sendSlotManager.d.ts +69 -0
  129. package/dist/networkQualityMonitor/index.d.ts +70 -0
  130. package/dist/networkQualityMonitor/index.js +13 -19
  131. package/dist/networkQualityMonitor/index.js.map +1 -1
  132. package/dist/peer-connection-manager/index.js +671 -0
  133. package/dist/peer-connection-manager/index.js.map +1 -0
  134. package/dist/peer-connection-manager/util.js +109 -0
  135. package/dist/peer-connection-manager/util.js.map +1 -0
  136. package/dist/personal-meeting-room/index.d.ts +47 -0
  137. package/dist/personal-meeting-room/request.d.ts +14 -0
  138. package/dist/personal-meeting-room/util.d.ts +2 -0
  139. package/dist/reachability/clusterReachability.d.ts +109 -0
  140. package/dist/reachability/index.d.ts +105 -0
  141. package/dist/reachability/request.d.ts +39 -0
  142. package/dist/reachability/util.d.ts +8 -0
  143. package/dist/reactions/constants.d.ts +3 -0
  144. package/dist/reactions/reactions.d.ts +4 -0
  145. package/dist/reactions/reactions.type.d.ts +52 -0
  146. package/dist/reconnection-manager/index.d.ts +136 -0
  147. package/dist/recording-controller/enums.d.ts +7 -0
  148. package/dist/recording-controller/index.d.ts +207 -0
  149. package/dist/recording-controller/util.d.ts +14 -0
  150. package/dist/roap/collection.js +62 -0
  151. package/dist/roap/collection.js.map +1 -0
  152. package/dist/roap/handler.js +275 -0
  153. package/dist/roap/handler.js.map +1 -0
  154. package/dist/roap/index.d.ts +86 -0
  155. package/dist/roap/request.d.ts +39 -0
  156. package/dist/roap/state.js +126 -0
  157. package/dist/roap/state.js.map +1 -0
  158. package/dist/roap/turnDiscovery.d.ts +155 -0
  159. package/dist/roap/util.js +75 -0
  160. package/dist/roap/util.js.map +1 -0
  161. package/dist/rtcMetrics/constants.d.ts +4 -0
  162. package/dist/rtcMetrics/index.d.ts +61 -0
  163. package/dist/statsAnalyzer/global.d.ts +36 -0
  164. package/dist/statsAnalyzer/global.js +126 -0
  165. package/dist/statsAnalyzer/global.js.map +1 -0
  166. package/dist/statsAnalyzer/index.d.ts +217 -0
  167. package/dist/statsAnalyzer/index.js +1013 -0
  168. package/dist/statsAnalyzer/index.js.map +1 -0
  169. package/dist/statsAnalyzer/mqaUtil.d.ts +48 -0
  170. package/dist/statsAnalyzer/mqaUtil.js +179 -0
  171. package/dist/statsAnalyzer/mqaUtil.js.map +1 -0
  172. package/dist/transcription/index.d.ts +64 -0
  173. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  174. package/dist/types/config.d.ts +1 -0
  175. package/dist/types/constants.d.ts +2 -1
  176. package/dist/types/mediaQualityMetrics/config.d.ts +241 -0
  177. package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
  178. package/dist/types/meeting/index.d.ts +11 -0
  179. package/dist/types/meetings/index.d.ts +34 -2
  180. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  181. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  182. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  183. package/dist/webinar/collection.d.ts +16 -0
  184. package/dist/webinar/index.d.ts +5 -0
  185. package/dist/webinar/index.js +1 -1
  186. package/package.json +22 -22
  187. package/src/config.ts +2 -0
  188. package/src/constants.ts +1 -0
  189. package/src/media/index.ts +4 -1
  190. package/src/meeting/in-meeting-actions.ts +3 -0
  191. package/src/meeting/index.ts +42 -2
  192. package/src/meeting/util.ts +21 -29
  193. package/src/meetings/index.ts +107 -37
  194. package/test/unit/spec/media/index.ts +4 -0
  195. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
  196. package/test/unit/spec/meeting/index.js +58 -17
  197. package/test/unit/spec/meeting/utils.js +34 -84
  198. package/test/unit/spec/meetings/index.js +112 -13
  199. package/src/rtcMetrics/constants.ts +0 -3
  200. package/src/rtcMetrics/index.ts +0 -186
  201. package/test/unit/spec/rtcMetrics/index.ts +0 -154
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",
47
+ "@webex/plugin-rooms": "3.6.0",
48
+ "@webex/test-helper-chai": "3.6.0",
49
+ "@webex/test-helper-mocha": "3.6.0",
50
+ "@webex/test-helper-mock-webex": "3.6.0",
51
+ "@webex/test-helper-retry": "3.6.0",
52
+ "@webex/test-helper-test-users": "3.6.0",
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.6.0",
65
+ "@webex/internal-media-core": "2.11.3",
66
+ "@webex/internal-plugin-conversation": "3.6.0",
67
+ "@webex/internal-plugin-device": "3.6.0",
68
+ "@webex/internal-plugin-llm": "3.6.0",
69
+ "@webex/internal-plugin-mercury": "3.6.0",
70
+ "@webex/internal-plugin-metrics": "3.6.0",
71
+ "@webex/internal-plugin-support": "3.6.0",
72
+ "@webex/internal-plugin-user": "3.6.0",
73
+ "@webex/internal-plugin-voicea": "3.6.0",
74
+ "@webex/media-helpers": "3.6.0",
75
+ "@webex/plugin-people": "3.6.0",
76
+ "@webex/plugin-rooms": "3.6.0",
77
77
  "@webex/web-capabilities": "^1.4.0",
78
- "@webex/webex-core": "3.5.0",
78
+ "@webex/webex-core": "3.6.0",
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"
95
95
  }
package/src/config.ts CHANGED
@@ -92,5 +92,7 @@ export default {
92
92
  degradationPreferences: {
93
93
  maxMacroblocksLimit: 8192,
94
94
  },
95
+ // This only applies to non-multistream meetings
96
+ iceCandidatesGatheringTimeout: undefined,
95
97
  },
96
98
  };
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
 
@@ -150,7 +150,9 @@ const MeetingUtil = {
150
150
  ipVersion: MeetingUtil.getIpVersion(meeting.getWebexObject()),
151
151
  })
152
152
  .then((res) => {
153
- // @ts-ignore
153
+ const parsed = MeetingUtil.parseLocusJoin(res);
154
+ meeting.setLocus(parsed);
155
+
154
156
  webex.internal.newMetrics.submitClientEvent({
155
157
  name: 'client.locus.join.response',
156
158
  payload: {
@@ -161,11 +163,11 @@ const MeetingUtil = {
161
163
  },
162
164
  options: {
163
165
  meetingId: meeting.id,
164
- mediaConnections: res.body.mediaConnections,
166
+ mediaConnections: parsed.mediaConnections,
165
167
  },
166
168
  });
167
169
 
168
- return MeetingUtil.parseLocusJoin(res);
170
+ return parsed;
169
171
  });
170
172
  },
171
173
 
@@ -313,34 +315,24 @@ const MeetingUtil = {
313
315
  }
314
316
 
315
317
  // 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
- });
318
+ return MeetingUtil.joinMeeting(meeting, options).catch((err) => {
319
+ // joining a claimed PMR that is not my own, scenario B
320
+ if (MeetingUtil.isPinOrGuest(err)) {
321
+ webex.internal.newMetrics.submitClientEvent({
322
+ name: 'client.pin.prompt',
323
+ options: {
324
+ meetingId: meeting.id,
325
+ },
326
+ });
332
327
 
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
- );
328
+ // request host pin or non host for unclaimed PMR, start of Scenario C
329
+ // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature
330
+ return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));
331
+ }
332
+ LoggerProxy.logger.error('Meeting:util#joinMeetingOptions --> Error joining the call, ', err);
341
333
 
342
- return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));
343
- });
334
+ return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));
335
+ });
344
336
  },
345
337
 
346
338
  /**
@@ -1,11 +1,12 @@
1
1
  /* eslint no-shadow: ["error", { "allow": ["eventType"] }] */
2
- import {union} from 'lodash';
2
+ import {cloneDeep} from 'lodash';
3
3
  import '@webex/internal-plugin-mercury';
4
4
  import '@webex/internal-plugin-conversation';
5
5
  import '@webex/internal-plugin-metrics';
6
6
  // @ts-ignore
7
7
  import {WebexPlugin} from '@webex/webex-core';
8
8
  import {setLogger} from '@webex/internal-media-core';
9
+ import {DeviceRegistrationOptions} from '@webex/internal-plugin-device';
9
10
 
10
11
  import * as mediaHelpersModule from '@webex/media-helpers';
11
12
 
@@ -133,6 +134,28 @@ class MediaLogger {
133
134
  * @memberof Meetings
134
135
  */
135
136
 
137
+ /**
138
+ * Object containing only the most basic information about a meeting.
139
+ * This is the information that is kept even after the meeting is deleted from the MeetingCollection
140
+ */
141
+ export type BasicMeetingInformation = {
142
+ allowMediaInLobby: boolean;
143
+ correlationId: string;
144
+ environment: string;
145
+ id: string;
146
+ locusUrl: string;
147
+ locusInfo: {
148
+ // it's only a very small subset of the locus info, to avoid using much memory
149
+ url: string;
150
+ fullState: {
151
+ lastActive: string;
152
+ sessionId: string;
153
+ };
154
+ };
155
+ meetingInfo: any;
156
+ sessionCorrelationId: string;
157
+ };
158
+
136
159
  /**
137
160
  * Maintain a cache of meetings and sync with services.
138
161
  * @class
@@ -141,6 +164,7 @@ export default class Meetings extends WebexPlugin {
141
164
  loggerRequest: any;
142
165
  media: any;
143
166
  meetingCollection: any;
167
+ deletedMeetings: Map<string, BasicMeetingInformation>;
144
168
  personalMeetingRoom: any;
145
169
  preferredWebexSite: any;
146
170
  reachability: Reachability;
@@ -191,6 +215,8 @@ export default class Meetings extends WebexPlugin {
191
215
  // @ts-ignore
192
216
  this.loggerRequest = new LoggerRequest({webex: this.webex});
193
217
  this.meetingCollection = new MeetingCollection();
218
+ this.deletedMeetings = new Map();
219
+
194
220
  /**
195
221
  * The PersonalMeetingRoom object to interact with server
196
222
  * @instance
@@ -740,11 +766,12 @@ export default class Meetings extends WebexPlugin {
740
766
  * Explicitly sets up the meetings plugin by registering
741
767
  * the device, connecting to mercury, and listening for locus events.
742
768
  *
769
+ * @param {DeviceRegistrationOptions} [deviceRegistrationOptions] - The options for registering the device (optional)
743
770
  * @returns {Promise}
744
771
  * @public
745
772
  * @memberof Meetings
746
773
  */
747
- public register() {
774
+ public register(deviceRegistrationOptions?: DeviceRegistrationOptions): Promise<any> {
748
775
  // @ts-ignore
749
776
  if (!this.webex.canAuthorize) {
750
777
  LoggerProxy.logger.error(
@@ -770,7 +797,7 @@ export default class Meetings extends WebexPlugin {
770
797
  }),
771
798
  // @ts-ignore
772
799
  this.webex.internal.device
773
- .register()
800
+ .register(deviceRegistrationOptions)
774
801
  // @ts-ignore
775
802
  .then(() =>
776
803
  LoggerProxy.logger.info(
@@ -996,35 +1023,45 @@ export default class Meetings extends WebexPlugin {
996
1023
  * @memberof Meetings
997
1024
  */
998
1025
  fetchUserPreferredWebexSite() {
999
- return this.request.getMeetingPreferences().then((res) => {
1000
- if (res) {
1001
- const preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
1002
- this.preferredWebexSite = preferredWebexSite;
1003
- // @ts-ignore
1004
- this.webex.internal.services._getCatalog().addAllowedDomains([preferredWebexSite]);
1005
- }
1026
+ // @ts-ignore
1027
+ return this.webex.people._getMe().then((me) => {
1028
+ const isGuestUser = me.type === 'appuser';
1029
+ if (!isGuestUser) {
1030
+ return this.request.getMeetingPreferences().then((res) => {
1031
+ if (res) {
1032
+ const preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
1033
+ this.preferredWebexSite = preferredWebexSite;
1034
+ // @ts-ignore
1035
+ this.webex.internal.services._getCatalog().addAllowedDomains([preferredWebexSite]);
1036
+ }
1006
1037
 
1007
- // fall back to getting the preferred site from the user information
1008
- if (!this.preferredWebexSite) {
1009
- // @ts-ignore
1010
- return this.webex.internal.user
1011
- .get()
1012
- .then((user) => {
1013
- const preferredWebexSite =
1014
- user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
1015
- if (preferredWebexSite) {
1016
- this.preferredWebexSite = preferredWebexSite;
1017
- // @ts-ignore
1018
- this.webex.internal.services._getCatalog().addAllowedDomains([preferredWebexSite]);
1019
- } else {
1020
- throw new Error('site not found');
1021
- }
1022
- })
1023
- .catch(() => {
1024
- LoggerProxy.logger.error(
1025
- 'Failed to fetch preferred site from user - no site will be set'
1026
- );
1027
- });
1038
+ // fall back to getting the preferred site from the user information
1039
+ if (!this.preferredWebexSite) {
1040
+ // @ts-ignore
1041
+ return this.webex.internal.user
1042
+ .get()
1043
+ .then((user) => {
1044
+ const preferredWebexSite =
1045
+ user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
1046
+ if (preferredWebexSite) {
1047
+ this.preferredWebexSite = preferredWebexSite;
1048
+ // @ts-ignore
1049
+ this.webex.internal.services
1050
+ ._getCatalog()
1051
+ .addAllowedDomains([preferredWebexSite]);
1052
+ } else {
1053
+ throw new Error('site not found');
1054
+ }
1055
+ })
1056
+ .catch(() => {
1057
+ LoggerProxy.logger.error(
1058
+ 'Failed to fetch preferred site from user - no site will be set'
1059
+ );
1060
+ });
1061
+ }
1062
+
1063
+ return Promise.resolve();
1064
+ });
1028
1065
  }
1029
1066
 
1030
1067
  return Promise.resolve();
@@ -1037,11 +1074,21 @@ export default class Meetings extends WebexPlugin {
1037
1074
  * @public
1038
1075
  * @memberof Meetings
1039
1076
  */
1040
-
1041
1077
  getPersonalMeetingRoom() {
1042
1078
  return this.personalMeetingRoom;
1043
1079
  }
1044
1080
 
1081
+ /**
1082
+ * Returns basic information about a meeting that exists or
1083
+ * used to exist in the MeetingCollection
1084
+ *
1085
+ * @param {string} meetingId
1086
+ * @returns {BasicMeetingInformation|undefined}
1087
+ */
1088
+ public getBasicMeetingInformation(meetingId: string): BasicMeetingInformation {
1089
+ return this.meetingCollection.get(meetingId) || this.deletedMeetings.get(meetingId);
1090
+ }
1091
+
1045
1092
  /**
1046
1093
  * @param {Meeting} meeting
1047
1094
  * @param {Object} reason
@@ -1052,6 +1099,24 @@ export default class Meetings extends WebexPlugin {
1052
1099
  */
1053
1100
  private destroy(meeting: Meeting, reason: object) {
1054
1101
  MeetingUtil.cleanUp(meeting);
1102
+ // keep some basic info about the deleted meeting forever
1103
+ this.deletedMeetings.set(meeting.id, {
1104
+ id: meeting.id,
1105
+ allowMediaInLobby: meeting.allowMediaInLobby,
1106
+ correlationId: meeting.correlationId,
1107
+ sessionCorrelationId: meeting.sessionCorrelationId,
1108
+ environment: meeting.environment,
1109
+ locusUrl: meeting.locusUrl,
1110
+ meetingInfo: cloneDeep(meeting.meetingInfo),
1111
+ locusInfo: {
1112
+ // locusInfo can be quite big, so keep just the minimal info
1113
+ url: meeting.locusInfo?.url,
1114
+ fullState: {
1115
+ lastActive: meeting.locusInfo?.fullState?.lastActive,
1116
+ sessionId: meeting.locusInfo?.fullState?.sessionId,
1117
+ },
1118
+ },
1119
+ });
1055
1120
  this.meetingCollection.delete(meeting.id);
1056
1121
  Trigger.trigger(
1057
1122
  this,
@@ -1081,6 +1146,7 @@ export default class Meetings extends WebexPlugin {
1081
1146
  * @param {CallStateForMetrics} callStateForMetrics - information about call state for metrics
1082
1147
  * @param {Object} [meetingInfo] - Pre-fetched complete meeting info
1083
1148
  * @param {String} [meetingLookupUrl] - meeting info prefetch url
1149
+ * @param {string} sessionCorrelationId - the optional specified sessionCorrelationId (callStateForMetrics.sessionCorrelationId) can be provided instead
1084
1150
  * @returns {Promise<Meeting>} A new Meeting.
1085
1151
  * @public
1086
1152
  * @memberof Meetings
@@ -1094,7 +1160,8 @@ export default class Meetings extends WebexPlugin {
1094
1160
  failOnMissingMeetingInfo = false,
1095
1161
  callStateForMetrics: CallStateForMetrics = undefined,
1096
1162
  meetingInfo = undefined,
1097
- meetingLookupUrl = undefined
1163
+ meetingLookupUrl = undefined,
1164
+ sessionCorrelationId: string = undefined
1098
1165
  ) {
1099
1166
  // Validate meeting information based on the provided destination and
1100
1167
  // type. This must be performed prior to determining if the meeting is
@@ -1105,6 +1172,10 @@ export default class Meetings extends WebexPlugin {
1105
1172
  callStateForMetrics = {...(callStateForMetrics || {}), correlationId};
1106
1173
  }
1107
1174
 
1175
+ if (sessionCorrelationId) {
1176
+ callStateForMetrics = {...(callStateForMetrics || {}), sessionCorrelationId};
1177
+ }
1178
+
1108
1179
  return (
1109
1180
  this.meetingInfo
1110
1181
  .fetchInfoOptions(destination, type)
@@ -1176,10 +1247,9 @@ export default class Meetings extends WebexPlugin {
1176
1247
  locusId: createdMeeting.locusId,
1177
1248
  meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
1178
1249
  autoupload: true,
1179
- }).then(() => this.destroy(createdMeeting, payload.reason));
1180
- } else {
1181
- this.destroy(createdMeeting, payload.reason);
1250
+ });
1182
1251
  }
1252
+ this.destroy(createdMeeting, payload.reason);
1183
1253
  });
1184
1254
 
1185
1255
  createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
@@ -1206,7 +1276,7 @@ export default class Meetings extends WebexPlugin {
1206
1276
  return Promise.resolve(createdMeeting);
1207
1277
  });
1208
1278
  }
1209
- meeting.setCallStateForMetrics(callStateForMetrics);
1279
+ meeting.updateCallStateForMetrics(callStateForMetrics);
1210
1280
 
1211
1281
  // Return the existing meeting.
1212
1282
  return Promise.resolve(meeting);
@@ -83,6 +83,7 @@ describe('createMediaConnection', () => {
83
83
  username: 'turn username',
84
84
  password: 'turn password',
85
85
  },
86
+ iceCandidatesTimeout: undefined,
86
87
  });
87
88
  assert.calledOnce(roapMediaConnectionConstructorStub);
88
89
  assert.calledWith(
@@ -100,6 +101,7 @@ describe('createMediaConnection', () => {
100
101
  credential: 'turn password',
101
102
  },
102
103
  ],
104
+ iceCandidatesTimeout: undefined,
103
105
  skipInactiveTransceivers: false,
104
106
  requireH264: true,
105
107
  sdpMunging: {
@@ -306,12 +308,14 @@ describe('createMediaConnection', () => {
306
308
  enableRtx: ENABLE_RTX,
307
309
  enableExtmap: ENABLE_EXTMAP,
308
310
  turnServerInfo,
311
+ iceCandidatesTimeout: undefined,
309
312
  });
310
313
  assert.calledOnce(roapMediaConnectionConstructorStub);
311
314
  assert.calledWith(
312
315
  roapMediaConnectionConstructorStub,
313
316
  {
314
317
  iceServers: [],
318
+ iceCandidatesTimeout: undefined,
315
319
  skipInactiveTransceivers: false,
316
320
  requireH264: true,
317
321
  sdpMunging: {
@@ -78,6 +78,7 @@ describe('plugin-meetings', () => {
78
78
  supportHDV: null,
79
79
  canShareWhiteBoard: null,
80
80
  enforceVirtualBackground: null,
81
+ canPollingAndQA: null,
81
82
  ...expected,
82
83
  };
83
84
 
@@ -161,6 +162,7 @@ describe('plugin-meetings', () => {
161
162
  'supportHDV',
162
163
  'canShareWhiteBoard',
163
164
  'enforceVirtualBackground',
165
+ 'canPollingAndQA',
164
166
  ].forEach((key) => {
165
167
  it(`get and set for ${key} work as expected`, () => {
166
168
  const inMeetingActions = new InMeetingActions();