@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.
Files changed (64) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/config.js +1 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/interpretation/index.js +1 -1
  6. package/dist/interpretation/siLanguage.js +1 -1
  7. package/dist/locus-info/controlsUtils.js +1 -1
  8. package/dist/locus-info/controlsUtils.js.map +1 -1
  9. package/dist/meeting/index.js +51 -5
  10. package/dist/meeting/index.js.map +1 -1
  11. package/dist/meeting/util.js +4 -1
  12. package/dist/meeting/util.js.map +1 -1
  13. package/dist/meeting-info/meeting-info-v2.js +359 -60
  14. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  15. package/dist/meetings/index.js +60 -1
  16. package/dist/meetings/index.js.map +1 -1
  17. package/dist/member/index.js +10 -0
  18. package/dist/member/index.js.map +1 -1
  19. package/dist/member/util.js +3 -0
  20. package/dist/member/util.js.map +1 -1
  21. package/dist/metrics/constants.js +9 -0
  22. package/dist/metrics/constants.js.map +1 -1
  23. package/dist/reachability/clusterReachability.js +52 -8
  24. package/dist/reachability/clusterReachability.js.map +1 -1
  25. package/dist/reachability/index.js +70 -45
  26. package/dist/reachability/index.js.map +1 -1
  27. package/dist/reachability/reachability.types.js +14 -0
  28. package/dist/reachability/reachability.types.js.map +1 -1
  29. package/dist/reachability/request.js +19 -3
  30. package/dist/reachability/request.js.map +1 -1
  31. package/dist/types/config.d.ts +1 -0
  32. package/dist/types/meeting/index.d.ts +8 -0
  33. package/dist/types/meeting-info/meeting-info-v2.d.ts +80 -0
  34. package/dist/types/meetings/index.d.ts +29 -0
  35. package/dist/types/member/index.d.ts +1 -0
  36. package/dist/types/metrics/constants.d.ts +9 -0
  37. package/dist/types/reachability/clusterReachability.d.ts +13 -1
  38. package/dist/types/reachability/index.d.ts +2 -1
  39. package/dist/types/reachability/reachability.types.d.ts +5 -0
  40. package/dist/webinar/index.js +1 -1
  41. package/package.json +22 -22
  42. package/src/config.ts +1 -0
  43. package/src/locus-info/controlsUtils.ts +2 -2
  44. package/src/meeting/index.ts +51 -7
  45. package/src/meeting/util.ts +2 -1
  46. package/src/meeting-info/meeting-info-v2.ts +247 -6
  47. package/src/meetings/index.ts +72 -1
  48. package/src/member/index.ts +11 -0
  49. package/src/member/util.ts +3 -0
  50. package/src/metrics/constants.ts +9 -0
  51. package/src/reachability/clusterReachability.ts +47 -1
  52. package/src/reachability/index.ts +15 -0
  53. package/src/reachability/reachability.types.ts +6 -0
  54. package/src/reachability/request.ts +7 -0
  55. package/test/unit/spec/locus-info/controlsUtils.js +8 -0
  56. package/test/unit/spec/meeting/index.js +62 -4
  57. package/test/unit/spec/meeting/utils.js +55 -0
  58. package/test/unit/spec/meeting-info/meetinginfov2.js +443 -114
  59. package/test/unit/spec/meetings/index.js +78 -1
  60. package/test/unit/spec/member/index.js +7 -0
  61. package/test/unit/spec/member/util.js +24 -0
  62. package/test/unit/spec/reachability/clusterReachability.ts +47 -1
  63. package/test/unit/spec/reachability/index.ts +12 -0
  64. 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","ReachabilityRequest","_createClass2","default","webex","_this","_classCallCheck2","_defineProperty2","trigger","ipVersion","previousReport","callWrapper","internal","newMetrics","callDiagnosticLatencies","measureLatency","bind","func","request","method","HTTP_VERBS","POST","shouldRefreshAccessToken","api","API","CALLIOPEDISCOVERY","resource","RESOURCE","CLUSTERS","body","ipver","timeout","config","meetings","reachabilityGetClusterTimeout","then","res","_res$body","clusters","joinCookie","discoveryOptions","_keys","forEach","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 // 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 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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"}
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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"}
@@ -70,6 +70,7 @@ declare const _default: {
70
70
  };
71
71
  iceCandidatesGatheringTimeout: any;
72
72
  backendIpv6NativeSupport: boolean;
73
+ enableReachabilityChecks: boolean;
73
74
  reachabilityGetClusterTimeout: number;
74
75
  logUploadIntervalMultiplicationFactor: number;
75
76
  };
@@ -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
  *
@@ -16,6 +16,7 @@ export default class Member {
16
16
  isInMeeting: any;
17
17
  isModerator: any;
18
18
  isModeratorAssignmentProhibited: any;
19
+ isPresenterAssignmentProhibited: any;
19
20
  isMutable: any;
20
21
  isNotAdmitted: any;
21
22
  isRecording: any;
@@ -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
@@ -458,7 +458,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
458
458
  }, _callee7);
459
459
  }))();
460
460
  },
461
- version: "3.8.0-next.8"
461
+ version: "3.8.0-web-workers-keepalive.1"
462
462
  });
463
463
  var _default = exports.default = Webinar;
464
464
  //# 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.8.0-next.8",
47
- "@webex/plugin-rooms": "3.8.0-next.2",
48
- "@webex/test-helper-chai": "3.8.0-next.2",
49
- "@webex/test-helper-mocha": "3.8.0-next.2",
50
- "@webex/test-helper-mock-webex": "3.8.0-next.2",
51
- "@webex/test-helper-retry": "3.8.0-next.2",
52
- "@webex/test-helper-test-users": "3.8.0-next.2",
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-next.2",
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.4",
67
- "@webex/internal-plugin-conversation": "3.8.0-next.2",
68
- "@webex/internal-plugin-device": "3.8.0-next.2",
69
- "@webex/internal-plugin-llm": "3.8.0-next.3",
70
- "@webex/internal-plugin-mercury": "3.8.0-next.2",
71
- "@webex/internal-plugin-metrics": "3.8.0-next.2",
72
- "@webex/internal-plugin-support": "3.8.0-next.2",
73
- "@webex/internal-plugin-user": "3.8.0-next.2",
74
- "@webex/internal-plugin-voicea": "3.8.0-next.8",
75
- "@webex/media-helpers": "3.8.0-next.2",
76
- "@webex/plugin-people": "3.8.0-next.2",
77
- "@webex/plugin-rooms": "3.8.0-next.2",
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-next.2",
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-next.8"
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),
@@ -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: this.mediaProperties?.shareVideoStream?.getSettings()['displaySurface'],
8769
+ displaySurface: shareVideoStreamSettings?.['displaySurface'],
8727
8770
  isMultistream: this.isMultistream,
8771
+ frameRate: shareVideoStreamSettings?.frameRate,
8728
8772
  });
8729
8773
  };
8730
8774
 
@@ -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: {