@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.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +7 -2
- package/dist/breakouts/index.js.map +1 -1
- package/dist/constants.js +12 -2
- package/dist/constants.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/media/MediaConnectionAwaiter.js +68 -13
- package/dist/media/MediaConnectionAwaiter.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +16 -6
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/connectionStateHandler.js +67 -0
- package/dist/meeting/connectionStateHandler.js.map +1 -0
- package/dist/meeting/index.js +242 -133
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +7 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/util.js +1 -0
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +4 -4
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +2 -2
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +17 -17
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +16 -16
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +1 -1
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +37 -33
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +8 -0
- package/dist/meetings/meetings.types.js.map +1 -1
- package/dist/meetings/util.js +3 -2
- package/dist/meetings/util.js.map +1 -1
- package/dist/metrics/constants.js +2 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +57 -0
- package/dist/metrics/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +1 -1
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/reachability/clusterReachability.js +108 -53
- package/dist/reachability/clusterReachability.js.map +1 -1
- package/dist/reachability/index.js +415 -56
- package/dist/reachability/index.js.map +1 -1
- package/dist/statsAnalyzer/index.js +81 -27
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +36 -10
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/constants.d.ts +11 -0
- package/dist/types/media/MediaConnectionAwaiter.d.ts +24 -4
- package/dist/types/mediaQualityMetrics/config.d.ts +11 -0
- package/dist/types/meeting/connectionStateHandler.d.ts +30 -0
- package/dist/types/meeting/index.d.ts +13 -3
- package/dist/types/meeting/locusMediaRequest.d.ts +2 -0
- package/dist/types/meeting-info/index.d.ts +3 -2
- package/dist/types/meeting-info/meeting-info-v2.d.ts +3 -2
- package/dist/types/meeting-info/util.d.ts +5 -4
- package/dist/types/meeting-info/utilv2.d.ts +3 -2
- package/dist/types/meetings/collection.d.ts +3 -2
- package/dist/types/meetings/index.d.ts +4 -3
- package/dist/types/meetings/meetings.types.d.ts +9 -0
- package/dist/types/metrics/constants.d.ts +1 -0
- package/dist/types/metrics/index.d.ts +15 -0
- package/dist/types/reachability/clusterReachability.d.ts +31 -3
- package/dist/types/reachability/index.d.ts +93 -2
- package/dist/types/statsAnalyzer/index.d.ts +15 -6
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +17 -4
- package/dist/webinar/index.js +1 -1
- package/package.json +23 -23
- package/src/breakouts/index.ts +7 -1
- package/src/constants.ts +13 -0
- package/src/media/MediaConnectionAwaiter.ts +86 -11
- package/src/mediaQualityMetrics/config.ts +14 -3
- package/src/meeting/connectionStateHandler.ts +65 -0
- package/src/meeting/index.ts +166 -63
- package/src/meeting/locusMediaRequest.ts +5 -0
- package/src/meeting/util.ts +1 -0
- package/src/meeting-info/index.ts +9 -6
- package/src/meeting-info/meeting-info-v2.ts +4 -4
- package/src/meeting-info/util.ts +23 -28
- package/src/meeting-info/utilv2.ts +18 -24
- package/src/meetings/collection.ts +3 -3
- package/src/meetings/index.ts +39 -40
- package/src/meetings/meetings.types.ts +11 -0
- package/src/meetings/util.ts +5 -4
- package/src/metrics/constants.ts +1 -0
- package/src/metrics/index.ts +44 -0
- package/src/personal-meeting-room/index.ts +2 -2
- package/src/reachability/clusterReachability.ts +86 -25
- package/src/reachability/index.ts +316 -27
- package/src/statsAnalyzer/index.ts +85 -24
- package/src/statsAnalyzer/mqaUtil.ts +55 -7
- package/test/unit/spec/breakouts/index.ts +51 -32
- package/test/unit/spec/media/MediaConnectionAwaiter.ts +131 -32
- package/test/unit/spec/meeting/connectionStateHandler.ts +102 -0
- package/test/unit/spec/meeting/index.js +323 -56
- package/test/unit/spec/meeting/locusMediaRequest.ts +7 -0
- package/test/unit/spec/meeting-info/index.js +4 -4
- package/test/unit/spec/meeting-info/meetinginfov2.js +24 -28
- package/test/unit/spec/meeting-info/request.js +2 -2
- package/test/unit/spec/meeting-info/utilv2.js +41 -49
- package/test/unit/spec/meetings/index.js +14 -0
- package/test/unit/spec/metrics/index.js +126 -0
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -2
- package/test/unit/spec/reachability/clusterReachability.ts +116 -22
- package/test/unit/spec/reachability/index.ts +1153 -84
- 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:
|
|
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 {
|
|
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:
|
|
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:
|
|
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 {
|
|
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:
|
|
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 {
|
|
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:
|
|
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 {
|
|
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?:
|
|
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 {
|
|
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>;
|
|
@@ -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
|
-
*
|
|
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
|
|
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<
|
|
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
|
|
47
|
-
* @param {Object} statsResults Default properties for stats
|
|
48
|
-
|
|
49
|
-
|
|
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;
|
package/dist/webinar/index.js
CHANGED
|
@@ -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.
|
|
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.
|
|
47
|
-
"@webex/plugin-rooms": "3.3.1-next.
|
|
48
|
-
"@webex/test-helper-chai": "3.3.1-next.
|
|
49
|
-
"@webex/test-helper-mocha": "3.3.1-next.
|
|
50
|
-
"@webex/test-helper-mock-webex": "3.3.1-next.
|
|
51
|
-
"@webex/test-helper-retry": "3.3.1-next.
|
|
52
|
-
"@webex/test-helper-test-users": "3.3.1-next.
|
|
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.
|
|
65
|
-
"@webex/internal-media-core": "2.
|
|
66
|
-
"@webex/internal-plugin-conversation": "3.3.1-next.
|
|
67
|
-
"@webex/internal-plugin-device": "3.3.1-next.
|
|
68
|
-
"@webex/internal-plugin-llm": "3.3.1-next.
|
|
69
|
-
"@webex/internal-plugin-mercury": "3.3.1-next.
|
|
70
|
-
"@webex/internal-plugin-metrics": "3.3.1-next.
|
|
71
|
-
"@webex/internal-plugin-support": "3.3.1-next.
|
|
72
|
-
"@webex/internal-plugin-user": "3.3.1-next.
|
|
73
|
-
"@webex/internal-plugin-voicea": "3.3.1-next.
|
|
74
|
-
"@webex/media-helpers": "3.3.1-next.
|
|
75
|
-
"@webex/plugin-people": "3.3.1-next.
|
|
76
|
-
"@webex/plugin-rooms": "3.3.1-next.
|
|
77
|
-
"@webex/
|
|
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.
|
|
94
|
+
"version": "3.3.1-next.30"
|
|
95
95
|
}
|
package/src/breakouts/index.ts
CHANGED
|
@@ -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>;
|