@webex/plugin-meetings 3.11.0 → 3.12.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 (170) hide show
  1. package/dist/aiEnableRequest/index.js +184 -0
  2. package/dist/aiEnableRequest/index.js.map +1 -0
  3. package/dist/aiEnableRequest/utils.js +36 -0
  4. package/dist/aiEnableRequest/utils.js.map +1 -0
  5. package/dist/annotation/index.js +14 -5
  6. package/dist/annotation/index.js.map +1 -1
  7. package/dist/breakouts/breakout.js +1 -1
  8. package/dist/breakouts/index.js +1 -1
  9. package/dist/config.js +7 -2
  10. package/dist/config.js.map +1 -1
  11. package/dist/constants.js +28 -6
  12. package/dist/constants.js.map +1 -1
  13. package/dist/hashTree/constants.js +3 -1
  14. package/dist/hashTree/constants.js.map +1 -1
  15. package/dist/hashTree/hashTree.js +18 -0
  16. package/dist/hashTree/hashTree.js.map +1 -1
  17. package/dist/hashTree/hashTreeParser.js +850 -410
  18. package/dist/hashTree/hashTreeParser.js.map +1 -1
  19. package/dist/hashTree/types.js +4 -2
  20. package/dist/hashTree/types.js.map +1 -1
  21. package/dist/hashTree/utils.js +10 -0
  22. package/dist/hashTree/utils.js.map +1 -1
  23. package/dist/index.js +11 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/interceptors/constant.js +12 -0
  26. package/dist/interceptors/constant.js.map +1 -0
  27. package/dist/interceptors/dataChannelAuthToken.js +290 -0
  28. package/dist/interceptors/dataChannelAuthToken.js.map +1 -0
  29. package/dist/interceptors/index.js +7 -0
  30. package/dist/interceptors/index.js.map +1 -1
  31. package/dist/interceptors/utils.js +27 -0
  32. package/dist/interceptors/utils.js.map +1 -0
  33. package/dist/interpretation/index.js +2 -2
  34. package/dist/interpretation/index.js.map +1 -1
  35. package/dist/interpretation/siLanguage.js +1 -1
  36. package/dist/locus-info/controlsUtils.js +5 -3
  37. package/dist/locus-info/controlsUtils.js.map +1 -1
  38. package/dist/locus-info/index.js +522 -131
  39. package/dist/locus-info/index.js.map +1 -1
  40. package/dist/locus-info/selfUtils.js +1 -0
  41. package/dist/locus-info/selfUtils.js.map +1 -1
  42. package/dist/locus-info/types.js.map +1 -1
  43. package/dist/media/MediaConnectionAwaiter.js +57 -1
  44. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  45. package/dist/media/properties.js +4 -2
  46. package/dist/media/properties.js.map +1 -1
  47. package/dist/meeting/in-meeting-actions.js +7 -1
  48. package/dist/meeting/in-meeting-actions.js.map +1 -1
  49. package/dist/meeting/index.js +1173 -877
  50. package/dist/meeting/index.js.map +1 -1
  51. package/dist/meeting/request.js +50 -0
  52. package/dist/meeting/request.js.map +1 -1
  53. package/dist/meeting/request.type.js.map +1 -1
  54. package/dist/meeting/util.js +133 -3
  55. package/dist/meeting/util.js.map +1 -1
  56. package/dist/meetings/index.js +117 -48
  57. package/dist/meetings/index.js.map +1 -1
  58. package/dist/member/index.js +10 -0
  59. package/dist/member/index.js.map +1 -1
  60. package/dist/member/util.js +10 -0
  61. package/dist/member/util.js.map +1 -1
  62. package/dist/metrics/constants.js +2 -1
  63. package/dist/metrics/constants.js.map +1 -1
  64. package/dist/multistream/mediaRequestManager.js +9 -60
  65. package/dist/multistream/mediaRequestManager.js.map +1 -1
  66. package/dist/multistream/remoteMediaManager.js +11 -0
  67. package/dist/multistream/remoteMediaManager.js.map +1 -1
  68. package/dist/reachability/index.js +18 -10
  69. package/dist/reachability/index.js.map +1 -1
  70. package/dist/reactions/reactions.type.js.map +1 -1
  71. package/dist/reconnection-manager/index.js +0 -1
  72. package/dist/reconnection-manager/index.js.map +1 -1
  73. package/dist/types/aiEnableRequest/index.d.ts +5 -0
  74. package/dist/types/aiEnableRequest/utils.d.ts +2 -0
  75. package/dist/types/config.d.ts +4 -0
  76. package/dist/types/constants.d.ts +23 -1
  77. package/dist/types/hashTree/constants.d.ts +1 -0
  78. package/dist/types/hashTree/hashTree.d.ts +7 -0
  79. package/dist/types/hashTree/hashTreeParser.d.ts +122 -14
  80. package/dist/types/hashTree/types.d.ts +3 -0
  81. package/dist/types/hashTree/utils.d.ts +6 -0
  82. package/dist/types/index.d.ts +1 -0
  83. package/dist/types/interceptors/constant.d.ts +5 -0
  84. package/dist/types/interceptors/dataChannelAuthToken.d.ts +43 -0
  85. package/dist/types/interceptors/index.d.ts +2 -1
  86. package/dist/types/interceptors/utils.d.ts +1 -0
  87. package/dist/types/locus-info/index.d.ts +60 -8
  88. package/dist/types/locus-info/types.d.ts +7 -0
  89. package/dist/types/media/MediaConnectionAwaiter.d.ts +10 -1
  90. package/dist/types/media/properties.d.ts +2 -1
  91. package/dist/types/meeting/in-meeting-actions.d.ts +6 -0
  92. package/dist/types/meeting/index.d.ts +61 -7
  93. package/dist/types/meeting/request.d.ts +16 -1
  94. package/dist/types/meeting/request.type.d.ts +5 -0
  95. package/dist/types/meeting/util.d.ts +31 -0
  96. package/dist/types/meetings/index.d.ts +4 -2
  97. package/dist/types/member/index.d.ts +1 -0
  98. package/dist/types/member/util.d.ts +5 -0
  99. package/dist/types/metrics/constants.d.ts +1 -0
  100. package/dist/types/multistream/mediaRequestManager.d.ts +0 -23
  101. package/dist/types/reactions/reactions.type.d.ts +1 -0
  102. package/dist/types/webinar/utils.d.ts +6 -0
  103. package/dist/webinar/index.js +291 -91
  104. package/dist/webinar/index.js.map +1 -1
  105. package/dist/webinar/utils.js +25 -0
  106. package/dist/webinar/utils.js.map +1 -0
  107. package/package.json +24 -23
  108. package/src/aiEnableRequest/README.md +84 -0
  109. package/src/aiEnableRequest/index.ts +170 -0
  110. package/src/aiEnableRequest/utils.ts +25 -0
  111. package/src/annotation/index.ts +27 -7
  112. package/src/config.ts +4 -0
  113. package/src/constants.ts +29 -1
  114. package/src/hashTree/constants.ts +1 -0
  115. package/src/hashTree/hashTree.ts +17 -0
  116. package/src/hashTree/hashTreeParser.ts +745 -252
  117. package/src/hashTree/types.ts +4 -0
  118. package/src/hashTree/utils.ts +9 -0
  119. package/src/index.ts +8 -1
  120. package/src/interceptors/constant.ts +6 -0
  121. package/src/interceptors/dataChannelAuthToken.ts +170 -0
  122. package/src/interceptors/index.ts +2 -1
  123. package/src/interceptors/utils.ts +16 -0
  124. package/src/interpretation/index.ts +2 -2
  125. package/src/locus-info/controlsUtils.ts +11 -0
  126. package/src/locus-info/index.ts +579 -113
  127. package/src/locus-info/selfUtils.ts +1 -0
  128. package/src/locus-info/types.ts +8 -0
  129. package/src/media/MediaConnectionAwaiter.ts +41 -1
  130. package/src/media/properties.ts +3 -1
  131. package/src/meeting/in-meeting-actions.ts +12 -0
  132. package/src/meeting/index.ts +291 -76
  133. package/src/meeting/request.ts +42 -0
  134. package/src/meeting/request.type.ts +6 -0
  135. package/src/meeting/util.ts +160 -2
  136. package/src/meetings/index.ts +157 -44
  137. package/src/member/index.ts +10 -0
  138. package/src/member/util.ts +12 -0
  139. package/src/metrics/constants.ts +1 -0
  140. package/src/multistream/mediaRequestManager.ts +4 -54
  141. package/src/multistream/remoteMediaManager.ts +13 -0
  142. package/src/reachability/index.ts +9 -0
  143. package/src/reactions/reactions.type.ts +1 -0
  144. package/src/reconnection-manager/index.ts +0 -1
  145. package/src/webinar/index.ts +191 -6
  146. package/src/webinar/utils.ts +16 -0
  147. package/test/unit/spec/aiEnableRequest/index.ts +981 -0
  148. package/test/unit/spec/aiEnableRequest/utils.ts +130 -0
  149. package/test/unit/spec/annotation/index.ts +69 -7
  150. package/test/unit/spec/hashTree/hashTree.ts +66 -0
  151. package/test/unit/spec/hashTree/hashTreeParser.ts +2225 -189
  152. package/test/unit/spec/interceptors/dataChannelAuthToken.ts +210 -0
  153. package/test/unit/spec/interceptors/utils.ts +75 -0
  154. package/test/unit/spec/locus-info/controlsUtils.js +29 -0
  155. package/test/unit/spec/locus-info/index.js +1134 -55
  156. package/test/unit/spec/media/MediaConnectionAwaiter.ts +41 -1
  157. package/test/unit/spec/media/properties.ts +12 -3
  158. package/test/unit/spec/meeting/in-meeting-actions.ts +8 -2
  159. package/test/unit/spec/meeting/index.js +829 -115
  160. package/test/unit/spec/meeting/request.js +70 -0
  161. package/test/unit/spec/meeting/utils.js +438 -26
  162. package/test/unit/spec/meetings/index.js +653 -32
  163. package/test/unit/spec/member/index.js +28 -4
  164. package/test/unit/spec/member/util.js +65 -27
  165. package/test/unit/spec/multistream/mediaRequestManager.ts +2 -85
  166. package/test/unit/spec/multistream/remoteMediaManager.ts +30 -0
  167. package/test/unit/spec/reachability/index.ts +23 -0
  168. package/test/unit/spec/reconnection-manager/index.js +4 -8
  169. package/test/unit/spec/webinar/index.ts +474 -37
  170. package/test/unit/spec/webinar/utils.ts +39 -0
@@ -138,6 +138,7 @@ const SelfUtils = {
138
138
  updates.breakoutsChanged = SelfUtils.breakoutsChanged(previous, current);
139
139
  updates.interpretationChanged = SelfUtils.interpretationChanged(previous, current);
140
140
  updates.brbChanged = SelfUtils.brbChanged(previous, current);
141
+ updates.selfIdChanged = previous?.selfId !== current.selfId;
141
142
 
142
143
  return {
143
144
  previous,
@@ -19,6 +19,7 @@ export type Links = {
19
19
 
20
20
  export type LocusDTO = {
21
21
  controls?: any;
22
+ embeddedApps?: any[];
22
23
  fullState?: LocusFullState;
23
24
  host?: {
24
25
  id: string;
@@ -31,6 +32,7 @@ export type LocusDTO = {
31
32
  info?: any;
32
33
  jsSdkMeta?: {
33
34
  removedParticipantIds: string[]; // list of ids of participants that are removed in the last update
35
+ forceReplaceMembers?: boolean; // when true, forces a full replacement of meeting members (e.g. when switching to a new hash tree parser - when moving between breakouts)
34
36
  };
35
37
  links?: Links;
36
38
  mediaShares?: any[];
@@ -51,3 +53,9 @@ export type LocusDTO = {
51
53
  syncUrl?: string;
52
54
  url?: string;
53
55
  };
56
+
57
+ export type ReplacesInfo = {
58
+ locusUrl: string;
59
+ replacedAt: string;
60
+ sessionId: string;
61
+ };
@@ -2,9 +2,12 @@ import {Defer} from '@webex/common';
2
2
  import {ConnectionState, MediaConnectionEventNames} from '@webex/internal-media-core';
3
3
  import LoggerProxy from '../common/logs/logger-proxy';
4
4
  import {ICE_AND_DTLS_CONNECTION_TIMEOUT} from '../constants';
5
+ import BEHAVIORAL_METRICS from '../metrics/constants';
6
+ import Metrics from '../metrics';
5
7
 
6
8
  export interface MediaConnectionAwaiterProps {
7
9
  webrtcMediaConnection: any;
10
+ correlationId: string;
8
11
  }
9
12
 
10
13
  /**
@@ -16,6 +19,7 @@ export default class MediaConnectionAwaiter {
16
19
  private defer: Defer;
17
20
  private retried: boolean;
18
21
  private iceConnected: boolean;
22
+ private correlationId: string;
19
23
  private onTimeoutCallback: () => void;
20
24
  private peerConnectionStateCallback: () => void;
21
25
  private iceConnectionStateCallback: () => void;
@@ -24,11 +28,12 @@ export default class MediaConnectionAwaiter {
24
28
  /**
25
29
  * @param {MediaConnectionAwaiterProps} mediaConnectionAwaiterProps
26
30
  */
27
- constructor({webrtcMediaConnection}: MediaConnectionAwaiterProps) {
31
+ constructor({webrtcMediaConnection, correlationId}: MediaConnectionAwaiterProps) {
28
32
  this.webrtcMediaConnection = webrtcMediaConnection;
29
33
  this.defer = new Defer();
30
34
  this.retried = false;
31
35
  this.iceConnected = false;
36
+ this.correlationId = correlationId;
32
37
  this.onTimeoutCallback = this.onTimeout.bind(this);
33
38
  this.peerConnectionStateCallback = this.peerConnectionStateHandler.bind(this);
34
39
  this.iceConnectionStateCallback = this.iceConnectionStateHandler.bind(this);
@@ -175,6 +180,32 @@ export default class MediaConnectionAwaiter {
175
180
  this.timer = setTimeout(this.onTimeoutCallback, ICE_AND_DTLS_CONNECTION_TIMEOUT);
176
181
  }
177
182
 
183
+ /**
184
+ * sends a metric with some additional info that might help debugging
185
+ * issues where browser doesn't update the RTCPeerConnection's iceConnectionState or connectionState
186
+ *
187
+ * @returns {void}
188
+ */
189
+ async sendMetric() {
190
+ const stats = await this.webrtcMediaConnection.getStats();
191
+
192
+ // in theory we can end up with more than one transport report in the stats,
193
+ // but for the purpose of this metric it's fine to just use the first one
194
+ const transportReports = Array.from(
195
+ stats.values().filter((report) => report.type === 'transport')
196
+ ) as Record<string, number | string>[];
197
+
198
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEDIA_STILL_NOT_CONNECTED, {
199
+ correlation_id: this.correlationId,
200
+ numTransports: transportReports.length,
201
+ dtlsState: transportReports[0]?.dtlsState,
202
+ iceState: transportReports[0]?.iceState,
203
+ packetsSent: transportReports[0]?.packetsSent,
204
+ packetsReceived: transportReports[0]?.packetsReceived,
205
+ dataChannelState: this.webrtcMediaConnection.multistreamConnection?.dataChannel?.readyState,
206
+ });
207
+ }
208
+
178
209
  /**
179
210
  * Function called when the timeout is reached.
180
211
  *
@@ -189,6 +220,8 @@ export default class MediaConnectionAwaiter {
189
220
  return;
190
221
  }
191
222
 
223
+ this.sendMetric();
224
+
192
225
  if (!this.isIceGatheringCompleted()) {
193
226
  if (!this.retried) {
194
227
  LoggerProxy.logger.warn(
@@ -226,8 +259,15 @@ export default class MediaConnectionAwaiter {
226
259
  */
227
260
  waitForMediaConnectionConnected(): Promise<void> {
228
261
  if (this.isConnected()) {
262
+ LoggerProxy.logger.log(
263
+ 'Media:MediaConnectionAwaiter#waitForMediaConnectionConnected --> Already connected'
264
+ );
265
+
229
266
  return Promise.resolve();
230
267
  }
268
+ LoggerProxy.logger.log(
269
+ 'Media:MediaConnectionAwaiter#waitForMediaConnectionConnected --> Waiting for media connection to be connected'
270
+ );
231
271
 
232
272
  this.webrtcMediaConnection.on(
233
273
  MediaConnectionEventNames.PEER_CONNECTION_STATE_CHANGED,
@@ -196,11 +196,13 @@ export default class MediaProperties {
196
196
  /**
197
197
  * Waits for the webrtc media connection to be connected.
198
198
  *
199
+ * @param {string} correlationId
199
200
  * @returns {Promise<void>}
200
201
  */
201
- waitForMediaConnectionConnected(): Promise<void> {
202
+ waitForMediaConnectionConnected(correlationId: string): Promise<void> {
202
203
  const mediaConnectionAwaiter = new MediaConnectionAwaiter({
203
204
  webrtcMediaConnection: this.webrtcMediaConnection,
205
+ correlationId,
204
206
  });
205
207
 
206
208
  return mediaConnectionAwaiter.waitForMediaConnectionConnected();
@@ -32,6 +32,7 @@ interface IInMeetingActions {
32
32
  canLowerAllHands?: boolean;
33
33
  canLowerSomeoneElsesHand?: boolean;
34
34
  bothLeaveAndEndMeetingAvailable?: boolean;
35
+ requireHostEndMeetingBeforeLeave?: boolean;
35
36
  canEnableClosedCaption?: boolean;
36
37
  canStartTranscribing?: boolean;
37
38
  canStopTranscribing?: boolean;
@@ -117,6 +118,8 @@ interface IInMeetingActions {
117
118
  canMoveToLobby?: boolean;
118
119
  canEnablePollingQA?: boolean;
119
120
  canDisablePollingQA?: boolean;
121
+ canAttendeeRequestAiAssistantEnabled?: boolean;
122
+ isAttendeeRequestAiAssistantDeclinedAll?: boolean;
120
123
  }
121
124
 
122
125
  /**
@@ -169,6 +172,8 @@ export default class InMeetingActions implements IInMeetingActions {
169
172
 
170
173
  bothLeaveAndEndMeetingAvailable = null;
171
174
 
175
+ requireHostEndMeetingBeforeLeave = null;
176
+
172
177
  canEnableClosedCaption = null;
173
178
 
174
179
  canStartTranscribing = null;
@@ -337,6 +342,10 @@ export default class InMeetingActions implements IInMeetingActions {
337
342
 
338
343
  canDisablePollingQA = null;
339
344
 
345
+ canAttendeeRequestAiAssistantEnabled = null;
346
+
347
+ isAttendeeRequestAiAssistantDeclinedAll = null;
348
+
340
349
  /**
341
350
  * Returns all meeting action options
342
351
  * @returns {Object}
@@ -364,6 +373,7 @@ export default class InMeetingActions implements IInMeetingActions {
364
373
  canLowerAllHands: this.canLowerAllHands,
365
374
  canLowerSomeoneElsesHand: this.canLowerSomeoneElsesHand,
366
375
  bothLeaveAndEndMeetingAvailable: this.bothLeaveAndEndMeetingAvailable,
376
+ requireHostEndMeetingBeforeLeave: this.requireHostEndMeetingBeforeLeave,
367
377
  canEnableClosedCaption: this.canEnableClosedCaption,
368
378
  canStartTranscribing: this.canStartTranscribing,
369
379
  canStopTranscribing: this.canStopTranscribing,
@@ -448,6 +458,8 @@ export default class InMeetingActions implements IInMeetingActions {
448
458
  canMoveToLobby: this.canMoveToLobby,
449
459
  canEnablePollingQA: this.canEnablePollingQA,
450
460
  canDisablePollingQA: this.canDisablePollingQA,
461
+ canAttendeeRequestAiAssistantEnabled: this.canAttendeeRequestAiAssistantEnabled,
462
+ isAttendeeRequestAiAssistantDeclinedAll: this.isAttendeeRequestAiAssistantDeclinedAll,
451
463
  });
452
464
 
453
465
  /**