@webex/plugin-meetings 3.9.0 → 3.10.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 (117) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.js +8 -0
  4. package/dist/constants.js.map +1 -1
  5. package/dist/controls-options-manager/index.js +22 -5
  6. package/dist/controls-options-manager/index.js.map +1 -1
  7. package/dist/index.js +2 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/interceptors/index.js +7 -0
  10. package/dist/interceptors/index.js.map +1 -1
  11. package/dist/interceptors/locusRouteToken.js +116 -0
  12. package/dist/interceptors/locusRouteToken.js.map +1 -0
  13. package/dist/interpretation/index.js +1 -1
  14. package/dist/interpretation/siLanguage.js +1 -1
  15. package/dist/locus-info/controlsUtils.js +11 -2
  16. package/dist/locus-info/controlsUtils.js.map +1 -1
  17. package/dist/locus-info/index.js +56 -14
  18. package/dist/locus-info/index.js.map +1 -1
  19. package/dist/locus-info/parser.js +4 -1
  20. package/dist/locus-info/parser.js.map +1 -1
  21. package/dist/media/properties.js +53 -5
  22. package/dist/media/properties.js.map +1 -1
  23. package/dist/meeting/in-meeting-actions.js +8 -0
  24. package/dist/meeting/in-meeting-actions.js.map +1 -1
  25. package/dist/meeting/index.js +339 -185
  26. package/dist/meeting/index.js.map +1 -1
  27. package/dist/meeting/muteState.js +2 -5
  28. package/dist/meeting/muteState.js.map +1 -1
  29. package/dist/meeting/request.js +177 -14
  30. package/dist/meeting/request.js.map +1 -1
  31. package/dist/meeting/util.js +39 -11
  32. package/dist/meeting/util.js.map +1 -1
  33. package/dist/meeting-info/meeting-info-v2.js +29 -21
  34. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  35. package/dist/meetings/index.js +31 -25
  36. package/dist/meetings/index.js.map +1 -1
  37. package/dist/member/index.js +9 -0
  38. package/dist/member/index.js.map +1 -1
  39. package/dist/member/types.js.map +1 -1
  40. package/dist/member/util.js +10 -0
  41. package/dist/member/util.js.map +1 -1
  42. package/dist/members/collection.js +13 -0
  43. package/dist/members/collection.js.map +1 -1
  44. package/dist/members/index.js +42 -20
  45. package/dist/members/index.js.map +1 -1
  46. package/dist/members/util.js +7 -2
  47. package/dist/members/util.js.map +1 -1
  48. package/dist/metrics/constants.js +2 -1
  49. package/dist/metrics/constants.js.map +1 -1
  50. package/dist/reachability/index.js +3 -3
  51. package/dist/reachability/index.js.map +1 -1
  52. package/dist/types/constants.d.ts +7 -0
  53. package/dist/types/controls-options-manager/index.d.ts +9 -1
  54. package/dist/types/interceptors/index.d.ts +2 -1
  55. package/dist/types/interceptors/locusRouteToken.d.ts +38 -0
  56. package/dist/types/locus-info/index.d.ts +56 -2
  57. package/dist/types/media/properties.d.ts +21 -0
  58. package/dist/types/meeting/in-meeting-actions.d.ts +8 -0
  59. package/dist/types/meeting/index.d.ts +41 -1
  60. package/dist/types/meeting/request.d.ts +42 -0
  61. package/dist/types/meeting/util.d.ts +13 -3
  62. package/dist/types/meeting-info/meeting-info-v2.d.ts +6 -3
  63. package/dist/types/meetings/index.d.ts +3 -1
  64. package/dist/types/member/index.d.ts +1 -0
  65. package/dist/types/member/types.d.ts +1 -0
  66. package/dist/types/member/util.d.ts +5 -0
  67. package/dist/types/members/collection.d.ts +6 -0
  68. package/dist/types/members/index.d.ts +12 -2
  69. package/dist/types/members/util.d.ts +6 -3
  70. package/dist/types/metrics/constants.d.ts +1 -0
  71. package/dist/webinar/index.js +1 -1
  72. package/package.json +23 -23
  73. package/src/constants.ts +10 -0
  74. package/src/controls-options-manager/index.ts +26 -5
  75. package/src/index.ts +2 -1
  76. package/src/interceptors/index.ts +2 -1
  77. package/src/interceptors/locusRouteToken.ts +80 -0
  78. package/src/locus-info/controlsUtils.ts +18 -0
  79. package/src/locus-info/index.ts +99 -17
  80. package/src/locus-info/parser.ts +5 -1
  81. package/src/media/properties.ts +43 -0
  82. package/src/meeting/in-meeting-actions.ts +16 -0
  83. package/src/meeting/index.ts +204 -24
  84. package/src/meeting/muteState.ts +2 -6
  85. package/src/meeting/request.ts +141 -0
  86. package/src/meeting/util.ts +50 -20
  87. package/src/meeting-info/meeting-info-v2.ts +24 -5
  88. package/src/meetings/index.ts +9 -3
  89. package/src/member/index.ts +10 -0
  90. package/src/member/types.ts +1 -0
  91. package/src/member/util.ts +14 -0
  92. package/src/members/collection.ts +11 -0
  93. package/src/members/index.ts +38 -5
  94. package/src/members/util.ts +18 -2
  95. package/src/metrics/constants.ts +1 -0
  96. package/src/reachability/index.ts +3 -3
  97. package/test/unit/spec/common/browser-detection.js +0 -24
  98. package/test/unit/spec/controls-options-manager/index.js +47 -0
  99. package/test/unit/spec/fixture/locus.js +1 -0
  100. package/test/unit/spec/interceptors/locusRouteToken.ts +87 -0
  101. package/test/unit/spec/locus-info/index.js +91 -15
  102. package/test/unit/spec/locus-info/parser.js +3 -2
  103. package/test/unit/spec/media/properties.ts +137 -0
  104. package/test/unit/spec/meeting/in-meeting-actions.ts +8 -0
  105. package/test/unit/spec/meeting/index.js +398 -30
  106. package/test/unit/spec/meeting/muteState.js +32 -6
  107. package/test/unit/spec/meeting/request.js +21 -0
  108. package/test/unit/spec/meeting/utils.js +49 -17
  109. package/test/unit/spec/meeting-info/meetinginfov2.js +8 -3
  110. package/test/unit/spec/meetings/index.js +10 -5
  111. package/test/unit/spec/member/util.js +24 -0
  112. package/test/unit/spec/members/collection.js +120 -0
  113. package/test/unit/spec/members/index.js +72 -3
  114. package/test/unit/spec/members/request.js +55 -0
  115. package/test/unit/spec/members/utils.js +116 -14
  116. package/test/unit/spec/reachability/index.ts +158 -3
  117. package/test/unit/spec/roap/turnDiscovery.ts +3 -3
@@ -1,5 +1,6 @@
1
1
  import { LocalCameraStream, LocalMicrophoneStream, LocalDisplayStream, LocalSystemAudioStream, RemoteStream } from '@webex/media-helpers';
2
2
  import { ClientEvent } from '@webex/internal-plugin-metrics';
3
+ import { throttle } from 'lodash';
3
4
  export type MediaDirection = {
4
5
  sendAudio: boolean;
5
6
  sendVideo: boolean;
@@ -26,6 +27,10 @@ export default class MediaProperties {
26
27
  videoDeviceId: any;
27
28
  videoStream?: LocalCameraStream;
28
29
  namespace: string;
30
+ mediaIssueCounters: {
31
+ [key: string]: number;
32
+ };
33
+ throttledSendMediaIssueMetric: ReturnType<typeof throttle>;
29
34
  /**
30
35
  * @param {Object} [options] -- to auto construct
31
36
  * @returns {MediaProperties}
@@ -63,6 +68,11 @@ export default class MediaProperties {
63
68
  * @returns {void}
64
69
  */
65
70
  setVideoDeviceId(deviceId: string): void;
71
+ /**
72
+ * Clears the webrtcMediaConnection. This method should be called after
73
+ * peer connection is closed and no longer needed.
74
+ * @returns {void}
75
+ */
66
76
  unsetPeerConnection(): void;
67
77
  /**
68
78
  * Removes both remote audio and video from class instance
@@ -129,4 +139,15 @@ export default class MediaProperties {
129
139
  selectedCandidatePairChanges: number;
130
140
  numTransports: number;
131
141
  }>;
142
+ /**
143
+ * Sends a metric about a media issue. Metrics are throttled so that we don't
144
+ * send too many of them, but include a count so that we know how many issues
145
+ * were detected.
146
+ *
147
+ * @param {string} issueType
148
+ * @param {string} issueSubType
149
+ * @param {string} correlationId
150
+ * @returns {void}
151
+ */
152
+ sendMediaIssueMetric(issueType: string, issueSubType: string, correlationId: any): void;
132
153
  }
@@ -37,8 +37,11 @@ interface IInMeetingActions {
37
37
  isLocalRecordingStarted?: boolean;
38
38
  isLocalRecordingStopped?: boolean;
39
39
  isLocalRecordingPaused?: boolean;
40
+ isLocalStreamingStarted?: boolean;
41
+ isLocalStreamingStopped?: boolean;
40
42
  isManualCaptionActive?: boolean;
41
43
  isSaveTranscriptsEnabled?: boolean;
44
+ isSpokenLanguageAutoDetectionEnabled?: boolean;
42
45
  isWebexAssistantActive?: boolean;
43
46
  canViewCaptionPanel?: boolean;
44
47
  isRealTimeTranslationEnabled?: boolean;
@@ -86,6 +89,7 @@ interface IInMeetingActions {
86
89
  canDoVideo?: boolean;
87
90
  canAnnotate?: boolean;
88
91
  canUseVoip?: boolean;
92
+ showAutoEndMeetingWarning?: boolean;
89
93
  supportHQV?: boolean;
90
94
  supportHDV?: boolean;
91
95
  canShareWhiteBoard?: boolean;
@@ -146,7 +150,10 @@ export default class InMeetingActions implements IInMeetingActions {
146
150
  isLocalRecordingStarted: any;
147
151
  isLocalRecordingPaused: any;
148
152
  isManualCaptionActive: any;
153
+ isLocalStreamingStarted: any;
154
+ isLocalStreamingStopped: any;
149
155
  isSaveTranscriptsEnabled: any;
156
+ isSpokenLanguageAutoDetectionEnabled: any;
150
157
  isWebexAssistantActive: any;
151
158
  canViewCaptionPanel: any;
152
159
  isRealTimeTranslationEnabled: any;
@@ -194,6 +201,7 @@ export default class InMeetingActions implements IInMeetingActions {
194
201
  canDoVideo: any;
195
202
  canAnnotate: any;
196
203
  canUseVoip: any;
204
+ showAutoEndMeetingWarning: any;
197
205
  supportHQV: any;
198
206
  enforceVirtualBackground: any;
199
207
  supportHDV: any;
@@ -2,7 +2,7 @@
2
2
  import { StatelessWebexPlugin } from '@webex/webex-core';
3
3
  import { ClientEvent, ClientEventLeaveReason } from '@webex/internal-plugin-metrics';
4
4
  import { ClientEvent as RawClientEvent } from '@webex/event-dictionary-ts';
5
- import { MediaType, StatsAnalyzer, NetworkQualityMonitor } from '@webex/internal-media-core';
5
+ import { MediaType, StatsAnalyzer, NetworkQualityMonitor, StatsMonitor } from '@webex/internal-media-core';
6
6
  import { LocalStream, LocalCameraStream, LocalDisplayStream, LocalSystemAudioStream, LocalMicrophoneStream } from '@webex/media-helpers';
7
7
  import Roap, { type TurnDiscoverySkipReason } from '../roap/index';
8
8
  import { type TurnServerInfo } from '../roap/types';
@@ -98,6 +98,7 @@ export declare enum ScreenShareFloorStatus {
98
98
  type FetchMeetingInfoParams = {
99
99
  password?: string;
100
100
  registrationId?: string;
101
+ classificationId?: string;
101
102
  captchaCode?: string;
102
103
  extraParams?: Record<string, any>;
103
104
  sendCAevents?: boolean;
@@ -428,6 +429,7 @@ export default class Meeting extends StatelessWebexPlugin {
428
429
  shareStatus: string;
429
430
  screenShareFloorState: ScreenShareFloorStatus;
430
431
  statsAnalyzer: StatsAnalyzer;
432
+ statsMonitor: StatsMonitor;
431
433
  transcription: Transcription;
432
434
  updateMediaConnections: (mediaConnections: any[]) => void;
433
435
  userDisplayHints: any;
@@ -1906,6 +1908,20 @@ export default class Meeting extends StatelessWebexPlugin {
1906
1908
  * @memberof Meeting
1907
1909
  */
1908
1910
  sendReaction(reactionType: ReactionServerType, skinToneType?: SkinToneType): any;
1911
+ /**
1912
+ * Extend the current meeting duration.
1913
+ *
1914
+ * @param {number} extensionMinutes - how many minutes to extend
1915
+ * @returns {Promise}
1916
+ * @public
1917
+ * @memberof Meeting
1918
+ */
1919
+ extendMeeting({ meetingPolicyUrl, meetingInstanceId, participantId, extensionMinutes, }: {
1920
+ meetingPolicyUrl: any;
1921
+ meetingInstanceId: any;
1922
+ participantId: any;
1923
+ extensionMinutes?: number;
1924
+ }): any;
1909
1925
  /**
1910
1926
  * Method to enable or disable reactions inside the meeting.
1911
1927
  *
@@ -2021,5 +2037,29 @@ export default class Meeting extends StatelessWebexPlugin {
2021
2037
  * @returns {Promise} The locus request
2022
2038
  */
2023
2039
  unsetStage(): Promise<any>;
2040
+ /**
2041
+ * Notifies the host with the given meeting UUID and display names.
2042
+ *
2043
+ * @param {string} meetingUuid - The UUID of the meeting.
2044
+ * @param {string[]} displayName - An array of display names to notify the host with.
2045
+ * @returns {Promise<any>} The result of the notifyHost request.
2046
+ */
2047
+ notifyHost(meetingUuid: string, displayName: string[]): any;
2048
+ /**
2049
+ * Call out a SIP participant to a meeting
2050
+ * @param {string} address - The SIP address or phone number
2051
+ * @param {string} displayName - The display name for the participant
2052
+ * @param {string} [correlationId] - Optional correlation ID
2053
+ * @returns {Promise} Promise that resolves when the call-out is initiated
2054
+ */
2055
+ sipCallOut(address: string, displayName: string): Promise<any>;
2056
+ /**
2057
+ * Cancel an ongoing SIP call-out
2058
+ * @param {string} participantId - The participant ID to cancel
2059
+ * @returns {Promise} Promise that resolves when the call-out is cancelled
2060
+ * @public
2061
+ * @memberof Meetings
2062
+ */
2063
+ cancelSipCallOut(participantId: string): Promise<any>;
2024
2064
  }
2025
2065
  export {};
@@ -284,6 +284,22 @@ export default class MeetingRequest extends StatelessWebexPlugin {
284
284
  * @returns {Promise}
285
285
  */
286
286
  sendReaction({ reactionChannelUrl, reaction, participantId }: SendReactionOptions): any;
287
+ /**
288
+ * Extend the current meeting duration.
289
+ *
290
+ * @param {Object} params - Parameters for extending the meeting.
291
+ * @param {string} params.meetingInstanceId - The unique ID of the meeting instance.
292
+ * @param {string} params.participantId - The ID of the participant requesting the extension.
293
+ * @param {number} params.extensionMinutes - The number of minutes to extend the meeting by.
294
+ * @param {string} params.meetingPolicyUrl - The base URL for meeting policy service (dynamic, from locus links)
295
+ * @returns {Promise<any>} A promise that resolves with the server response.
296
+ */
297
+ extendMeeting({ meetingInstanceId, participantId, extensionMinutes, meetingPolicyUrl, }: {
298
+ meetingInstanceId: string;
299
+ participantId: string;
300
+ extensionMinutes: number;
301
+ meetingPolicyUrl: string;
302
+ }): any;
287
303
  /**
288
304
  * Make a network request to enable or disable reactions.
289
305
  * @param {boolean} options.enable - determines if we need to enable or disable.
@@ -322,4 +338,30 @@ export default class MeetingRequest extends StatelessWebexPlugin {
322
338
  * @returns {Promise} The locus request
323
339
  */
324
340
  synchronizeStage(locusUrl: string, videoLayout: SynchronizeVideoLayout): Promise<any>;
341
+ /**
342
+ * Sends a request to notify the host of a meeting.
343
+ * @param {string} siteFullUrl - The site URL.
344
+ * @param {string} locusId - The locus ID.
345
+ * @param {string} meetingUuid - The meeting UUID.
346
+ * @param {Array<string>} displayName - The display names to notify the host about.
347
+ * @returns {Promise}
348
+ */
349
+ notifyHost(siteFullUrl: string, locusId: string, meetingUuid: string, displayName: string[]): any;
350
+ /**
351
+ * Call out to a SIP participant
352
+ *
353
+ * @param {any} meetingId - The meeting ID.
354
+ * @param {any} meetingNumber - The meeting number.
355
+ * @param {string} address - The SIP address to call out.
356
+ * @param {string} displayName - The display name for the participant.
357
+ * @returns {Promise} The API response
358
+ */
359
+ sipCallOut(meetingId: any, meetingNumber: any, address: any, displayName: any): Promise<any>;
360
+ /**
361
+ * Cancel an ongoing SIP call-out
362
+ *
363
+ * @param {string} participantId - The ID of the participant whose SIP call-out should be cancelled.
364
+ * @returns {Promise} The API response
365
+ */
366
+ cancelSipCallOut(participantId: any): Promise<any>;
325
367
  }
@@ -14,6 +14,12 @@ declare const MeetingUtil: {
14
14
  * @returns {IP_VERSION|undefined} ipver value to be passed to the backend APIs or undefined if we should not pass any value to the backend
15
15
  */
16
16
  getIpVersion(webex: any): IP_VERSION | undefined;
17
+ /**
18
+ * Returns CA event labels related to Orpheus ipver parameter that can be sent to CA with any CA event
19
+ * @param {any} webex instance
20
+ * @returns {Array<string>|undefined} array of CA event labels or undefined if no labels should be sent
21
+ */
22
+ getCaEventLabelsForIpVersion(webex: any): Array<string> | undefined;
17
23
  joinMeeting: (meeting: any, options: any) => Promise<any>;
18
24
  cleanUp: (meeting: any) => any;
19
25
  disconnectPhoneAudio: (meeting: any, phoneUrl: any) => any;
@@ -74,13 +80,17 @@ declare const MeetingUtil: {
74
80
  isLocalRecordingStarted: (displayHints: any) => any;
75
81
  isLocalRecordingStopped: (displayHints: any) => any;
76
82
  isLocalRecordingPaused: (displayHints: any) => any;
83
+ isLocalStreamingStarted: (displayHints: any) => any;
84
+ isLocalStreamingStopped: (displayHints: any) => any;
77
85
  canStopManualCaption: (displayHints: any) => any;
78
86
  isManualCaptionActive: (displayHints: any) => any;
87
+ isSpokenLanguageAutoDetectionEnabled: (displayHints: any) => any;
79
88
  isWebexAssistantActive: (displayHints: any) => any;
80
89
  canViewCaptionPanel: (displayHints: any) => any;
81
90
  isRealTimeTranslationEnabled: (displayHints: any) => any;
82
91
  canSelectSpokenLanguages: (displayHints: any) => any;
83
92
  waitingForOthersToJoin: (displayHints: any) => any;
93
+ showAutoEndMeetingWarning: (displayHints: any) => any;
84
94
  canSendReactions: (originalValue: any, displayHints: any) => any;
85
95
  canUserRenameSelfAndObserved: (displayHints: any) => any;
86
96
  requiresPostMeetingDataConsentPrompt: (displayHints: any) => any;
@@ -95,14 +105,14 @@ declare const MeetingUtil: {
95
105
  */
96
106
  addSequence: (meeting: any, requestBody: any) => void;
97
107
  /**
98
- * Updates the locus info for the meeting with the delta locus
99
- * returned from requests that include the sequence information
108
+ * Updates the locus info for the meeting with the locus
109
+ * information returned from API requests made to Locus
100
110
  * Returns the original response object
101
111
  * @param {Object} meeting The meeting object
102
112
  * @param {Object} response The response of the http request
103
113
  * @returns {Object}
104
114
  */
105
- updateLocusWithDelta: (meeting: any, response: any) => any;
115
+ updateLocusFromApiResponse: (meeting: any, response: any) => any;
106
116
  generateBuildLocusDeltaRequestOptions: (originalMeeting: any) => (originalOptions: any) => any;
107
117
  generateLocusDeltaRequest: (originalMeeting: any) => (originalOptions: any) => any;
108
118
  selfSupportsFeature: (feature: SELF_POLICY, userPolicies: Record<SELF_POLICY, boolean>) => boolean;
@@ -187,20 +187,22 @@ export default class MeetingInfoV2 {
187
187
  * @param {String} conversationUrl conversationUrl to start adhoc meeting on
188
188
  * @param {String} installedOrgID org ID of user's machine
189
189
  * @param {Boolean} enableStaticMeetingLink whether or not to enable static meeting link
190
+ * @param {String} classificationId need it to start adhoc meeting if space support classification
190
191
  * @returns {Promise} returns a meeting info object
191
192
  * @public
192
193
  * @memberof MeetingInfo
193
194
  */
194
- createAdhocSpaceMeetingOrEnableStaticMeetingLink(conversationUrl: string, installedOrgID?: string, enableStaticMeetingLink?: boolean): Promise<any>;
195
+ createAdhocSpaceMeetingOrEnableStaticMeetingLink(conversationUrl: string, installedOrgID?: string, enableStaticMeetingLink?: boolean, classificationId?: any): Promise<any>;
195
196
  /**
196
197
  * Creates adhoc space meetings for a space by fetching the conversation infomation
197
198
  * @param {String} conversationUrl conversationUrl to start adhoc meeting on
198
199
  * @param {String} installedOrgID org ID of user's machine
200
+ * @param {String} classificationId if space is support classification, it needs provide it during start instant meeting
199
201
  * @returns {Promise} returns a meeting info object
200
202
  * @public
201
203
  * @memberof MeetingInfo
202
204
  */
203
- createAdhocSpaceMeeting(conversationUrl: string, installedOrgID?: string): Promise<any>;
205
+ createAdhocSpaceMeeting(conversationUrl: string, installedOrgID?: string, classificationId?: string): Promise<any>;
204
206
  /**
205
207
  * Fetches details for static meeting link
206
208
  * @param {String} conversationUrl conversationUrl that's required to find static meeting link if it exists
@@ -239,6 +241,7 @@ export default class MeetingInfoV2 {
239
241
  * @param {Object} options
240
242
  * @param {String} registrationId
241
243
  * @param {String} fullSiteUrl
244
+ * @param {String} classificationId
242
245
  * @returns {Promise} returns a meeting info object
243
246
  * @public
244
247
  * @memberof MeetingInfo
@@ -249,5 +252,5 @@ export default class MeetingInfoV2 {
249
252
  }, installedOrgID?: any, locusId?: any, extraParams?: object, options?: {
250
253
  meetingId?: string;
251
254
  sendCAevents?: boolean;
252
- }, registrationId?: string, fullSiteUrl?: string): Promise<any>;
255
+ }, registrationId?: string, fullSiteUrl?: string, classificationId?: string): Promise<any>;
253
256
  }
@@ -400,11 +400,12 @@ export default class Meetings extends WebexPlugin {
400
400
  * @param {Object} [meetingInfo] - Pre-fetched complete meeting info
401
401
  * @param {String} [meetingLookupUrl] - meeting info prefetch url
402
402
  * @param {string} sessionCorrelationId - the optional specified sessionCorrelationId (callStateForMetrics.sessionCorrelationId) can be provided instead
403
+ * @param {String} classificationId - If space support classification, it will provide it while start instant meeting
403
404
  * @returns {Promise<Meeting>} A new Meeting.
404
405
  * @public
405
406
  * @memberof Meetings
406
407
  */
407
- create(destination: string, type?: DESTINATION_TYPE, useRandomDelayForInfo?: boolean, infoExtraParams?: {}, correlationId?: string, failOnMissingMeetingInfo?: boolean, callStateForMetrics?: CallStateForMetrics, meetingInfo?: any, meetingLookupUrl?: any, sessionCorrelationId?: string): any;
408
+ create(destination: string, type?: DESTINATION_TYPE, useRandomDelayForInfo?: boolean, infoExtraParams?: {}, correlationId?: string, failOnMissingMeetingInfo?: boolean, callStateForMetrics?: CallStateForMetrics, meetingInfo?: any, meetingLookupUrl?: any, sessionCorrelationId?: string, classificationId?: string): any;
408
409
  /**
409
410
  * Enable static meeting links for given conversation url.
410
411
  *
@@ -438,6 +439,7 @@ export default class Meetings extends WebexPlugin {
438
439
  * @param {Boolean} failOnMissingMeetingInfo - whether to throw an error if meeting info fails to fetch (for calls that are not 1:1 or content share)
439
440
  * @param {Object} [meetingInfo] - Pre-fetched complete meeting info
440
441
  * @param {String} [meetingLookupUrl] - meeting info prefetch url
442
+ * @param {String} classificationId see create()
441
443
  * @returns {Promise} a new meeting instance complete with meeting info and destination
442
444
  * @private
443
445
  * @memberof Meetings
@@ -35,6 +35,7 @@ export default class Member {
35
35
  status: any;
36
36
  supportsBreakouts: boolean;
37
37
  supportsInterpretation: boolean;
38
+ supportsSingleUserAutoEndMeeting: boolean;
38
39
  supportLiveAnnotation: boolean;
39
40
  type: any;
40
41
  namespace: string;
@@ -95,4 +95,5 @@ export interface Participant {
95
95
  status: ParticipantMediaStatus;
96
96
  type: string;
97
97
  url: ParticipantUrl;
98
+ isRemoved: boolean;
98
99
  }
@@ -96,6 +96,11 @@ declare const MemberUtil: {
96
96
  * @returns {Boolean}
97
97
  */
98
98
  isBreakoutsSupported: (participant: any) => boolean;
99
+ /**
100
+ * @param {Object} participant - The locus participant object.
101
+ * @returns {Boolean}
102
+ */
103
+ isSupportsSingleUserAutoEndMeeting: (participant: any) => boolean;
99
104
  /**
100
105
  * @param {Object} participant - The locus participant object.
101
106
  * @returns {Boolean}
@@ -22,6 +22,12 @@ export default class MembersCollection {
22
22
  * @memberof MembersCollection
23
23
  */
24
24
  getAll(): Record<string, Member>;
25
+ /**
26
+ * Removes a member from the collection
27
+ * @param {String} id
28
+ * @returns {void}
29
+ */
30
+ remove(id: string): void;
25
31
  /**
26
32
  * @returns {void}
27
33
  * reset members
@@ -77,7 +77,9 @@ export default class Members extends StatelessWebexPlugin {
77
77
  * when new participant updates come in, both delta and full participants, update them in members collection
78
78
  * delta object in the event will have {updated, added} and full will be the full membersCollection
79
79
  * @param {Object} payload
80
- * @param {Object} payload.participants
80
+ * @param {Object} payload.participants new/updated participants
81
+ * @param {Boolean} payload.isReplace whether to replace the whole members collection
82
+ * @param {Object} payload.removedParticipantIds ids of the removed participants
81
83
  * @returns {undefined}
82
84
  * @private
83
85
  * @memberof Members
@@ -85,6 +87,7 @@ export default class Members extends StatelessWebexPlugin {
85
87
  locusParticipantsUpdate(payload: {
86
88
  participants: object;
87
89
  isReplace?: boolean;
90
+ removedParticipantIds?: Array<string>;
88
91
  }): void;
89
92
  /**
90
93
  * Internal update the content id
@@ -127,6 +130,12 @@ export default class Members extends StatelessWebexPlugin {
127
130
  * @memberof Members
128
131
  */
129
132
  private handleMembersUpdate;
133
+ /**
134
+ * removes members from the collection
135
+ * @param {Array<string>} removedMembers removed members ids
136
+ * @returns {void}
137
+ */
138
+ private removeMembers;
130
139
  /**
131
140
  * set members to the member collection from each updated/added lists as passed in
132
141
  * @param {Array} list
@@ -338,9 +347,10 @@ export default class Members extends StatelessWebexPlugin {
338
347
  * @param {string} memberId - id of the participant who is receiving request
339
348
  * @param {string} requestingParticipantId - id of the participant who is sending request (optional)
340
349
  * @param {string} [alias] - alias name
350
+ * @param {string} [suffix] - name suffix (optional)
341
351
  * @returns {Promise}
342
352
  * @public
343
353
  * @memberof Members
344
354
  */
345
- editDisplayName(memberId: string, requestingParticipantId: string, alias: string): any;
355
+ editDisplayName(memberId: string, requestingParticipantId: string, alias: string, suffix?: string): any;
346
356
  }
@@ -110,13 +110,15 @@ declare const MembersUtil: {
110
110
  * @param {String} requestingParticipantId id of the participant who is sending request (optional)
111
111
  * @param {String} alias alias name
112
112
  * @param {String} locusUrl url
113
+ * @param {String} suffix optional suffix
113
114
  * @returns {Object} consists of {memberID: string, requestingParticipantId: string, alias: string, locusUrl: string}
114
115
  */
115
- generateEditDisplayNameMemberOptions: (memberId: any, requestingParticipantId: any, alias: any, locusUrl: any) => {
116
+ generateEditDisplayNameMemberOptions: (memberId: any, requestingParticipantId: any, alias: any, locusUrl: any, suffix: any) => {
116
117
  memberId: any;
117
118
  requestingParticipantId: any;
118
119
  alias: any;
119
120
  locusUrl: any;
121
+ suffix: any;
120
122
  };
121
123
  getMuteMemberRequestParams: (options: any) => {
122
124
  method: string;
@@ -178,8 +180,9 @@ declare const MembersUtil: {
178
180
  method: string;
179
181
  uri: string;
180
182
  body: {
181
- aliasValue: any;
182
- requestingParticipantId: any;
183
+ aliasValue: string;
184
+ requestingParticipantId: string;
185
+ suffixValue?: string;
183
186
  };
184
187
  };
185
188
  getTransferHostToMemberRequestParams: (options: any) => {
@@ -83,5 +83,6 @@ declare const BEHAVIORAL_METRICS: {
83
83
  VERIFY_REGISTRATION_ID_SUCCESS: string;
84
84
  VERIFY_REGISTRATION_ID_ERROR: string;
85
85
  JOIN_FORBIDDEN_ERROR: string;
86
+ MEDIA_ISSUE_DETECTED: string;
86
87
  };
87
88
  export { BEHAVIORAL_METRICS as default };
@@ -458,7 +458,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
458
458
  }, _callee7);
459
459
  }))();
460
460
  },
461
- version: "3.9.0"
461
+ version: "3.10.0"
462
462
  });
463
463
  var _default = exports.default = Webinar;
464
464
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -19,7 +19,7 @@
19
19
  "directory": "packages/@webex/plugin-meetings"
20
20
  },
21
21
  "engines": {
22
- "node": ">=16"
22
+ "node": ">=18"
23
23
  },
24
24
  "browserify": {
25
25
  "transform": [
@@ -43,12 +43,12 @@
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-rooms": "3.9.0",
47
- "@webex/test-helper-chai": "3.9.0",
48
- "@webex/test-helper-mocha": "3.9.0",
49
- "@webex/test-helper-mock-webex": "3.9.0",
50
- "@webex/test-helper-retry": "3.9.0",
51
- "@webex/test-helper-test-users": "3.9.0",
46
+ "@webex/plugin-rooms": "3.10.0",
47
+ "@webex/test-helper-chai": "3.10.0",
48
+ "@webex/test-helper-mocha": "3.10.0",
49
+ "@webex/test-helper-mock-webex": "3.10.0",
50
+ "@webex/test-helper-retry": "3.10.0",
51
+ "@webex/test-helper-test-users": "3.10.0",
52
52
  "chai": "^4.3.4",
53
53
  "chai-as-promised": "^7.1.1",
54
54
  "eslint": "^8.24.0",
@@ -60,23 +60,23 @@
60
60
  "typescript": "^4.7.4"
61
61
  },
62
62
  "dependencies": {
63
- "@webex/common": "3.9.0",
64
- "@webex/event-dictionary-ts": "^1.0.1819",
65
- "@webex/internal-media-core": "2.18.5",
66
- "@webex/internal-plugin-conversation": "3.9.0",
67
- "@webex/internal-plugin-device": "3.9.0",
68
- "@webex/internal-plugin-llm": "3.9.0",
69
- "@webex/internal-plugin-mercury": "3.9.0",
70
- "@webex/internal-plugin-metrics": "3.9.0",
71
- "@webex/internal-plugin-support": "3.9.0",
72
- "@webex/internal-plugin-user": "3.9.0",
73
- "@webex/internal-plugin-voicea": "3.9.0",
74
- "@webex/media-helpers": "3.9.0",
75
- "@webex/plugin-people": "3.9.0",
76
- "@webex/plugin-rooms": "3.9.0",
63
+ "@webex/common": "3.10.0",
64
+ "@webex/event-dictionary-ts": "^1.0.1930",
65
+ "@webex/internal-media-core": "2.20.0",
66
+ "@webex/internal-plugin-conversation": "3.10.0",
67
+ "@webex/internal-plugin-device": "3.10.0",
68
+ "@webex/internal-plugin-llm": "3.10.0",
69
+ "@webex/internal-plugin-mercury": "3.10.0",
70
+ "@webex/internal-plugin-metrics": "3.10.0",
71
+ "@webex/internal-plugin-support": "3.10.0",
72
+ "@webex/internal-plugin-user": "3.10.0",
73
+ "@webex/internal-plugin-voicea": "3.10.0",
74
+ "@webex/media-helpers": "3.10.0",
75
+ "@webex/plugin-people": "3.10.0",
76
+ "@webex/plugin-rooms": "3.10.0",
77
77
  "@webex/ts-sdp": "^1.8.1",
78
78
  "@webex/web-capabilities": "^1.6.0",
79
- "@webex/webex-core": "3.9.0",
79
+ "@webex/webex-core": "3.10.0",
80
80
  "ampersand-collection": "^2.0.2",
81
81
  "bowser": "^2.11.0",
82
82
  "btoa": "^1.2.1",
@@ -92,5 +92,5 @@
92
92
  "//": [
93
93
  "TODO: upgrade jwt-decode when moving to node 18"
94
94
  ],
95
- "version": "3.9.0"
95
+ "version": "3.10.0"
96
96
  }
package/src/constants.ts CHANGED
@@ -347,6 +347,7 @@ export const EVENT_TRIGGERS = {
347
347
  MEETING_SELF_LEFT: 'meeting:self:left',
348
348
  NETWORK_QUALITY: 'network:quality',
349
349
  MEDIA_NEGOTIATED: 'media:negotiated',
350
+ MEDIA_INBOUND_AUDIO_ISSUE_DETECTED: 'media:inboundAudio:issueDetected',
350
351
  // the following events apply only to multistream media connections
351
352
  ACTIVE_SPEAKER_CHANGED: 'media:activeSpeakerChanged',
352
353
  REMOTE_VIDEO_SOURCE_COUNT_CHANGED: 'media:remoteVideoSourceCountChanged',
@@ -373,6 +374,8 @@ export const EVENT_TRIGGERS = {
373
374
  MEETING_CONTROLS_REMOTE_DESKTOP_CONTROL_UPDATED:
374
375
  'meeting:controls:remote-desktop-control:updated',
375
376
  MEETING_CONTROLS_POLLING_QA_UPDATED: 'meeting:controls:polling-qa:updated',
377
+ MEETING_CONTROLS_AUTO_END_MEETING_WARNING_UPDATED:
378
+ 'meeting:controls:auto-end-meeting-warning:updated',
376
379
  // Locus URL changed
377
380
  MEETING_LOCUS_URL_UPDATE: 'meeting:locus:locusUrl:update',
378
381
  MEETING_STREAM_PUBLISH_STATE_CHANGED: 'meeting:streamPublishStateChanged',
@@ -726,6 +729,7 @@ export const LOCUSINFO = {
726
729
  SELF_ADMITTED_GUEST: 'SELF_ADMITTED_GUEST',
727
730
  SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: 'SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED',
728
731
  SELF_REMOTE_MUTE_STATUS_UPDATED: 'SELF_REMOTE_MUTE_STATUS_UPDATED',
732
+ CONTROLS_AUTO_END_MEETING_WARNING_CHANGED: 'CONTROLS_AUTO_END_MEETING_WARNING_CHANGED',
729
733
  LOCAL_UNMUTE_REQUESTED: 'LOCAL_UNMUTE_REQUESTED',
730
734
  LOCAL_UNMUTE_REQUIRED: 'LOCAL_UNMUTE_REQUIRED',
731
735
  SELF_MODERATOR_CHANGED: 'SELF_MODERATOR_CHANGED',
@@ -960,12 +964,15 @@ export const DISPLAY_HINTS = {
960
964
  LOWER_SOMEONE_ELSES_HAND: 'LOWER_SOMEONE_ELSES_HAND',
961
965
  LEAVE_TRANSFER_HOST_END_MEETING: 'LEAVE_TRANSFER_HOST_END_MEETING',
962
966
  LEAVE_END_MEETING: 'LEAVE_END_MEETING',
967
+ STREAMING_STATUS_STARTED: 'STREAMING_STATUS_STARTED',
968
+ STREAMING_STATUS_STOPPED: 'STREAMING_STATUS_STOPPED',
963
969
  CAPTION_START: 'CAPTION_START',
964
970
  CAPTION_STATUS_ACTIVE: 'CAPTION_STATUS_ACTIVE',
965
971
  MANUAL_CAPTION_START: 'MANUAL_CAPTION_START',
966
972
  MANUAL_CAPTION_STOP: 'MANUAL_CAPTION_STOP',
967
973
  MANUAL_CAPTION_STATUS_ACTIVE: 'MANUAL_CAPTION_STATUS_ACTIVE',
968
974
  DISPLAY_REAL_TIME_TRANSLATION: 'DISPLAY_REAL_TIME_TRANSLATION',
975
+ SPOKEN_LANGUAGE_AUTO_DETECTION_ENABLED: 'SPOKEN_LANGUAGE_AUTO_DETECTION_ENABLED',
969
976
  ENABLE_CAPTION_PANEL: 'ENABLE_CAPTION_PANEL',
970
977
  DISPLAY_NON_ENGLISH_ASR: 'DISPLAY_NON_ENGLISH_ASR',
971
978
  TRANSCRIPTION_CONTROL_START: 'TRANSCRIPTION_CONTROL_START',
@@ -1050,6 +1057,9 @@ export const DISPLAY_HINTS = {
1050
1057
  ENABLE_ANNOTATION_MEETING_OPTION: 'ENABLE_ANNOTATION_MEETING_OPTION',
1051
1058
  DISABLE_ANNOTATION_MEETING_OPTION: 'DISABLE_ANNOTATION_MEETING_OPTION',
1052
1059
 
1060
+ // Auto End Meeting Warning
1061
+ SHOW_AUTO_END_MEETING_WARNING: 'SHOW_AUTO_END_MEETING_WARNING',
1062
+
1053
1063
  // Remote Desktop Control
1054
1064
  ENABLE_RDC_MEETING_OPTION: 'ENABLE_RDC_MEETING_OPTION',
1055
1065
  DISABLE_RDC_MEETING_OPTION: 'DISABLE_RDC_MEETING_OPTION',
@@ -48,6 +48,14 @@ export default class ControlsOptionsManager {
48
48
  */
49
49
  private locusUrl: string;
50
50
 
51
+ /**
52
+ * @instance
53
+ * @type {string}
54
+ * @private
55
+ * @memberof ControlsOptionsManager
56
+ */
57
+ private mainLocusUrl: string;
58
+
51
59
  /**
52
60
  * @param {MeetingRequest} request
53
61
  * @param {Object} options
@@ -87,12 +95,16 @@ export default class ControlsOptionsManager {
87
95
 
88
96
  /**
89
97
  * @param {string} url
98
+ * @param {boolean} isMainLocus
90
99
  * @returns {void}
91
100
  * @public
92
101
  * @memberof ControlsOptionsManager
93
102
  */
94
- public setLocusUrl(url: string) {
103
+ public setLocusUrl(url: string, isMainLocus?: boolean) {
95
104
  this.locusUrl = url;
105
+ if (isMainLocus) {
106
+ this.mainLocusUrl = url;
107
+ }
96
108
  }
97
109
 
98
110
  /**
@@ -160,11 +172,16 @@ export default class ControlsOptionsManager {
160
172
  });
161
173
 
162
174
  return payloads.reduce((previous, payload) => {
175
+ const extraBody =
176
+ this.mainLocusUrl && this.mainLocusUrl !== this.locusUrl
177
+ ? {authorizingLocusUrl: this.locusUrl}
178
+ : {};
179
+
163
180
  return previous.then(() =>
164
181
  // @ts-ignore
165
182
  this.request.request({
166
- uri: `${this.locusUrl}/${CONTROLS}`,
167
- body: payload,
183
+ uri: `${this.mainLocusUrl || this.locusUrl}/${CONTROLS}`,
184
+ body: {...payload, ...extraBody},
168
185
  method: HTTP_VERBS.PATCH,
169
186
  })
170
187
  );
@@ -241,11 +258,15 @@ export default class ControlsOptionsManager {
241
258
  if (error) {
242
259
  return Promise.reject(error);
243
260
  }
261
+ const extraBody =
262
+ this.mainLocusUrl && this.mainLocusUrl !== this.locusUrl
263
+ ? {authorizingLocusUrl: this.locusUrl}
264
+ : {};
244
265
 
245
266
  // @ts-ignore
246
267
  return this.request.request({
247
- uri: `${this.locusUrl}/${CONTROLS}`,
248
- body,
268
+ uri: `${this.mainLocusUrl || this.locusUrl}/${CONTROLS}`,
269
+ body: {...body, ...extraBody},
249
270
  method: HTTP_VERBS.PATCH,
250
271
  });
251
272
  }