@webex/plugin-meetings 3.8.0-next.8 → 3.8.0-web-workers-keepalive.1
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 +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +1 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/meeting/index.js +51 -5
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/util.js +4 -1
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +359 -60
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meetings/index.js +60 -1
- package/dist/meetings/index.js.map +1 -1
- package/dist/member/index.js +10 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +3 -0
- package/dist/member/util.js.map +1 -1
- package/dist/metrics/constants.js +9 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/reachability/clusterReachability.js +52 -8
- package/dist/reachability/clusterReachability.js.map +1 -1
- package/dist/reachability/index.js +70 -45
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/reachability.types.js +14 -0
- package/dist/reachability/reachability.types.js.map +1 -1
- package/dist/reachability/request.js +19 -3
- package/dist/reachability/request.js.map +1 -1
- package/dist/types/config.d.ts +1 -0
- package/dist/types/meeting/index.d.ts +8 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +80 -0
- package/dist/types/meetings/index.d.ts +29 -0
- package/dist/types/member/index.d.ts +1 -0
- package/dist/types/metrics/constants.d.ts +9 -0
- package/dist/types/reachability/clusterReachability.d.ts +13 -1
- package/dist/types/reachability/index.d.ts +2 -1
- package/dist/types/reachability/reachability.types.d.ts +5 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +22 -22
- package/src/config.ts +1 -0
- package/src/locus-info/controlsUtils.ts +2 -2
- package/src/meeting/index.ts +51 -7
- package/src/meeting/util.ts +2 -1
- package/src/meeting-info/meeting-info-v2.ts +247 -6
- package/src/meetings/index.ts +72 -1
- package/src/member/index.ts +11 -0
- package/src/member/util.ts +3 -0
- package/src/metrics/constants.ts +9 -0
- package/src/reachability/clusterReachability.ts +47 -1
- package/src/reachability/index.ts +15 -0
- package/src/reachability/reachability.types.ts +6 -0
- package/src/reachability/request.ts +7 -0
- package/test/unit/spec/locus-info/controlsUtils.js +8 -0
- package/test/unit/spec/meeting/index.js +62 -4
- package/test/unit/spec/meeting/utils.js +55 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +443 -114
- package/test/unit/spec/meetings/index.js +78 -1
- package/test/unit/spec/member/index.js +7 -0
- package/test/unit/spec/member/util.js +24 -0
- package/test/unit/spec/reachability/clusterReachability.ts +47 -1
- package/test/unit/spec/reachability/index.ts +12 -0
- package/test/unit/spec/reachability/request.js +47 -2
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":[],"sources":["reachability.types.ts"],"sourcesContent":["import {IP_VERSION} from '../constants';\n\n// result for a specific transport protocol (like udp or tcp)\nexport type TransportResult = {\n result: 'reachable' | 'unreachable' | 'untested';\n latencyInMilliseconds?: number; // amount of time it took to get the first ICE candidate\n clientMediaIPs?: string[];\n};\n\n// reachability result for a specific media cluster\nexport type ClusterReachabilityResult = {\n udp: TransportResult;\n tcp: TransportResult;\n xtls: TransportResult;\n};\n\nexport type ReachabilityMetrics = {\n reachability_public_udp_success: number;\n reachability_public_udp_failed: number;\n reachability_public_tcp_success: number;\n reachability_public_tcp_failed: number;\n reachability_public_xtls_success: number;\n reachability_public_xtls_failed: number;\n reachability_vmn_udp_success: number;\n reachability_vmn_udp_failed: number;\n reachability_vmn_tcp_success: number;\n reachability_vmn_tcp_failed: number;\n reachability_vmn_xtls_success: number;\n reachability_vmn_xtls_failed: number;\n};\n\n/**\n * This is the type that matches what backend expects us to send to them. It is a bit weird, because\n * it uses strings instead of booleans and numbers, but that's what they require.\n */\nexport type TransportResultForBackend = {\n reachable?: 'true' | 'false';\n latencyInMilliseconds?: string;\n clientMediaIPs?: string[];\n untested?: 'true';\n};\n\nexport type ReachabilityResultForBackend = {\n udp: TransportResultForBackend;\n tcp: TransportResultForBackend;\n xtls: TransportResultForBackend;\n};\n\n// this is the type that is required by the backend when we send them reachability results\nexport type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;\n\n// this is the type used by Reachability class internally and stored in local storage\nexport type ReachabilityResults = Record<\n string,\n ClusterReachabilityResult & {\n isVideoMesh?: boolean;\n }\n>;\n\nexport type ReachabilityReportV0 = ReachabilityResultsForBackend;\n\nexport type ReachabilityReportV1 = {\n version: 1;\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': number;\n // there are more options, but we don't support them yet\n };\n metrics: {\n 'total-duration-ms': number;\n // there are more metrics, but we don't support them yet\n };\n tests: Record<string, ReachabilityResultForBackend>;\n };\n};\n\nexport interface ClientMediaPreferences {\n ipver: IP_VERSION;\n joinCookie: any;\n preferTranscoding: boolean;\n reachability?: ReachabilityReportV1; // only present when using Orpheus API version 1\n}\n\n/* Orpheus API supports more triggers, but we don't use them yet */\nexport type GetClustersTrigger = 'startup' | 'early-call/no-min-reached';\n"],"mappings":""}
|
1
|
+
{"version":3,"names":["NatType","exports"],"sources":["reachability.types.ts"],"sourcesContent":["import {IP_VERSION} from '../constants';\n\n// result for a specific transport protocol (like udp or tcp)\nexport type TransportResult = {\n result: 'reachable' | 'unreachable' | 'untested';\n latencyInMilliseconds?: number; // amount of time it took to get the first ICE candidate\n clientMediaIPs?: string[];\n};\n\nexport enum NatType {\n Unknown = 'unknown',\n SymmetricNat = 'symmetric-nat',\n}\n\n// reachability result for a specific media cluster\nexport type ClusterReachabilityResult = {\n udp: TransportResult;\n tcp: TransportResult;\n xtls: TransportResult;\n};\n\nexport type ReachabilityMetrics = {\n reachability_public_udp_success: number;\n reachability_public_udp_failed: number;\n reachability_public_tcp_success: number;\n reachability_public_tcp_failed: number;\n reachability_public_xtls_success: number;\n reachability_public_xtls_failed: number;\n reachability_vmn_udp_success: number;\n reachability_vmn_udp_failed: number;\n reachability_vmn_tcp_success: number;\n reachability_vmn_tcp_failed: number;\n reachability_vmn_xtls_success: number;\n reachability_vmn_xtls_failed: number;\n natType: NatType;\n};\n\n/**\n * This is the type that matches what backend expects us to send to them. It is a bit weird, because\n * it uses strings instead of booleans and numbers, but that's what they require.\n */\nexport type TransportResultForBackend = {\n reachable?: 'true' | 'false';\n latencyInMilliseconds?: string;\n clientMediaIPs?: string[];\n untested?: 'true';\n};\n\nexport type ReachabilityResultForBackend = {\n udp: TransportResultForBackend;\n tcp: TransportResultForBackend;\n xtls: TransportResultForBackend;\n};\n\n// this is the type that is required by the backend when we send them reachability results\nexport type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;\n\n// this is the type used by Reachability class internally and stored in local storage\nexport type ReachabilityResults = Record<\n string,\n ClusterReachabilityResult & {\n isVideoMesh?: boolean;\n }\n>;\n\nexport type ReachabilityReportV0 = ReachabilityResultsForBackend;\n\nexport type ReachabilityReportV1 = {\n version: 1;\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': number;\n // there are more options, but we don't support them yet\n };\n metrics: {\n 'total-duration-ms': number;\n // there are more metrics, but we don't support them yet\n };\n tests: Record<string, ReachabilityResultForBackend>;\n };\n};\n\nexport interface ClientMediaPreferences {\n ipver: IP_VERSION;\n joinCookie: any;\n preferTranscoding: boolean;\n reachability?: ReachabilityReportV1; // only present when using Orpheus API version 1\n}\n\n/* Orpheus API supports more triggers, but we don't use them yet */\nexport type GetClustersTrigger = 'startup' | 'early-call/no-min-reached';\n"],"mappings":";;;;;;;AAEA;AAAA,IAOYA,OAAO,GAAAC,OAAA,CAAAD,OAAA,0BAAPA,OAAO;EAAPA,OAAO;EAAPA,OAAO;EAAA,OAAPA,OAAO;AAAA,OAKnB;AAuBA;AACA;AACA;AACA;AAcA;AAGA;AAgCA"}
|
@@ -1,5 +1,10 @@
|
|
1
1
|
"use strict";
|
2
2
|
|
3
|
+
var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
|
4
|
+
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
|
5
|
+
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
|
6
|
+
var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
|
7
|
+
var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
|
3
8
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
4
9
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
5
10
|
_Object$defineProperty(exports, "__esModule", {
|
@@ -13,6 +18,8 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/he
|
|
13
18
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
14
19
|
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
15
20
|
var _constants = require("../constants");
|
21
|
+
function ownKeys(e, r) { var t = _Object$keys2(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
22
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
|
16
23
|
/**
|
17
24
|
* @class ReachabilityRequest
|
18
25
|
*/
|
@@ -35,6 +42,10 @@ function ReachabilityRequest(webex) {
|
|
35
42
|
* @returns {Promise}
|
36
43
|
*/
|
37
44
|
(0, _defineProperty2.default)(this, "getClusters", function (trigger, ipVersion, previousReport) {
|
45
|
+
var _this$webex, _this$webex$config, _this$webex$config$su, _this$webex2, _this$webex2$config, _this$webex2$config$s;
|
46
|
+
var appType = (_this$webex = _this.webex) === null || _this$webex === void 0 ? void 0 : (_this$webex$config = _this$webex.config) === null || _this$webex$config === void 0 ? void 0 : (_this$webex$config$su = _this$webex$config.support) === null || _this$webex$config$su === void 0 ? void 0 : _this$webex$config$su.appType;
|
47
|
+
var appVersion = (_this$webex2 = _this.webex) === null || _this$webex2 === void 0 ? void 0 : (_this$webex2$config = _this$webex2.config) === null || _this$webex2$config === void 0 ? void 0 : (_this$webex2$config$s = _this$webex2$config.support) === null || _this$webex2$config$s === void 0 ? void 0 : _this$webex2$config$s.appVersion;
|
48
|
+
|
38
49
|
// we only measure latency for the initial startup call, not for other triggers
|
39
50
|
var callWrapper = trigger === 'startup' ? _this.webex.internal.newMetrics.callDiagnosticLatencies.measureLatency.bind(_this.webex.internal.newMetrics.callDiagnosticLatencies) : function (func) {
|
40
51
|
return func();
|
@@ -45,15 +56,20 @@ function ReachabilityRequest(webex) {
|
|
45
56
|
shouldRefreshAccessToken: false,
|
46
57
|
api: _constants.API.CALLIOPEDISCOVERY,
|
47
58
|
resource: _constants.RESOURCE.CLUSTERS,
|
48
|
-
body: {
|
59
|
+
body: _objectSpread(_objectSpread({
|
49
60
|
ipver: ipVersion,
|
50
61
|
'supported-options': {
|
51
62
|
'report-version': 1,
|
52
63
|
'early-call-min-clusters': true
|
53
64
|
},
|
54
|
-
'previous-report': previousReport
|
65
|
+
'previous-report': previousReport
|
66
|
+
}, appType && appVersion && {
|
67
|
+
'client-environment': {
|
68
|
+
components: (0, _defineProperty2.default)({}, appType, appVersion)
|
69
|
+
}
|
70
|
+
}), {}, {
|
55
71
|
trigger: trigger
|
56
|
-
},
|
72
|
+
}),
|
57
73
|
timeout: _this.webex.config.meetings.reachabilityGetClusterTimeout
|
58
74
|
});
|
59
75
|
}, 'internal.get.cluster.time').then(function (res) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_constants","
|
1
|
+
{"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_constants","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","ReachabilityRequest","_createClass2","webex","_this","_classCallCheck2","trigger","ipVersion","previousReport","_this$webex","_this$webex$config","_this$webex$config$su","_this$webex2","_this$webex2$config","_this$webex2$config$s","appType","config","support","appVersion","callWrapper","internal","newMetrics","callDiagnosticLatencies","measureLatency","bind","func","request","method","HTTP_VERBS","POST","shouldRefreshAccessToken","api","API","CALLIOPEDISCOVERY","resource","RESOURCE","CLUSTERS","body","ipver","components","timeout","meetings","reachabilityGetClusterTimeout","then","res","_res$body","clusters","joinCookie","discoveryOptions","_keys","key","_res$body$clusterClas","_res$body$clusterClas2","isVideoMesh","clusterClasses","hybridMedia","includes","LoggerProxy","logger","log","concat","_stringify","localSDPList","REACHABILITY","offers","_default","exports"],"sources":["request.ts"],"sourcesContent":["import LoggerProxy from '../common/logs/logger-proxy';\nimport {HTTP_VERBS, RESOURCE, API, IP_VERSION} from '../constants';\nimport {GetClustersTrigger} from './reachability.types';\n\nexport interface ClusterNode {\n isVideoMesh: boolean;\n udp: Array<string>;\n tcp: Array<string>;\n xtls: Array<string>;\n}\n\nexport type ClusterList = {\n [key: string]: ClusterNode;\n};\n\n/**\n * @class ReachabilityRequest\n */\nclass ReachabilityRequest {\n webex: any;\n\n /**\n * Creates an instance of ReachabilityRequest.\n * @param {object} webex\n * @memberof ReachabilityRequest\n */\n constructor(webex: object) {\n this.webex = webex;\n }\n\n /**\n * Gets the cluster information\n *\n * @param {string} trigger that's passed to Orpheus\n * @param {IP_VERSION} ipVersion information about current ip network we're on\n * @param {Object} previousReport last reachability result\n * @returns {Promise}\n */\n getClusters = (\n trigger: GetClustersTrigger,\n ipVersion?: IP_VERSION,\n previousReport?: any\n ): Promise<{\n clusters: ClusterList;\n joinCookie: any;\n discoveryOptions?: Record<string, any>;\n }> => {\n const appType = this.webex?.config?.support?.appType;\n const appVersion = this.webex?.config?.support?.appVersion;\n\n // we only measure latency for the initial startup call, not for other triggers\n const callWrapper =\n trigger === 'startup'\n ? this.webex.internal.newMetrics.callDiagnosticLatencies.measureLatency.bind(\n this.webex.internal.newMetrics.callDiagnosticLatencies\n )\n : (func) => func();\n\n return callWrapper(\n () =>\n this.webex.request({\n method: HTTP_VERBS.POST,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.CLUSTERS,\n body: {\n ipver: ipVersion,\n 'supported-options': {\n 'report-version': 1,\n 'early-call-min-clusters': true,\n },\n 'previous-report': previousReport,\n ...(appType &&\n appVersion && {\n 'client-environment': {components: {[appType]: appVersion}},\n }),\n trigger,\n },\n timeout: this.webex.config.meetings.reachabilityGetClusterTimeout,\n }),\n 'internal.get.cluster.time'\n ).then((res) => {\n const {clusters, joinCookie, discoveryOptions} = res.body;\n\n Object.keys(clusters).forEach((key) => {\n clusters[key].isVideoMesh = !!res.body.clusterClasses?.hybridMedia?.includes(key);\n });\n\n LoggerProxy.logger.log(\n `Reachability:request#getClusters --> get clusters (ipver=${ipVersion}) successful:${JSON.stringify(\n clusters\n )}`\n );\n\n return {\n clusters,\n joinCookie,\n discoveryOptions,\n };\n });\n };\n\n /**\n * gets remote SDP For Clusters\n * @param {Object} localSDPList localSDPs for the cluster\n * @returns {Object}\n */\n remoteSDPForClusters = (localSDPList: object) =>\n this.webex\n .request({\n method: HTTP_VERBS.POST,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.REACHABILITY,\n body: {offers: localSDPList},\n })\n .then((res) => {\n LoggerProxy.logger.log(\n 'Reachability:request#remoteSDPForClusters --> Remote SDPs got succcessfully'\n );\n\n return res.body;\n });\n}\n\nexport default ReachabilityRequest;\n"],"mappings":"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"}
|
package/dist/types/config.d.ts
CHANGED
@@ -533,6 +533,14 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
533
533
|
* @returns {string | undefined}
|
534
534
|
*/
|
535
535
|
get isoLocalClientMeetingJoinTime(): string | undefined;
|
536
|
+
/**
|
537
|
+
* Setter - sets isoLocalClientMeetingJoinTime
|
538
|
+
* This will be set once on meeting join, and not updated again
|
539
|
+
* this will always produce an ISO string
|
540
|
+
* If the iso string is invalid, it will fallback to the current system time
|
541
|
+
* @param {string | undefined} time
|
542
|
+
*/
|
543
|
+
set isoLocalClientMeetingJoinTime(time: string | undefined);
|
536
544
|
/**
|
537
545
|
* Set meeting info and trigger `MEETING_INFO_AVAILABLE` event
|
538
546
|
* @param {any} info
|
@@ -99,6 +99,52 @@ export declare class MeetingInfoV2JoinForbiddenError extends Error {
|
|
99
99
|
*/
|
100
100
|
constructor(wbxAppApiErrorCode?: number, meetingInfo?: object, message?: string);
|
101
101
|
}
|
102
|
+
/**
|
103
|
+
* Error fetching static link for a conversation when it does not exist
|
104
|
+
*/
|
105
|
+
export declare class MeetingInfoV2StaticLinkDoesNotExistError extends Error {
|
106
|
+
sdkMessage: any;
|
107
|
+
wbxAppApiCode: any;
|
108
|
+
body: any;
|
109
|
+
/**
|
110
|
+
*
|
111
|
+
* @constructor
|
112
|
+
* @param {Number} [wbxAppApiErrorCode]
|
113
|
+
* @param {String} [message]
|
114
|
+
*/
|
115
|
+
constructor(wbxAppApiErrorCode?: number, message?: string);
|
116
|
+
}
|
117
|
+
/**
|
118
|
+
* Error enabling/disabling static meeting link
|
119
|
+
*/
|
120
|
+
export declare class MeetingInfoV2MeetingIsInProgressError extends Error {
|
121
|
+
sdkMessage: any;
|
122
|
+
wbxAppApiCode: any;
|
123
|
+
body: any;
|
124
|
+
/**
|
125
|
+
*
|
126
|
+
* @constructor
|
127
|
+
* @param {Number} [wbxAppApiErrorCode]
|
128
|
+
* @param {String} [message]
|
129
|
+
* @param {Boolean} [enable]
|
130
|
+
*/
|
131
|
+
constructor(wbxAppApiErrorCode?: number, message?: string, enable?: boolean);
|
132
|
+
}
|
133
|
+
/**
|
134
|
+
* Error enabling/disabling static meeting link
|
135
|
+
*/
|
136
|
+
export declare class MeetingInfoV2StaticMeetingLinkAlreadyExists extends Error {
|
137
|
+
sdkMessage: any;
|
138
|
+
wbxAppApiCode: any;
|
139
|
+
body: any;
|
140
|
+
/**
|
141
|
+
*
|
142
|
+
* @constructor
|
143
|
+
* @param {Number} [wbxAppApiErrorCode]
|
144
|
+
* @param {String} [message]
|
145
|
+
*/
|
146
|
+
constructor(wbxAppApiErrorCode?: number, message?: string);
|
147
|
+
}
|
102
148
|
/**
|
103
149
|
* @class MeetingInfo
|
104
150
|
*/
|
@@ -136,6 +182,16 @@ export default class MeetingInfoV2 {
|
|
136
182
|
* @returns {void}
|
137
183
|
*/
|
138
184
|
handleForbiddenError: (err: any) => void;
|
185
|
+
/**
|
186
|
+
* helper function to either create an adhoc space meeting or enable static meeting link
|
187
|
+
* @param {String} conversationUrl conversationUrl to start adhoc meeting on
|
188
|
+
* @param {String} installedOrgID org ID of user's machine
|
189
|
+
* @param {Boolean} enableStaticMeetingLink whether or not to enable static meeting link
|
190
|
+
* @returns {Promise} returns a meeting info object
|
191
|
+
* @public
|
192
|
+
* @memberof MeetingInfo
|
193
|
+
*/
|
194
|
+
createAdhocSpaceMeetingOrEnableStaticMeetingLink(conversationUrl: string, installedOrgID?: string, enableStaticMeetingLink?: boolean): Promise<any>;
|
139
195
|
/**
|
140
196
|
* Creates adhoc space meetings for a space by fetching the conversation infomation
|
141
197
|
* @param {String} conversationUrl conversationUrl to start adhoc meeting on
|
@@ -145,6 +201,30 @@ export default class MeetingInfoV2 {
|
|
145
201
|
* @memberof MeetingInfo
|
146
202
|
*/
|
147
203
|
createAdhocSpaceMeeting(conversationUrl: string, installedOrgID?: string): Promise<any>;
|
204
|
+
/**
|
205
|
+
* Fetches details for static meeting link
|
206
|
+
* @param {String} conversationUrl conversationUrl that's required to find static meeting link if it exists
|
207
|
+
* @returns {Promise} returns a Promise
|
208
|
+
* @public
|
209
|
+
* @memberof MeetingInfo
|
210
|
+
*/
|
211
|
+
fetchStaticMeetingLink(conversationUrl: string): Promise<any>;
|
212
|
+
/**
|
213
|
+
* Enables static meeting link
|
214
|
+
* @param {String} conversationUrl conversationUrl that's required to enable static meeting link
|
215
|
+
* @returns {Promise} returns a Promise
|
216
|
+
* @public
|
217
|
+
* @memberof MeetingInfo
|
218
|
+
*/
|
219
|
+
enableStaticMeetingLink(conversationUrl: string): Promise<any>;
|
220
|
+
/**
|
221
|
+
* Disables static meeting link for given conversation url
|
222
|
+
* @param {String} conversationUrl conversationUrl that's required to disable static meeting link if it exists
|
223
|
+
* @returns {Promise} returns a Promise
|
224
|
+
* @public
|
225
|
+
* @memberof MeetingInfo
|
226
|
+
*/
|
227
|
+
disableStaticMeetingLink(conversationUrl: string): Promise<any>;
|
148
228
|
/**
|
149
229
|
* Fetches meeting info from the server
|
150
230
|
* @param {String} destination one of many different types of destinations to look up info for
|
@@ -348,6 +348,15 @@ export default class Meetings extends WebexPlugin {
|
|
348
348
|
* @memberof Meetings
|
349
349
|
*/
|
350
350
|
private destroy;
|
351
|
+
/**
|
352
|
+
* Fetch static meeting link for given conversation url.
|
353
|
+
*
|
354
|
+
* @param {string} conversationUrl - url for conversation
|
355
|
+
* @returns {Promise}
|
356
|
+
* @public
|
357
|
+
* @memberof Meetings
|
358
|
+
*/
|
359
|
+
fetchStaticMeetingLink(conversationUrl: string): Promise<any>;
|
351
360
|
/**
|
352
361
|
* Create a meeting or return an existing meeting.
|
353
362
|
*
|
@@ -368,6 +377,26 @@ export default class Meetings extends WebexPlugin {
|
|
368
377
|
* @memberof Meetings
|
369
378
|
*/
|
370
379
|
create(destination: string, type?: DESTINATION_TYPE, useRandomDelayForInfo?: boolean, infoExtraParams?: {}, correlationId?: string, failOnMissingMeetingInfo?: boolean, callStateForMetrics?: CallStateForMetrics, meetingInfo?: any, meetingLookupUrl?: any, sessionCorrelationId?: string): any;
|
380
|
+
/**
|
381
|
+
* Enable static meeting links for given conversation url.
|
382
|
+
*
|
383
|
+
*
|
384
|
+
* @param {string} conversationUrl - url for conversation
|
385
|
+
* @returns {Promise}
|
386
|
+
* @public
|
387
|
+
* @memberof Meetings
|
388
|
+
*/
|
389
|
+
enableStaticMeetingLink(conversationUrl: string): Promise<any>;
|
390
|
+
/**
|
391
|
+
* Disable static meeting links for given conversation url.
|
392
|
+
*
|
393
|
+
*
|
394
|
+
* @param {string} conversationUrl - url for conversation
|
395
|
+
* @returns {Promise}
|
396
|
+
* @public
|
397
|
+
* @memberof Meetings
|
398
|
+
*/
|
399
|
+
disableStaticMeetingLink(conversationUrl: string): Promise<any>;
|
371
400
|
/**
|
372
401
|
* Create meeting
|
373
402
|
*
|
@@ -45,10 +45,19 @@ declare const BEHAVIORAL_METRICS: {
|
|
45
45
|
UPLOAD_LOGS_FAILURE: string;
|
46
46
|
UPLOAD_LOGS_SUCCESS: string;
|
47
47
|
RECEIVE_TRANSCRIPTION_FAILURE: string;
|
48
|
+
MEETING_IS_IN_PROGRESS_ERROR: string;
|
49
|
+
STATIC_MEETING_LINK_ALREADY_EXISTS_ERROR: string;
|
48
50
|
FETCH_MEETING_INFO_V1_SUCCESS: string;
|
49
51
|
FETCH_MEETING_INFO_V1_FAILURE: string;
|
52
|
+
ENABLE_STATIC_METTING_LINK_SUCCESS: string;
|
53
|
+
ENABLE_STATIC_METTING_LINK_FAILURE: string;
|
54
|
+
DISABLE_STATIC_MEETING_LINK_SUCCESS: string;
|
55
|
+
DISABLE_STATIC_MEETING_LINK_FAILURE: string;
|
50
56
|
ADHOC_MEETING_SUCCESS: string;
|
51
57
|
ADHOC_MEETING_FAILURE: string;
|
58
|
+
FETCH_STATIC_MEETING_LINK_SUCCESS: string;
|
59
|
+
FETCH_STATIC_MEETING_LINK_FAILURE: string;
|
60
|
+
MEETING_LINK_DOES_NOT_EXIST_ERROR: string;
|
52
61
|
VERIFY_PASSWORD_SUCCESS: string;
|
53
62
|
VERIFY_PASSWORD_ERROR: string;
|
54
63
|
VERIFY_CAPTCHA_ERROR: string;
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { ClusterNode } from './request';
|
2
2
|
import EventsScope from '../common/events/events-scope';
|
3
3
|
import { Enum } from '../constants';
|
4
|
-
import { ClusterReachabilityResult } from './reachability.types';
|
4
|
+
import { ClusterReachabilityResult, NatType } from './reachability.types';
|
5
5
|
export type ResultEventData = {
|
6
6
|
protocol: 'udp' | 'tcp' | 'xtls';
|
7
7
|
result: 'reachable' | 'unreachable' | 'untested';
|
@@ -12,9 +12,13 @@ export type ClientMediaIpsUpdatedEventData = {
|
|
12
12
|
protocol: 'udp' | 'tcp' | 'xtls';
|
13
13
|
clientMediaIPs: string[];
|
14
14
|
};
|
15
|
+
export type NatTypeUpdatedEventData = {
|
16
|
+
natType: NatType;
|
17
|
+
};
|
15
18
|
export declare const Events: {
|
16
19
|
readonly resultReady: "resultReady";
|
17
20
|
readonly clientMediaIpsUpdated: "clientMediaIpsUpdated";
|
21
|
+
readonly natTypeUpdated: "natTypeUpdated";
|
18
22
|
};
|
19
23
|
export type Events = Enum<typeof Events>;
|
20
24
|
/**
|
@@ -29,6 +33,7 @@ export declare class ClusterReachability extends EventsScope {
|
|
29
33
|
private pc?;
|
30
34
|
private defer;
|
31
35
|
private startTimestamp;
|
36
|
+
private srflxIceCandidates;
|
32
37
|
readonly isVideoMesh: boolean;
|
33
38
|
readonly name: any;
|
34
39
|
/**
|
@@ -107,6 +112,13 @@ export declare class ClusterReachability extends EventsScope {
|
|
107
112
|
* @returns {void}
|
108
113
|
*/
|
109
114
|
private saveResult;
|
115
|
+
/**
|
116
|
+
* Determines NAT Type.
|
117
|
+
*
|
118
|
+
* @param {RTCIceCandidate} candidate
|
119
|
+
* @returns {void}
|
120
|
+
*/
|
121
|
+
private determineNatType;
|
110
122
|
/**
|
111
123
|
* Registers a listener for the icecandidate event
|
112
124
|
*
|
@@ -4,7 +4,7 @@
|
|
4
4
|
import { Defer } from '@webex/common';
|
5
5
|
import { IP_VERSION } from '../constants';
|
6
6
|
import ReachabilityRequest, { ClusterList } from './request';
|
7
|
-
import { ClusterReachabilityResult, ClientMediaPreferences, ReachabilityMetrics, ReachabilityReportV0, ReachabilityReportV1, ReachabilityResults, ReachabilityResultsForBackend, GetClustersTrigger } from './reachability.types';
|
7
|
+
import { ClusterReachabilityResult, ClientMediaPreferences, ReachabilityMetrics, ReachabilityReportV0, ReachabilityReportV1, ReachabilityResults, ReachabilityResultsForBackend, GetClustersTrigger, NatType } from './reachability.types';
|
8
8
|
import { ClusterReachability } from './clusterReachability';
|
9
9
|
import EventsScope from '../common/events/events-scope';
|
10
10
|
/**
|
@@ -46,6 +46,7 @@ export default class Reachability extends EventsScope {
|
|
46
46
|
};
|
47
47
|
startTime: any;
|
48
48
|
totalDuration: any;
|
49
|
+
natType: NatType;
|
49
50
|
protected lastTrigger?: string;
|
50
51
|
/**
|
51
52
|
* Creates an instance of Reachability.
|
@@ -4,6 +4,10 @@ export type TransportResult = {
|
|
4
4
|
latencyInMilliseconds?: number;
|
5
5
|
clientMediaIPs?: string[];
|
6
6
|
};
|
7
|
+
export declare enum NatType {
|
8
|
+
Unknown = "unknown",
|
9
|
+
SymmetricNat = "symmetric-nat"
|
10
|
+
}
|
7
11
|
export type ClusterReachabilityResult = {
|
8
12
|
udp: TransportResult;
|
9
13
|
tcp: TransportResult;
|
@@ -22,6 +26,7 @@ export type ReachabilityMetrics = {
|
|
22
26
|
reachability_vmn_tcp_failed: number;
|
23
27
|
reachability_vmn_xtls_success: number;
|
24
28
|
reachability_vmn_xtls_failed: number;
|
29
|
+
natType: NatType;
|
25
30
|
};
|
26
31
|
/**
|
27
32
|
* This is the type that matches what backend expects us to send to them. It is a bit weird, because
|
package/dist/webinar/index.js
CHANGED
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.8.0-
|
47
|
-
"@webex/plugin-rooms": "3.8.0-
|
48
|
-
"@webex/test-helper-chai": "3.8.0-
|
49
|
-
"@webex/test-helper-mocha": "3.8.0-
|
50
|
-
"@webex/test-helper-mock-webex": "3.8.0-
|
51
|
-
"@webex/test-helper-retry": "3.8.0-
|
52
|
-
"@webex/test-helper-test-users": "3.8.0-
|
46
|
+
"@webex/plugin-meetings": "3.8.0-web-workers-keepalive.1",
|
47
|
+
"@webex/plugin-rooms": "3.8.0-web-workers-keepalive.1",
|
48
|
+
"@webex/test-helper-chai": "3.8.0-web-workers-keepalive.1",
|
49
|
+
"@webex/test-helper-mocha": "3.8.0-web-workers-keepalive.1",
|
50
|
+
"@webex/test-helper-mock-webex": "3.8.0-web-workers-keepalive.1",
|
51
|
+
"@webex/test-helper-retry": "3.8.0-web-workers-keepalive.1",
|
52
|
+
"@webex/test-helper-test-users": "3.8.0-web-workers-keepalive.1",
|
53
53
|
"chai": "^4.3.4",
|
54
54
|
"chai-as-promised": "^7.1.1",
|
55
55
|
"eslint": "^8.24.0",
|
@@ -61,22 +61,22 @@
|
|
61
61
|
"typescript": "^4.7.4"
|
62
62
|
},
|
63
63
|
"dependencies": {
|
64
|
-
"@webex/common": "3.8.0-
|
64
|
+
"@webex/common": "3.8.0-web-workers-keepalive.1",
|
65
65
|
"@webex/event-dictionary-ts": "^1.0.1688",
|
66
|
-
"@webex/internal-media-core": "2.14.
|
67
|
-
"@webex/internal-plugin-conversation": "3.8.0-
|
68
|
-
"@webex/internal-plugin-device": "3.8.0-
|
69
|
-
"@webex/internal-plugin-llm": "3.8.0-
|
70
|
-
"@webex/internal-plugin-mercury": "3.8.0-
|
71
|
-
"@webex/internal-plugin-metrics": "3.8.0-
|
72
|
-
"@webex/internal-plugin-support": "3.8.0-
|
73
|
-
"@webex/internal-plugin-user": "3.8.0-
|
74
|
-
"@webex/internal-plugin-voicea": "3.8.0-
|
75
|
-
"@webex/media-helpers": "3.8.0-
|
76
|
-
"@webex/plugin-people": "3.8.0-
|
77
|
-
"@webex/plugin-rooms": "3.8.0-
|
66
|
+
"@webex/internal-media-core": "2.14.7",
|
67
|
+
"@webex/internal-plugin-conversation": "3.8.0-web-workers-keepalive.1",
|
68
|
+
"@webex/internal-plugin-device": "3.8.0-web-workers-keepalive.1",
|
69
|
+
"@webex/internal-plugin-llm": "3.8.0-web-workers-keepalive.1",
|
70
|
+
"@webex/internal-plugin-mercury": "3.8.0-web-workers-keepalive.1",
|
71
|
+
"@webex/internal-plugin-metrics": "3.8.0-web-workers-keepalive.1",
|
72
|
+
"@webex/internal-plugin-support": "3.8.0-web-workers-keepalive.1",
|
73
|
+
"@webex/internal-plugin-user": "3.8.0-web-workers-keepalive.1",
|
74
|
+
"@webex/internal-plugin-voicea": "3.8.0-web-workers-keepalive.1",
|
75
|
+
"@webex/media-helpers": "3.8.0-web-workers-keepalive.1",
|
76
|
+
"@webex/plugin-people": "3.8.0-web-workers-keepalive.1",
|
77
|
+
"@webex/plugin-rooms": "3.8.0-web-workers-keepalive.1",
|
78
78
|
"@webex/web-capabilities": "^1.4.0",
|
79
|
-
"@webex/webex-core": "3.8.0-
|
79
|
+
"@webex/webex-core": "3.8.0-web-workers-keepalive.1",
|
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.8.0-
|
95
|
+
"version": "3.8.0-web-workers-keepalive.1"
|
96
96
|
}
|
package/src/config.ts
CHANGED
@@ -95,6 +95,7 @@ export default {
|
|
95
95
|
// This only applies to non-multistream meetings
|
96
96
|
iceCandidatesGatheringTimeout: undefined,
|
97
97
|
backendIpv6NativeSupport: false,
|
98
|
+
enableReachabilityChecks: true,
|
98
99
|
reachabilityGetClusterTimeout: 5000,
|
99
100
|
logUploadIntervalMultiplicationFactor: 0, // if set to 0 or undefined, logs won't be uploaded periodically, if you want periodic logs, recommended value is 1
|
100
101
|
},
|
@@ -206,8 +206,8 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
|
|
206
206
|
),
|
207
207
|
|
208
208
|
hasPracticeSessionEnabledChanged: !isEqual(
|
209
|
-
previous?.practiceSession?.enabled,
|
210
|
-
current?.practiceSession?.enabled
|
209
|
+
!!previous?.practiceSession?.enabled,
|
210
|
+
!!current?.practiceSession?.enabled
|
211
211
|
),
|
212
212
|
|
213
213
|
hasStageViewChanged: !isEqual(previous?.videoLayout, current?.videoLayout),
|
package/src/meeting/index.ts
CHANGED
@@ -1686,6 +1686,33 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
1686
1686
|
return this.#isoLocalClientMeetingJoinTime;
|
1687
1687
|
}
|
1688
1688
|
|
1689
|
+
/**
|
1690
|
+
* Setter - sets isoLocalClientMeetingJoinTime
|
1691
|
+
* This will be set once on meeting join, and not updated again
|
1692
|
+
* this will always produce an ISO string
|
1693
|
+
* If the iso string is invalid, it will fallback to the current system time
|
1694
|
+
* @param {string | undefined} time
|
1695
|
+
*/
|
1696
|
+
set isoLocalClientMeetingJoinTime(time: string | undefined) {
|
1697
|
+
const fallback = new Date().toISOString();
|
1698
|
+
if (!time) {
|
1699
|
+
this.#isoLocalClientMeetingJoinTime = fallback;
|
1700
|
+
} else {
|
1701
|
+
const date = new Date(time);
|
1702
|
+
|
1703
|
+
// Check if the date is valid
|
1704
|
+
if (Number.isNaN(date.getTime())) {
|
1705
|
+
LoggerProxy.logger.info(
|
1706
|
+
// @ts-ignore
|
1707
|
+
`Meeting:index#isoLocalClientMeetingJoinTime --> Invalid date provided: ${time}. Falling back to system clock.`
|
1708
|
+
);
|
1709
|
+
this.#isoLocalClientMeetingJoinTime = fallback;
|
1710
|
+
} else {
|
1711
|
+
this.#isoLocalClientMeetingJoinTime = date.toISOString();
|
1712
|
+
}
|
1713
|
+
}
|
1714
|
+
}
|
1715
|
+
|
1689
1716
|
/**
|
1690
1717
|
* Set meeting info and trigger `MEETING_INFO_AVAILABLE` event
|
1691
1718
|
* @param {any} info
|
@@ -5718,8 +5745,6 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
5718
5745
|
// @ts-ignore
|
5719
5746
|
this.webex.internal.device.meetingStarted();
|
5720
5747
|
|
5721
|
-
this.#isoLocalClientMeetingJoinTime = new Date().toISOString();
|
5722
|
-
|
5723
5748
|
LoggerProxy.logger.log('Meeting:index#join --> Success');
|
5724
5749
|
|
5725
5750
|
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.JOIN_SUCCESS, {
|
@@ -6180,10 +6205,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
6180
6205
|
},
|
6181
6206
|
options: {meetingId: this.id, rawError: error},
|
6182
6207
|
});
|
6183
|
-
} else if (
|
6184
|
-
error instanceof Errors.SdpOfferHandlingError ||
|
6185
|
-
error instanceof Errors.SdpAnswerHandlingError
|
6186
|
-
) {
|
6208
|
+
} else if (error instanceof Errors.SdpOfferHandlingError) {
|
6187
6209
|
sendBehavioralMetric(BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE, error, this.correlationId);
|
6188
6210
|
|
6189
6211
|
// @ts-ignore
|
@@ -6194,6 +6216,24 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
6194
6216
|
},
|
6195
6217
|
options: {meetingId: this.id, rawError: error},
|
6196
6218
|
});
|
6219
|
+
} else if (error instanceof Errors.SdpAnswerHandlingError) {
|
6220
|
+
sendBehavioralMetric(BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE, error, this.correlationId);
|
6221
|
+
|
6222
|
+
// @ts-ignore
|
6223
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
6224
|
+
name: 'client.media-engine.remote-sdp-received',
|
6225
|
+
payload: {
|
6226
|
+
canProceed: false,
|
6227
|
+
},
|
6228
|
+
options: {meetingId: this.id, rawError: error},
|
6229
|
+
});
|
6230
|
+
|
6231
|
+
if (this.deferSDPAnswer) {
|
6232
|
+
clearTimeout(this.sdpResponseTimer);
|
6233
|
+
this.sdpResponseTimer = undefined;
|
6234
|
+
|
6235
|
+
this.deferSDPAnswer.reject();
|
6236
|
+
}
|
6197
6237
|
} else if (error instanceof Errors.SdpError) {
|
6198
6238
|
// this covers also the case of Errors.IceGatheringError which extends Errors.SdpError
|
6199
6239
|
sendBehavioralMetric(BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE, error, this.correlationId);
|
@@ -8715,6 +8755,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
8715
8755
|
LoggerProxy.logger.log(
|
8716
8756
|
`Meeting:index#handleShareVideoStreamMuteStateChange --> Share video stream mute state changed to muted ${muted}`
|
8717
8757
|
);
|
8758
|
+
|
8759
|
+
const shareVideoStreamSettings = this.mediaProperties?.shareVideoStream?.getSettings();
|
8760
|
+
|
8718
8761
|
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_SHARE_VIDEO_MUTE_STATE_CHANGE, {
|
8719
8762
|
correlationId: this.correlationId,
|
8720
8763
|
muted,
|
@@ -8723,8 +8766,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
8723
8766
|
// SDK to TypeScript 5, which may affect other packages, use bracket notation for now, since
|
8724
8767
|
// all we're doing here is adding metrics.
|
8725
8768
|
// eslint-disable-next-line dot-notation
|
8726
|
-
displaySurface:
|
8769
|
+
displaySurface: shareVideoStreamSettings?.['displaySurface'],
|
8727
8770
|
isMultistream: this.isMultistream,
|
8771
|
+
frameRate: shareVideoStreamSettings?.frameRate,
|
8728
8772
|
});
|
8729
8773
|
};
|
8730
8774
|
|
package/src/meeting/util.ts
CHANGED
@@ -176,11 +176,12 @@ const MeetingUtil = {
|
|
176
176
|
deviceCapabilities: options.deviceCapabilities,
|
177
177
|
liveAnnotationSupported: options.liveAnnotationSupported,
|
178
178
|
clientMediaPreferences,
|
179
|
+
alias: options.alias,
|
179
180
|
})
|
180
181
|
.then((res) => {
|
181
182
|
const parsed = MeetingUtil.parseLocusJoin(res);
|
182
183
|
meeting.setLocus(parsed);
|
183
|
-
|
184
|
+
meeting.isoLocalClientMeetingJoinTime = res?.headers?.date; // read from header if exist, else fall back to system clock : https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-555657
|
184
185
|
webex.internal.newMetrics.submitClientEvent({
|
185
186
|
name: 'client.locus.join.response',
|
186
187
|
payload: {
|