@webex/plugin-meetings 3.3.1-next.3 → 3.3.1-next.30

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 (108) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +7 -2
  3. package/dist/breakouts/index.js.map +1 -1
  4. package/dist/constants.js +12 -2
  5. package/dist/constants.js.map +1 -1
  6. package/dist/interpretation/index.js +1 -1
  7. package/dist/interpretation/siLanguage.js +1 -1
  8. package/dist/media/MediaConnectionAwaiter.js +68 -13
  9. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  10. package/dist/mediaQualityMetrics/config.js +16 -6
  11. package/dist/mediaQualityMetrics/config.js.map +1 -1
  12. package/dist/meeting/connectionStateHandler.js +67 -0
  13. package/dist/meeting/connectionStateHandler.js.map +1 -0
  14. package/dist/meeting/index.js +242 -133
  15. package/dist/meeting/index.js.map +1 -1
  16. package/dist/meeting/locusMediaRequest.js +7 -0
  17. package/dist/meeting/locusMediaRequest.js.map +1 -1
  18. package/dist/meeting/util.js +1 -0
  19. package/dist/meeting/util.js.map +1 -1
  20. package/dist/meeting-info/index.js +4 -4
  21. package/dist/meeting-info/index.js.map +1 -1
  22. package/dist/meeting-info/meeting-info-v2.js +2 -2
  23. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  24. package/dist/meeting-info/util.js +17 -17
  25. package/dist/meeting-info/util.js.map +1 -1
  26. package/dist/meeting-info/utilv2.js +16 -16
  27. package/dist/meeting-info/utilv2.js.map +1 -1
  28. package/dist/meetings/collection.js +1 -1
  29. package/dist/meetings/collection.js.map +1 -1
  30. package/dist/meetings/index.js +37 -33
  31. package/dist/meetings/index.js.map +1 -1
  32. package/dist/meetings/meetings.types.js +8 -0
  33. package/dist/meetings/meetings.types.js.map +1 -1
  34. package/dist/meetings/util.js +3 -2
  35. package/dist/meetings/util.js.map +1 -1
  36. package/dist/metrics/constants.js +2 -1
  37. package/dist/metrics/constants.js.map +1 -1
  38. package/dist/metrics/index.js +57 -0
  39. package/dist/metrics/index.js.map +1 -1
  40. package/dist/personal-meeting-room/index.js +1 -1
  41. package/dist/personal-meeting-room/index.js.map +1 -1
  42. package/dist/reachability/clusterReachability.js +108 -53
  43. package/dist/reachability/clusterReachability.js.map +1 -1
  44. package/dist/reachability/index.js +415 -56
  45. package/dist/reachability/index.js.map +1 -1
  46. package/dist/statsAnalyzer/index.js +81 -27
  47. package/dist/statsAnalyzer/index.js.map +1 -1
  48. package/dist/statsAnalyzer/mqaUtil.js +36 -10
  49. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  50. package/dist/types/constants.d.ts +11 -0
  51. package/dist/types/media/MediaConnectionAwaiter.d.ts +24 -4
  52. package/dist/types/mediaQualityMetrics/config.d.ts +11 -0
  53. package/dist/types/meeting/connectionStateHandler.d.ts +30 -0
  54. package/dist/types/meeting/index.d.ts +13 -3
  55. package/dist/types/meeting/locusMediaRequest.d.ts +2 -0
  56. package/dist/types/meeting-info/index.d.ts +3 -2
  57. package/dist/types/meeting-info/meeting-info-v2.d.ts +3 -2
  58. package/dist/types/meeting-info/util.d.ts +5 -4
  59. package/dist/types/meeting-info/utilv2.d.ts +3 -2
  60. package/dist/types/meetings/collection.d.ts +3 -2
  61. package/dist/types/meetings/index.d.ts +4 -3
  62. package/dist/types/meetings/meetings.types.d.ts +9 -0
  63. package/dist/types/metrics/constants.d.ts +1 -0
  64. package/dist/types/metrics/index.d.ts +15 -0
  65. package/dist/types/reachability/clusterReachability.d.ts +31 -3
  66. package/dist/types/reachability/index.d.ts +93 -2
  67. package/dist/types/statsAnalyzer/index.d.ts +15 -6
  68. package/dist/types/statsAnalyzer/mqaUtil.d.ts +17 -4
  69. package/dist/webinar/index.js +1 -1
  70. package/package.json +23 -23
  71. package/src/breakouts/index.ts +7 -1
  72. package/src/constants.ts +13 -0
  73. package/src/media/MediaConnectionAwaiter.ts +86 -11
  74. package/src/mediaQualityMetrics/config.ts +14 -3
  75. package/src/meeting/connectionStateHandler.ts +65 -0
  76. package/src/meeting/index.ts +166 -63
  77. package/src/meeting/locusMediaRequest.ts +5 -0
  78. package/src/meeting/util.ts +1 -0
  79. package/src/meeting-info/index.ts +9 -6
  80. package/src/meeting-info/meeting-info-v2.ts +4 -4
  81. package/src/meeting-info/util.ts +23 -28
  82. package/src/meeting-info/utilv2.ts +18 -24
  83. package/src/meetings/collection.ts +3 -3
  84. package/src/meetings/index.ts +39 -40
  85. package/src/meetings/meetings.types.ts +11 -0
  86. package/src/meetings/util.ts +5 -4
  87. package/src/metrics/constants.ts +1 -0
  88. package/src/metrics/index.ts +44 -0
  89. package/src/personal-meeting-room/index.ts +2 -2
  90. package/src/reachability/clusterReachability.ts +86 -25
  91. package/src/reachability/index.ts +316 -27
  92. package/src/statsAnalyzer/index.ts +85 -24
  93. package/src/statsAnalyzer/mqaUtil.ts +55 -7
  94. package/test/unit/spec/breakouts/index.ts +51 -32
  95. package/test/unit/spec/media/MediaConnectionAwaiter.ts +131 -32
  96. package/test/unit/spec/meeting/connectionStateHandler.ts +102 -0
  97. package/test/unit/spec/meeting/index.js +323 -56
  98. package/test/unit/spec/meeting/locusMediaRequest.ts +7 -0
  99. package/test/unit/spec/meeting-info/index.js +4 -4
  100. package/test/unit/spec/meeting-info/meetinginfov2.js +24 -28
  101. package/test/unit/spec/meeting-info/request.js +2 -2
  102. package/test/unit/spec/meeting-info/utilv2.js +41 -49
  103. package/test/unit/spec/meetings/index.js +14 -0
  104. package/test/unit/spec/metrics/index.js +126 -0
  105. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -2
  106. package/test/unit/spec/reachability/clusterReachability.ts +116 -22
  107. package/test/unit/spec/reachability/index.ts +1153 -84
  108. package/test/unit/spec/stats-analyzer/index.js +647 -319
@@ -1,10 +1,11 @@
1
1
  /// <reference types="node" />
2
2
  import url from 'url';
3
+ import { DESTINATION_TYPE } from '../constants';
3
4
  /**
4
5
  * @class MeetingInfoUtil
5
6
  */
6
7
  export default class MeetingInfoUtil {
7
- static extractDestination(destination: any, type: any): any;
8
+ static extractDestination(destination: any, type: DESTINATION_TYPE): any;
8
9
  static getParsedUrl(link: any): false | url.UrlWithStringQuery;
9
10
  /**
10
11
  * Helper function to check if a string matches a known meeting link pattern
@@ -36,14 +37,14 @@ export default class MeetingInfoUtil {
36
37
  static generateOptions(from: any): Promise<any>;
37
38
  /**
38
39
  * Helper function to build up a correct locus url depending on the value passed
39
- * @param {String} type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]
40
+ * @param {DESTINATION_TYPE} type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]
40
41
  * @param {Object} value ?? value.value
41
42
  * @returns {Object} returns an object with {resource, method}
42
43
  */
43
- static getResourceUrl(type: string, value: any): {
44
+ static getResourceUrl(type: DESTINATION_TYPE, value: any): {
44
45
  uri: any;
45
46
  resource: string;
46
47
  method: string;
47
48
  };
48
- static getRequestParams(resourceOptions: any, type: any, value: any, api: any): any;
49
+ static getRequestParams(resourceOptions: any, type: DESTINATION_TYPE, value: any, api: any): any;
49
50
  }
@@ -1,5 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import url from 'url';
3
+ import { DESTINATION_TYPE } from '../constants';
3
4
  /**
4
5
  * @class MeetingInfoUtil
5
6
  */
@@ -36,13 +37,13 @@ export default class MeetingInfoUtil {
36
37
  /**
37
38
  * Helper function to build up a correct locus url depending on the value passed
38
39
  * @param {Object} options type and value to fetch meeting info
39
- * @param {String} options.type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]
40
+ * @param {DESTINATION_TYPE} options.type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]
40
41
  * @param {String} options.installedOrgID org ID of user's machine
41
42
  * @param {Object} options.destination ?? value.value
42
43
  * @returns {Object} returns an object with {resource, method}
43
44
  */
44
45
  static getRequestBody(options: {
45
- type: string;
46
+ type: DESTINATION_TYPE;
46
47
  destination: object;
47
48
  } | any): any;
48
49
  /**
@@ -1,4 +1,5 @@
1
1
  import Collection from '../common/collection';
2
+ import { MEETING_KEY } from './meetings.types';
2
3
  /**
3
4
  * @export
4
5
  * @class MeetingCollection
@@ -13,13 +14,13 @@ export default class MeetingCollection extends Collection {
13
14
  set(meeting: any): any;
14
15
  /**
15
16
  * get a specific meeting searching for key
16
- * @param {String} key
17
+ * @param {MEETING_KEY} key
17
18
  * @param {Any} value
18
19
  * @returns {Meeting} if found, else returns null
19
20
  * @public
20
21
  * @memberof MeetingCollection
21
22
  */
22
- getByKey(key: string, value: any): any;
23
+ getByKey(key: MEETING_KEY, value: any): any;
23
24
  /**
24
25
  * get a specific meeting searching for key
25
26
  * @param {String} breakoutUrl
@@ -4,6 +4,7 @@ import '@webex/internal-plugin-metrics';
4
4
  import { WebexPlugin } from '@webex/webex-core';
5
5
  import * as mediaHelpersModule from '@webex/media-helpers';
6
6
  import 'webrtc-adapter';
7
+ import { DESTINATION_TYPE } from '../constants';
7
8
  import { CallStateForMetrics } from '../meeting';
8
9
  import Reachability from '../reachability';
9
10
  import { INoiseReductionEffect, IVirtualBackgroundEffect } from './meetings.types';
@@ -294,7 +295,7 @@ export default class Meetings extends WebexPlugin {
294
295
  * When meeting info passed it should be complete, e.g.: fetched after password or captcha provided
295
296
  *
296
297
  * @param {string} destination - sipURL, phonenumber, or locus object}
297
- * @param {string} [type] - the optional specified type, such as locusId
298
+ * @param {DESTINATION_TYPE} [type] - the optional specified type, such as locusId
298
299
  * @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info
299
300
  * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
300
301
  * @param {string} correlationId - the optional specified correlationId (callStateForMetrics.correlationId can be provided instead)
@@ -306,14 +307,14 @@ export default class Meetings extends WebexPlugin {
306
307
  * @public
307
308
  * @memberof Meetings
308
309
  */
309
- create(destination: string, type?: string, useRandomDelayForInfo?: boolean, infoExtraParams?: {}, correlationId?: string, failOnMissingMeetingInfo?: boolean, callStateForMetrics?: CallStateForMetrics, meetingInfo?: any, meetingLookupUrl?: any): any;
310
+ create(destination: string, type?: DESTINATION_TYPE, useRandomDelayForInfo?: boolean, infoExtraParams?: {}, correlationId?: string, failOnMissingMeetingInfo?: boolean, callStateForMetrics?: CallStateForMetrics, meetingInfo?: any, meetingLookupUrl?: any): any;
310
311
  /**
311
312
  * Create meeting
312
313
  *
313
314
  * When meeting info passed it should be complete, e.g.: fetched after password or captcha provided
314
315
  *
315
316
  * @param {String} destination see create()
316
- * @param {String} type see create()
317
+ * @param {DESTINATION_TYPE} type see create()
317
318
  * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
318
319
  * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
319
320
  * @param {CallStateForMetrics} callStateForMetrics - information about call state for metrics
@@ -1,4 +1,13 @@
1
1
  import type { NoiseReductionEffectOptions, VirtualBackgroundEffectOptions } from '@webex/media-helpers';
2
+ import { Enum } from '../constants';
2
3
  type INoiseReductionEffect = Omit<NoiseReductionEffectOptions, 'authToken' | 'workletProcessorUrl' | 'legacyProcessorUrl'>;
3
4
  type IVirtualBackgroundEffect = Omit<VirtualBackgroundEffectOptions, 'authToken'>;
4
5
  export type { INoiseReductionEffect, IVirtualBackgroundEffect };
6
+ export declare const MEETING_KEY: {
7
+ readonly CONVERSATION_URL: "conversationUrl";
8
+ readonly SIP_URI: "sipUri";
9
+ readonly LOCUS_URL: "locusUrl";
10
+ readonly MEETINGNUMBER: "meetingNumber";
11
+ readonly CORRELATION_ID: "correlationId";
12
+ };
13
+ export type MEETING_KEY = Enum<typeof MEETING_KEY>;
@@ -66,5 +66,6 @@ declare const BEHAVIORAL_METRICS: {
66
66
  ROAP_OFFER_TO_ANSWER_LATENCY: string;
67
67
  ROAP_HTTP_RESPONSE_MISSING: string;
68
68
  TURN_DISCOVERY_REQUIRES_OK: string;
69
+ REACHABILITY_COMPLETED: string;
69
70
  };
70
71
  export { BEHAVIORAL_METRICS as default };
@@ -40,6 +40,21 @@ declare class Metrics {
40
40
  * @returns {void}
41
41
  */
42
42
  sendBehavioralMetric(metricName: string, metricFields?: object, metricTags?: object): void;
43
+ /**
44
+ * Flattens an object into one that has no nested properties. Each level of nesting is represented
45
+ * by "_" in the flattened object property names.
46
+ * This function is needed, because Amplitude doesn't allow passing nested objects as metricFields.
47
+ * Use this function for metricFields before calling sendBehavioralMetric() if you want to send
48
+ * nested objects in your metrics.
49
+ *
50
+ * If the function is called with a literal, it returns an object with a single property "value"
51
+ * and the literal value in it.
52
+ *
53
+ * @param {any} payload object you want to flatten
54
+ * @param {string} prefix string prefix prepended to any property names in flatten object
55
+ * @returns {Object}
56
+ */
57
+ prepareMetricFields(payload?: any, prefix?: string): {};
43
58
  }
44
59
  declare const instance: Metrics;
45
60
  export default instance;
@@ -1,4 +1,6 @@
1
1
  import { ClusterNode } from './request';
2
+ import EventsScope from '../common/events/events-scope';
3
+ import { Enum } from '../constants';
2
4
  export type TransportResult = {
3
5
  result: 'reachable' | 'unreachable' | 'untested';
4
6
  latencyInMilliseconds?: number;
@@ -9,10 +11,26 @@ export type ClusterReachabilityResult = {
9
11
  tcp: TransportResult;
10
12
  xtls: TransportResult;
11
13
  };
14
+ export type ResultEventData = {
15
+ protocol: 'udp' | 'tcp' | 'xtls';
16
+ result: 'reachable' | 'unreachable' | 'untested';
17
+ latencyInMilliseconds: number;
18
+ clientMediaIPs?: string[];
19
+ };
20
+ export type ClientMediaIpsUpdatedEventData = {
21
+ protocol: 'udp' | 'tcp' | 'xtls';
22
+ clientMediaIPs: string[];
23
+ };
24
+ export declare const Events: {
25
+ readonly resultReady: "resultReady";
26
+ readonly clientMediaIpsUpdated: "clientMediaIpsUpdated";
27
+ };
28
+ export type Events = Enum<typeof Events>;
12
29
  /**
13
30
  * A class that handles reachability checks for a single cluster.
31
+ * It emits events from Events enum
14
32
  */
15
- export declare class ClusterReachability {
33
+ export declare class ClusterReachability extends EventsScope {
16
34
  private numUdpUrls;
17
35
  private numTcpUrls;
18
36
  private numXTlsUrls;
@@ -61,6 +79,12 @@ export declare class ClusterReachability {
61
79
  * @returns {void}
62
80
  */
63
81
  private finishReachabilityCheck;
82
+ /**
83
+ * Aborts the cluster reachability checks by closing the peer connection
84
+ *
85
+ * @returns {void}
86
+ */
87
+ abort(): void;
64
88
  /**
65
89
  * Adds public IP (client media IPs)
66
90
  * @param {string} protocol
@@ -81,13 +105,17 @@ export declare class ClusterReachability {
81
105
  */
82
106
  private haveWeGotAllResults;
83
107
  /**
84
- * Stores the latency in the result for the given protocol and marks it as reachable
108
+ * Saves the latency in the result for the given protocol and marks it as reachable,
109
+ * emits the "resultReady" event if this is the first result for that protocol,
110
+ * emits the "clientMediaIpsUpdated" event if we already had a result and only found
111
+ * a new client IP
85
112
  *
86
113
  * @param {string} protocol
87
114
  * @param {number} latency
115
+ * @param {string|null} [publicIp]
88
116
  * @returns {void}
89
117
  */
90
- private storeLatencyResult;
118
+ private saveResult;
91
119
  /**
92
120
  * Registers a listener for the icecandidate event
93
121
  *
@@ -1,8 +1,10 @@
1
1
  /*!
2
2
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
3
  */
4
+ import { Defer } from '@webex/common';
4
5
  import ReachabilityRequest from './request';
5
6
  import { ClusterReachability, ClusterReachabilityResult } from './clusterReachability';
7
+ import EventsScope from '../common/events/events-scope';
6
8
  export type ReachabilityMetrics = {
7
9
  reachability_public_udp_success: number;
8
10
  reachability_public_udp_failed: number;
@@ -40,13 +42,37 @@ export type ReachabilityResults = Record<string, ClusterReachabilityResult & {
40
42
  * @class Reachability
41
43
  * @export
42
44
  */
43
- export default class Reachability {
45
+ export default class Reachability extends EventsScope {
44
46
  namespace: string;
45
47
  webex: object;
46
48
  reachabilityRequest: ReachabilityRequest;
47
49
  clusterReachability: {
48
50
  [key: string]: ClusterReachability;
49
51
  };
52
+ reachabilityDefer?: Defer;
53
+ vmnTimer?: ReturnType<typeof setTimeout>;
54
+ publicCloudTimer?: ReturnType<typeof setTimeout>;
55
+ overallTimer?: ReturnType<typeof setTimeout>;
56
+ expectedResultsCount: {
57
+ videoMesh: {
58
+ udp: number;
59
+ };
60
+ public: {
61
+ udp: number;
62
+ tcp: number;
63
+ xtls: number;
64
+ };
65
+ };
66
+ resultsCount: {
67
+ videoMesh: {
68
+ udp: number;
69
+ };
70
+ public: {
71
+ udp: number;
72
+ tcp: number;
73
+ xtls: number;
74
+ };
75
+ };
50
76
  /**
51
77
  * Creates an instance of Reachability.
52
78
  * @param {object} webex
@@ -111,10 +137,75 @@ export default class Reachability {
111
137
  * @memberof Reachability
112
138
  */
113
139
  private logUnreachableClusters;
140
+ /**
141
+ * Returns true if we've obtained all the reachability results for all the public clusters
142
+ * In other words, it means that all public clusters are reachable over each protocol,
143
+ * because we only get a "result" if we managed to reach a cluster
144
+ *
145
+ * @returns {boolean}
146
+ */
147
+ private areAllPublicClusterResultsReady;
148
+ /**
149
+ * Returns true if we've obtained all the reachability results for all the clusters
150
+ *
151
+ * @returns {boolean}
152
+ */
153
+ private areAllResultsReady;
154
+ /**
155
+ * Resolves the promise returned by gatherReachability() method
156
+ * @returns {void}
157
+ */
158
+ private resolveReachabilityPromise;
159
+ /**
160
+ * Aborts all cluster reachability checks that are in progress
161
+ *
162
+ * @returns {void}
163
+ */
164
+ private abortClusterReachability;
165
+ /**
166
+ * Helper function for calculating min/max/average values of latency
167
+ *
168
+ * @param {Array<any>} results
169
+ * @param {string} protocol
170
+ * @param {boolean} isVideoMesh
171
+ * @returns {{min:number, max: number, average: number}}
172
+ */
173
+ protected getStatistics(results: Array<ClusterReachabilityResult & {
174
+ isVideoMesh: boolean;
175
+ }>, protocol: 'udp' | 'tcp' | 'xtls', isVideoMesh: boolean): {
176
+ min: number;
177
+ max: number;
178
+ average: number;
179
+ };
180
+ /**
181
+ * Sends a metric with all the statistics about how long reachability took
182
+ *
183
+ * @returns {void}
184
+ */
185
+ protected sendMetric(): Promise<void>;
186
+ /**
187
+ * Starts all the timers used for various timeouts
188
+ *
189
+ * @returns {void}
190
+ */
191
+ private startTimers;
192
+ /**
193
+ * Stores given reachability results in local storage
194
+ *
195
+ * @param {ReachabilityResults} results
196
+ * @returns {Promise<void>}
197
+ */
198
+ private storeResults;
199
+ /**
200
+ * Resets all the internal counters that keep track of the results
201
+ *
202
+ * @returns {void}
203
+ */
204
+ private resetResultCounters;
114
205
  /**
115
206
  * Performs reachability checks for all clusters
116
207
  * @param {ClusterList} clusterList
117
- * @returns {Promise<ReachabilityResults>} reachability check results
208
+ * @returns {Promise<void>} promise that's resolved as soon as the checks are started
118
209
  */
119
210
  private performReachabilityChecks;
120
211
  }
@@ -36,17 +36,26 @@ export declare class StatsAnalyzer extends EventsScope {
36
36
  statsStarted: any;
37
37
  successfulCandidatePair: any;
38
38
  localIpAddress: string;
39
+ shareVideoEncoderImplementation?: string;
39
40
  receiveSlotCallback: ReceiveSlotCallback;
41
+ isMultistream: boolean;
40
42
  /**
41
43
  * Creates a new instance of StatsAnalyzer
42
44
  * @constructor
43
45
  * @public
44
- * @param {Object} config SDK Configuration Object
45
- * @param {Function} receiveSlotCallback Callback used to access receive slots.
46
- * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
47
- * @param {Object} statsResults Default properties for stats
48
- */
49
- constructor(config: any, receiveSlotCallback?: ReceiveSlotCallback, networkQualityMonitor?: object, statsResults?: object);
46
+ * @param {Object} config - SDK Configuration Object
47
+ * @param {Function} receiveSlotCallback - Callback used to access receive slots.
48
+ * @param {Object} networkQualityMonitor - Class for assessing network characteristics (jitter, packetLoss, latency)
49
+ * @param {Object} statsResults - Default properties for stats
50
+ * @param {boolean | undefined} isMultistream - Param indicating if the media connection is multistream or not
51
+ */
52
+ constructor({ config, receiveSlotCallback, networkQualityMonitor, statsResults, isMultistream, }: {
53
+ config: any;
54
+ receiveSlotCallback: ReceiveSlotCallback;
55
+ networkQualityMonitor: any;
56
+ statsResults?: any;
57
+ isMultistream?: boolean;
58
+ });
50
59
  /**
51
60
  * Resets cumulative stats arrays.
52
61
  *
@@ -1,8 +1,9 @@
1
- export declare const getAudioReceiverMqa: ({ audioReceiver, statsResults, lastMqaDataSent, baseMediaType, }: {
1
+ export declare const getAudioReceiverMqa: ({ audioReceiver, statsResults, lastMqaDataSent, baseMediaType, isMultistream, }: {
2
2
  audioReceiver: any;
3
3
  statsResults: any;
4
4
  lastMqaDataSent: any;
5
5
  baseMediaType: any;
6
+ isMultistream: any;
6
7
  }) => void;
7
8
  export declare const getAudioReceiverStreamMqa: ({ audioReceiverStream, statsResults, lastMqaDataSent, mediaType, }: {
8
9
  audioReceiverStream: any;
@@ -10,11 +11,12 @@ export declare const getAudioReceiverStreamMqa: ({ audioReceiverStream, statsRes
10
11
  lastMqaDataSent: any;
11
12
  mediaType: any;
12
13
  }) => void;
13
- export declare const getAudioSenderMqa: ({ audioSender, statsResults, lastMqaDataSent, baseMediaType }: {
14
+ export declare const getAudioSenderMqa: ({ audioSender, statsResults, lastMqaDataSent, baseMediaType, isMultistream, }: {
14
15
  audioSender: any;
15
16
  statsResults: any;
16
17
  lastMqaDataSent: any;
17
18
  baseMediaType: any;
19
+ isMultistream: any;
18
20
  }) => void;
19
21
  export declare const getAudioSenderStreamMqa: ({ audioSenderStream, statsResults, lastMqaDataSent, mediaType, }: {
20
22
  audioSenderStream: any;
@@ -22,11 +24,12 @@ export declare const getAudioSenderStreamMqa: ({ audioSenderStream, statsResults
22
24
  lastMqaDataSent: any;
23
25
  mediaType: any;
24
26
  }) => void;
25
- export declare const getVideoReceiverMqa: ({ videoReceiver, statsResults, lastMqaDataSent, baseMediaType, }: {
27
+ export declare const getVideoReceiverMqa: ({ videoReceiver, statsResults, lastMqaDataSent, baseMediaType, isMultistream, }: {
26
28
  videoReceiver: any;
27
29
  statsResults: any;
28
30
  lastMqaDataSent: any;
29
31
  baseMediaType: any;
32
+ isMultistream: any;
30
33
  }) => void;
31
34
  export declare const getVideoReceiverStreamMqa: ({ videoReceiverStream, statsResults, lastMqaDataSent, mediaType, }: {
32
35
  videoReceiverStream: any;
@@ -34,11 +37,12 @@ export declare const getVideoReceiverStreamMqa: ({ videoReceiverStream, statsRes
34
37
  lastMqaDataSent: any;
35
38
  mediaType: any;
36
39
  }) => void;
37
- export declare const getVideoSenderMqa: ({ videoSender, statsResults, lastMqaDataSent, baseMediaType }: {
40
+ export declare const getVideoSenderMqa: ({ videoSender, statsResults, lastMqaDataSent, baseMediaType, isMultistream, }: {
38
41
  videoSender: any;
39
42
  statsResults: any;
40
43
  lastMqaDataSent: any;
41
44
  baseMediaType: any;
45
+ isMultistream: any;
42
46
  }) => void;
43
47
  export declare const getVideoSenderStreamMqa: ({ videoSenderStream, statsResults, lastMqaDataSent, mediaType, }: {
44
48
  videoSenderStream: any;
@@ -46,3 +50,12 @@ export declare const getVideoSenderStreamMqa: ({ videoSenderStream, statsResults
46
50
  lastMqaDataSent: any;
47
51
  mediaType: any;
48
52
  }) => void;
53
+ /**
54
+ * Checks if stream stats should be updated based on request status and elapsed time.
55
+ *
56
+ * @param {Object} statsResults - Stats results object.
57
+ * @param {string} mediaType - Media type (e.g., 'audio', 'video').
58
+ * @param {string} direction - Stats direction (e.g., 'send', 'receive').
59
+ * @returns {boolean} Whether stats should be updated.
60
+ */
61
+ export declare const isStreamRequested: (statsResults: any, mediaType: string, direction: string) => boolean;
@@ -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.3.1-next.3"
65
+ version: "3.3.1-next.30"
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.3.1-next.3",
47
- "@webex/plugin-rooms": "3.3.1-next.2",
48
- "@webex/test-helper-chai": "3.3.1-next.1",
49
- "@webex/test-helper-mocha": "3.3.1-next.1",
50
- "@webex/test-helper-mock-webex": "3.3.1-next.1",
51
- "@webex/test-helper-retry": "3.3.1-next.1",
52
- "@webex/test-helper-test-users": "3.3.1-next.1",
46
+ "@webex/plugin-meetings": "3.3.1-next.30",
47
+ "@webex/plugin-rooms": "3.3.1-next.7",
48
+ "@webex/test-helper-chai": "3.3.1-next.6",
49
+ "@webex/test-helper-mocha": "3.3.1-next.6",
50
+ "@webex/test-helper-mock-webex": "3.3.1-next.6",
51
+ "@webex/test-helper-retry": "3.3.1-next.6",
52
+ "@webex/test-helper-test-users": "3.3.1-next.6",
53
53
  "chai": "^4.3.4",
54
54
  "chai-as-promised": "^7.1.1",
55
55
  "eslint": "^8.24.0",
@@ -61,20 +61,21 @@
61
61
  "typescript": "^4.7.4"
62
62
  },
63
63
  "dependencies": {
64
- "@webex/common": "3.3.1-next.1",
65
- "@webex/internal-media-core": "2.5.2",
66
- "@webex/internal-plugin-conversation": "3.3.1-next.2",
67
- "@webex/internal-plugin-device": "3.3.1-next.1",
68
- "@webex/internal-plugin-llm": "3.3.1-next.2",
69
- "@webex/internal-plugin-mercury": "3.3.1-next.2",
70
- "@webex/internal-plugin-metrics": "3.3.1-next.1",
71
- "@webex/internal-plugin-support": "3.3.1-next.2",
72
- "@webex/internal-plugin-user": "3.3.1-next.1",
73
- "@webex/internal-plugin-voicea": "3.3.1-next.3",
74
- "@webex/media-helpers": "3.3.1-next.2",
75
- "@webex/plugin-people": "3.3.1-next.2",
76
- "@webex/plugin-rooms": "3.3.1-next.2",
77
- "@webex/webex-core": "3.3.1-next.1",
64
+ "@webex/common": "3.3.1-next.6",
65
+ "@webex/internal-media-core": "2.7.3",
66
+ "@webex/internal-plugin-conversation": "3.3.1-next.7",
67
+ "@webex/internal-plugin-device": "3.3.1-next.6",
68
+ "@webex/internal-plugin-llm": "3.3.1-next.8",
69
+ "@webex/internal-plugin-mercury": "3.3.1-next.7",
70
+ "@webex/internal-plugin-metrics": "3.3.1-next.6",
71
+ "@webex/internal-plugin-support": "3.3.1-next.7",
72
+ "@webex/internal-plugin-user": "3.3.1-next.6",
73
+ "@webex/internal-plugin-voicea": "3.3.1-next.30",
74
+ "@webex/media-helpers": "3.3.1-next.11",
75
+ "@webex/plugin-people": "3.3.1-next.7",
76
+ "@webex/plugin-rooms": "3.3.1-next.7",
77
+ "@webex/web-capabilities": "^1.4.0",
78
+ "@webex/webex-core": "3.3.1-next.6",
78
79
  "ampersand-collection": "^2.0.2",
79
80
  "bowser": "^2.11.0",
80
81
  "btoa": "^1.2.1",
@@ -84,12 +85,11 @@
84
85
  "javascript-state-machine": "^3.1.0",
85
86
  "jwt-decode": "3.1.2",
86
87
  "lodash": "^4.17.21",
87
- "sdp-transform": "^2.12.0",
88
88
  "uuid": "^3.3.2",
89
89
  "webrtc-adapter": "^8.1.2"
90
90
  },
91
91
  "//": [
92
92
  "TODO: upgrade jwt-decode when moving to node 18"
93
93
  ],
94
- "version": "3.3.1-next.3"
94
+ "version": "3.3.1-next.30"
95
95
  }
@@ -148,7 +148,6 @@ const Breakouts = WebexPlugin.extend({
148
148
  this.triggerReturnToMainEvent(breakout);
149
149
  });
150
150
  this.listenToCurrentSessionTypeChange();
151
- this.listenToBroadcastMessages();
152
151
  this.listenToBreakoutRosters();
153
152
  this.listenToBreakoutHelp();
154
153
  // @ts-ignore
@@ -161,6 +160,7 @@ const Breakouts = WebexPlugin.extend({
161
160
  */
162
161
  cleanUp() {
163
162
  this.stopListening();
163
+ this.hasSubscribedToMessage = undefined;
164
164
  },
165
165
 
166
166
  /**
@@ -170,6 +170,7 @@ const Breakouts = WebexPlugin.extend({
170
170
  */
171
171
  locusUrlUpdate(locusUrl) {
172
172
  this.set('locusUrl', locusUrl);
173
+ this.listenToBroadcastMessages();
173
174
  const {isInMainSession, mainLocusUrl} = this;
174
175
  if (isInMainSession || !mainLocusUrl) {
175
176
  this.set('mainLocusUrl', locusUrl);
@@ -255,6 +256,10 @@ const Breakouts = WebexPlugin.extend({
255
256
  * @returns {void}
256
257
  */
257
258
  listenToBroadcastMessages() {
259
+ if (!this.webex.internal.llm.isConnected() || this.hasSubscribedToMessage) {
260
+ return;
261
+ }
262
+
258
263
  this.listenTo(this.webex.internal.llm, 'event:breakout.message', (event) => {
259
264
  const {
260
265
  data: {senderUserId, sentTime, message},
@@ -270,6 +275,7 @@ const Breakouts = WebexPlugin.extend({
270
275
  sessionId: this.currentBreakoutSession.sessionId,
271
276
  });
272
277
  });
278
+ this.hasSubscribedToMessage = true;
273
279
  },
274
280
 
275
281
  /**
package/src/constants.ts CHANGED
@@ -1331,3 +1331,16 @@ export const MEETING_PERMISSION_TOKEN_REFRESH_REASON = 'ttl-join';
1331
1331
 
1332
1332
  // constant for named media group type
1333
1333
  export const NAMED_MEDIA_GROUP_TYPE_AUDIO = 1;
1334
+
1335
+ export const DESTINATION_TYPE = {
1336
+ CONVERSATION_URL: 'CONVERSATION_URL',
1337
+ MEETING_LINK: 'MEETING_LINK',
1338
+ SIP_URI: 'SIP_URI',
1339
+ PERSONAL_ROOM: 'PERSONAL_ROOM',
1340
+ ONE_ON_ONE_CALL: 'ONE_ON_ONE_CALL',
1341
+ LOCUS_ID: 'LOCUS_ID',
1342
+ MEETING_ID: 'MEETING_ID',
1343
+ MEETING_UUID: 'MEETING_UUID',
1344
+ } as const;
1345
+
1346
+ export type DESTINATION_TYPE = Enum<typeof DESTINATION_TYPE>;