@webex/plugin-meetings 3.6.0-next.9 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +2 -1
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +1 -1
  4. package/dist/config.js +2 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/constants.js +24 -2
  7. package/dist/constants.js.map +1 -1
  8. package/dist/controls-options-manager/enums.js +1 -0
  9. package/dist/controls-options-manager/enums.js.map +1 -1
  10. package/dist/controls-options-manager/index.js +10 -3
  11. package/dist/controls-options-manager/index.js.map +1 -1
  12. package/dist/controls-options-manager/types.js.map +1 -1
  13. package/dist/controls-options-manager/util.js +12 -0
  14. package/dist/controls-options-manager/util.js.map +1 -1
  15. package/dist/interpretation/index.js +1 -1
  16. package/dist/interpretation/siLanguage.js +1 -1
  17. package/dist/locus-info/controlsUtils.js +28 -4
  18. package/dist/locus-info/controlsUtils.js.map +1 -1
  19. package/dist/locus-info/fullState.js +2 -1
  20. package/dist/locus-info/fullState.js.map +1 -1
  21. package/dist/locus-info/index.js +61 -3
  22. package/dist/locus-info/index.js.map +1 -1
  23. package/dist/meeting/in-meeting-actions.js +19 -1
  24. package/dist/meeting/in-meeting-actions.js.map +1 -1
  25. package/dist/meeting/index.js +536 -409
  26. package/dist/meeting/index.js.map +1 -1
  27. package/dist/meetings/index.js +2 -0
  28. package/dist/meetings/index.js.map +1 -1
  29. package/dist/members/index.js +3 -2
  30. package/dist/members/index.js.map +1 -1
  31. package/dist/members/util.js +9 -5
  32. package/dist/members/util.js.map +1 -1
  33. package/dist/networkQualityMonitor/index.js +227 -0
  34. package/dist/networkQualityMonitor/index.js.map +1 -0
  35. package/dist/reachability/index.js +3 -3
  36. package/dist/reachability/index.js.map +1 -1
  37. package/dist/reachability/request.js +2 -1
  38. package/dist/reachability/request.js.map +1 -1
  39. package/dist/rtcMetrics/constants.js +11 -0
  40. package/dist/rtcMetrics/constants.js.map +1 -0
  41. package/dist/rtcMetrics/index.js +197 -0
  42. package/dist/rtcMetrics/index.js.map +1 -0
  43. package/dist/types/config.d.ts +1 -0
  44. package/dist/types/constants.d.ts +19 -0
  45. package/dist/types/controls-options-manager/enums.d.ts +2 -1
  46. package/dist/types/controls-options-manager/index.d.ts +2 -1
  47. package/dist/types/controls-options-manager/types.d.ts +2 -0
  48. package/dist/types/locus-info/index.d.ts +9 -0
  49. package/dist/types/meeting/in-meeting-actions.d.ts +18 -0
  50. package/dist/types/meeting/index.d.ts +12 -1
  51. package/dist/types/members/index.d.ts +2 -1
  52. package/dist/types/members/util.d.ts +3 -1
  53. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  54. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  55. package/dist/types/rtcMetrics/index.d.ts +71 -0
  56. package/dist/webinar/index.js +32 -19
  57. package/dist/webinar/index.js.map +1 -1
  58. package/package.json +22 -22
  59. package/src/config.ts +1 -0
  60. package/src/constants.ts +25 -0
  61. package/src/controls-options-manager/enums.ts +1 -0
  62. package/src/controls-options-manager/index.ts +19 -2
  63. package/src/controls-options-manager/types.ts +2 -0
  64. package/src/controls-options-manager/util.ts +12 -0
  65. package/src/locus-info/controlsUtils.ts +46 -2
  66. package/src/locus-info/fullState.ts +1 -0
  67. package/src/locus-info/index.ts +60 -0
  68. package/src/meeting/in-meeting-actions.ts +37 -0
  69. package/src/meeting/index.ts +114 -9
  70. package/src/meetings/index.ts +46 -39
  71. package/src/members/index.ts +4 -2
  72. package/src/members/util.ts +3 -1
  73. package/src/reachability/index.ts +3 -3
  74. package/src/reachability/request.ts +1 -0
  75. package/src/webinar/index.ts +31 -17
  76. package/test/unit/spec/controls-options-manager/index.js +56 -32
  77. package/test/unit/spec/controls-options-manager/util.js +44 -0
  78. package/test/unit/spec/locus-info/controlsUtils.js +80 -4
  79. package/test/unit/spec/locus-info/index.js +59 -2
  80. package/test/unit/spec/meeting/in-meeting-actions.ts +18 -0
  81. package/test/unit/spec/meeting/index.js +222 -82
  82. package/test/unit/spec/meetings/index.js +16 -1
  83. package/test/unit/spec/members/index.js +25 -2
  84. package/test/unit/spec/members/request.js +37 -3
  85. package/test/unit/spec/members/utils.js +15 -1
  86. package/test/unit/spec/reachability/index.ts +1 -1
  87. package/test/unit/spec/reachability/request.js +13 -8
  88. package/test/unit/spec/webinar/index.ts +82 -16
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
13
+ var _internalPluginMetrics = require("@webex/internal-plugin-metrics");
14
+ var _uuid = _interopRequireDefault(require("uuid"));
15
+ var _constants = _interopRequireDefault(require("./constants"));
16
+ /* eslint-disable class-methods-use-this */
17
+
18
+ var parseJsonPayload = function parseJsonPayload(payload) {
19
+ try {
20
+ if (payload && payload[0]) {
21
+ return JSON.parse(payload[0]);
22
+ }
23
+ return null;
24
+ } catch (_) {
25
+ return null;
26
+ }
27
+ };
28
+
29
+ /**
30
+ * Rtc Metrics
31
+ */
32
+ var RtcMetrics = exports.default = /*#__PURE__*/function () {
33
+ /**
34
+ * Initialize the interval.
35
+ *
36
+ * @param {object} webex - The main `webex` object.
37
+ * @param {string} meetingId - The meeting id.
38
+ * @param {string} correlationId - The correlation id.
39
+ */
40
+ function RtcMetrics(webex, meetingId, correlationId) {
41
+ (0, _classCallCheck2.default)(this, RtcMetrics);
42
+ /**
43
+ * Array of MetricData items to be sent to the metrics service.
44
+ */
45
+ (0, _defineProperty2.default)(this, "metricsQueue", []);
46
+ (0, _defineProperty2.default)(this, "intervalId", void 0);
47
+ (0, _defineProperty2.default)(this, "webex", void 0);
48
+ (0, _defineProperty2.default)(this, "meetingId", void 0);
49
+ (0, _defineProperty2.default)(this, "correlationId", void 0);
50
+ (0, _defineProperty2.default)(this, "connectionId", void 0);
51
+ (0, _defineProperty2.default)(this, "shouldSendMetricsOnNextStatsReport", void 0);
52
+ // `window` is used to prevent typescript from returning a NodeJS.Timer.
53
+ this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);
54
+ this.meetingId = meetingId;
55
+ this.webex = webex;
56
+ this.correlationId = correlationId;
57
+ this.resetConnection();
58
+ }
59
+
60
+ /**
61
+ * Check to see if the metrics queue has any items.
62
+ *
63
+ * @returns {void}
64
+ */
65
+ (0, _createClass2.default)(RtcMetrics, [{
66
+ key: "sendMetricsInQueue",
67
+ value: function sendMetricsInQueue() {
68
+ if (this.metricsQueue.length) {
69
+ this.sendMetrics();
70
+ this.metricsQueue = [];
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Forces sending metrics when we get the next stats-report
76
+ *
77
+ * This is useful for cases when something important happens that affects the media connection,
78
+ * for example when we move from lobby into the meeting.
79
+ *
80
+ * @returns {void}
81
+ */
82
+ }, {
83
+ key: "sendNextMetrics",
84
+ value: function sendNextMetrics() {
85
+ this.shouldSendMetricsOnNextStatsReport = true;
86
+ }
87
+
88
+ /**
89
+ * Add metrics items to the metrics queue.
90
+ *
91
+ * @param {object} data - An object with a payload array of metrics items.
92
+ *
93
+ * @returns {void}
94
+ */
95
+ }, {
96
+ key: "addMetrics",
97
+ value: function addMetrics(data) {
98
+ if (data.payload.length) {
99
+ if (data.name === 'stats-report') {
100
+ data.payload = data.payload.map(this.anonymizeIp);
101
+ }
102
+ this.metricsQueue.push(data);
103
+ if (this.shouldSendMetricsOnNextStatsReport && data.name === 'stats-report') {
104
+ // this is the first useful set of data (WCME gives it to us after 5s), send it out immediately
105
+ // in case the user is unhappy and closes the browser early
106
+ this.sendMetricsInQueue();
107
+ this.shouldSendMetricsOnNextStatsReport = false;
108
+ }
109
+ try {
110
+ // If a connection fails, send the rest of the metrics in queue and get a new connection id.
111
+ var parsedPayload = parseJsonPayload(data.payload);
112
+ if (data.name === 'onconnectionstatechange' && parsedPayload && parsedPayload.value === 'failed') {
113
+ this.sendMetricsInQueue();
114
+ this.resetConnection();
115
+ }
116
+ } catch (e) {
117
+ console.error(e);
118
+ }
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Clear the metrics interval.
124
+ *
125
+ * @returns {void}
126
+ */
127
+ }, {
128
+ key: "closeMetrics",
129
+ value: function closeMetrics() {
130
+ this.sendMetricsInQueue();
131
+ clearInterval(this.intervalId);
132
+ }
133
+
134
+ /**
135
+ * Anonymize IP addresses.
136
+ *
137
+ * @param {array} stats - An RTCStatsReport organized into an array of strings.
138
+ * @returns {string}
139
+ */
140
+ }, {
141
+ key: "anonymizeIp",
142
+ value: function anonymizeIp(stats) {
143
+ var data = JSON.parse(stats);
144
+ // on local and remote candidates, anonymize the last 4 bits.
145
+ if (data.type === 'local-candidate' || data.type === 'remote-candidate') {
146
+ data.ip = _internalPluginMetrics.CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;
147
+ data.address = _internalPluginMetrics.CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;
148
+ data.relatedAddress = _internalPluginMetrics.CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;
149
+ }
150
+ return (0, _stringify.default)(data);
151
+ }
152
+
153
+ /**
154
+ * Set a new connection id.
155
+ *
156
+ * @returns {void}
157
+ */
158
+ }, {
159
+ key: "resetConnection",
160
+ value: function resetConnection() {
161
+ this.connectionId = _uuid.default.v4();
162
+ this.shouldSendMetricsOnNextStatsReport = true;
163
+ }
164
+
165
+ /**
166
+ * Send metrics to the metrics service.
167
+ *
168
+ * @returns {void}
169
+ */
170
+ }, {
171
+ key: "sendMetrics",
172
+ value: function sendMetrics() {
173
+ this.webex.request({
174
+ method: 'POST',
175
+ service: 'unifiedTelemetry',
176
+ resource: 'metric/v2',
177
+ headers: {
178
+ type: 'webrtcMedia',
179
+ appId: _constants.default.APP_ID
180
+ },
181
+ body: {
182
+ metrics: [{
183
+ type: 'webrtc',
184
+ version: '1.1.0',
185
+ userId: this.webex.internal.device.userId,
186
+ meetingId: this.meetingId,
187
+ correlationId: this.correlationId,
188
+ connectionId: this.connectionId,
189
+ data: this.metricsQueue
190
+ }]
191
+ }
192
+ });
193
+ }
194
+ }]);
195
+ return RtcMetrics;
196
+ }();
197
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_internalPluginMetrics","require","_uuid","_interopRequireDefault","_constants","parseJsonPayload","payload","JSON","parse","_","RtcMetrics","exports","default","webex","meetingId","correlationId","_classCallCheck2","_defineProperty2","intervalId","window","setInterval","sendMetricsInQueue","bind","resetConnection","_createClass2","key","value","metricsQueue","length","sendMetrics","sendNextMetrics","shouldSendMetricsOnNextStatsReport","addMetrics","data","name","map","anonymizeIp","push","parsedPayload","e","console","error","closeMetrics","clearInterval","stats","type","ip","CallDiagnosticUtils","anonymizeIPAddress","undefined","address","relatedAddress","_stringify","connectionId","uuid","v4","request","method","service","resource","headers","appId","RTC_METRICS","APP_ID","body","metrics","version","userId","internal","device"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';\nimport uuid from 'uuid';\nimport RTC_METRICS from './constants';\n\nconst parseJsonPayload = (payload: any[]): any | null => {\n try {\n if (payload && payload[0]) {\n return JSON.parse(payload[0]);\n }\n\n return null;\n } catch (_) {\n return null;\n }\n};\n\n/**\n * Rtc Metrics\n */\nexport default class RtcMetrics {\n /**\n * Array of MetricData items to be sent to the metrics service.\n */\n metricsQueue = [];\n\n intervalId: number;\n\n webex: any;\n\n meetingId: string;\n\n correlationId: string;\n\n connectionId: string;\n\n shouldSendMetricsOnNextStatsReport: boolean;\n\n /**\n * Initialize the interval.\n *\n * @param {object} webex - The main `webex` object.\n * @param {string} meetingId - The meeting id.\n * @param {string} correlationId - The correlation id.\n */\n constructor(webex, meetingId, correlationId) {\n // `window` is used to prevent typescript from returning a NodeJS.Timer.\n this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);\n this.meetingId = meetingId;\n this.webex = webex;\n this.correlationId = correlationId;\n this.resetConnection();\n }\n\n /**\n * Check to see if the metrics queue has any items.\n *\n * @returns {void}\n */\n public sendMetricsInQueue() {\n if (this.metricsQueue.length) {\n this.sendMetrics();\n this.metricsQueue = [];\n }\n }\n\n /**\n * Forces sending metrics when we get the next stats-report\n *\n * This is useful for cases when something important happens that affects the media connection,\n * for example when we move from lobby into the meeting.\n *\n * @returns {void}\n */\n public sendNextMetrics() {\n this.shouldSendMetricsOnNextStatsReport = true;\n }\n\n /**\n * Add metrics items to the metrics queue.\n *\n * @param {object} data - An object with a payload array of metrics items.\n *\n * @returns {void}\n */\n addMetrics(data) {\n if (data.payload.length) {\n if (data.name === 'stats-report') {\n data.payload = data.payload.map(this.anonymizeIp);\n }\n\n this.metricsQueue.push(data);\n\n if (this.shouldSendMetricsOnNextStatsReport && data.name === 'stats-report') {\n // this is the first useful set of data (WCME gives it to us after 5s), send it out immediately\n // in case the user is unhappy and closes the browser early\n this.sendMetricsInQueue();\n this.shouldSendMetricsOnNextStatsReport = false;\n }\n\n try {\n // If a connection fails, send the rest of the metrics in queue and get a new connection id.\n const parsedPayload = parseJsonPayload(data.payload);\n if (\n data.name === 'onconnectionstatechange' &&\n parsedPayload &&\n parsedPayload.value === 'failed'\n ) {\n this.sendMetricsInQueue();\n this.resetConnection();\n }\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n /**\n * Clear the metrics interval.\n *\n * @returns {void}\n */\n closeMetrics() {\n this.sendMetricsInQueue();\n clearInterval(this.intervalId);\n }\n\n /**\n * Anonymize IP addresses.\n *\n * @param {array} stats - An RTCStatsReport organized into an array of strings.\n * @returns {string}\n */\n anonymizeIp(stats: string): string {\n const data = JSON.parse(stats);\n // on local and remote candidates, anonymize the last 4 bits.\n if (data.type === 'local-candidate' || data.type === 'remote-candidate') {\n data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;\n data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;\n data.relatedAddress =\n CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;\n }\n\n return JSON.stringify(data);\n }\n\n /**\n * Set a new connection id.\n *\n * @returns {void}\n */\n private resetConnection() {\n this.connectionId = uuid.v4();\n this.shouldSendMetricsOnNextStatsReport = true;\n }\n\n /**\n * Send metrics to the metrics service.\n *\n * @returns {void}\n */\n private sendMetrics() {\n this.webex.request({\n method: 'POST',\n service: 'unifiedTelemetry',\n resource: 'metric/v2',\n headers: {\n type: 'webrtcMedia',\n appId: RTC_METRICS.APP_ID,\n },\n body: {\n metrics: [\n {\n type: 'webrtc',\n version: '1.1.0',\n userId: this.webex.internal.device.userId,\n meetingId: this.meetingId,\n correlationId: this.correlationId,\n connectionId: this.connectionId,\n data: this.metricsQueue,\n },\n ],\n },\n });\n }\n}\n"],"mappings":"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"}
@@ -70,6 +70,7 @@ declare const _default: {
70
70
  };
71
71
  iceCandidatesGatheringTimeout: any;
72
72
  backendIpv6NativeSupport: boolean;
73
+ reachabilityGetClusterTimeout: number;
73
74
  };
74
75
  };
75
76
  export default _default;
@@ -264,6 +264,10 @@ export declare const EVENT_TRIGGERS: {
264
264
  MEETING_CONTROLS_VIEW_THE_PARTICIPANTS_LIST_UPDATED: string;
265
265
  MEETING_CONTROLS_RAISE_HAND_UPDATED: string;
266
266
  MEETING_CONTROLS_VIDEO_UPDATED: string;
267
+ MEETING_CONTROLS_STAGE_VIEW_UPDATED: string;
268
+ MEETING_CONTROLS_WEBCAST_UPDATED: string;
269
+ MEETING_CONTROLS_MEETING_FULL_UPDATED: string;
270
+ MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: string;
267
271
  MEETING_LOCUS_URL_UPDATE: string;
268
272
  MEETING_STREAM_PUBLISH_STATE_CHANGED: string;
269
273
  MEETING_TRANSCRIPTION_CONNECTED: string;
@@ -546,7 +550,11 @@ export declare const LOCUSINFO: {
546
550
  CONTROLS_REACTIONS_CHANGED: string;
547
551
  CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED: string;
548
552
  CONTROLS_RAISE_HAND_CHANGED: string;
553
+ CONTROLS_WEBCAST_CHANGED: string;
554
+ CONTROLS_MEETING_FULL_CHANGED: string;
555
+ CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: string;
549
556
  CONTROLS_VIDEO_CHANGED: string;
557
+ CONTROLS_STAGE_VIEW_UPDATED: string;
550
558
  SELF_UNADMITTED_GUEST: string;
551
559
  SELF_ADMITTED_GUEST: string;
552
560
  SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: string;
@@ -572,6 +580,7 @@ export declare const LOCUSINFO: {
572
580
  SELF_MEETING_INTERPRETATION_CHANGED: string;
573
581
  MEDIA_INACTIVITY: string;
574
582
  LINKS_SERVICES: string;
583
+ LINKS_RESOURCES: string;
575
584
  };
576
585
  };
577
586
  export declare const LOCUSEVENT: {
@@ -775,6 +784,10 @@ export declare const DISPLAY_HINTS: {
775
784
  DISABLE_LOBBY_TO_BREAKOUT: string;
776
785
  DISABLE_VIEW_THE_PARTICIPANT_LIST: string;
777
786
  ENABLE_VIEW_THE_PARTICIPANT_LIST: string;
787
+ DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST: string;
788
+ ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST: string;
789
+ DISABLE_SHOW_ATTENDEE_COUNT: string;
790
+ ENABLE_SHOW_ATTENDEE_COUNT: string;
778
791
  DISABLE_RAISE_HAND: string;
779
792
  ENABLE_RAISE_HAND: string;
780
793
  DISABLE_VIDEO: string;
@@ -786,6 +799,12 @@ export declare const DISPLAY_HINTS: {
786
799
  SHARE_CONTENT: string;
787
800
  SHARE_WHITEBOARD: string;
788
801
  VOIP_IS_ENABLED: string;
802
+ WEBCAST_CONTROL_START: string;
803
+ WEBCAST_CONTROL_STOP: string;
804
+ STAGE_VIEW_ACTIVE: string;
805
+ STAGE_VIEW_INACTIVE: string;
806
+ ENABLE_STAGE_VIEW: string;
807
+ DISABLE_STAGE_VIEW: string;
789
808
  };
790
809
  export declare const INTERSTITIAL_DISPLAY_HINTS: string[];
791
810
  export declare const SELF_ROLES: {
@@ -1,7 +1,8 @@
1
1
  declare enum Setting {
2
2
  disallowUnmute = "DisallowUnmute",
3
3
  muteOnEntry = "MuteOnEntry",
4
- muted = "Muted"
4
+ muted = "Muted",
5
+ roles = "Roles"
5
6
  }
6
7
  declare enum Control {
7
8
  audio = "audio",
@@ -129,8 +129,9 @@ export default class ControlsOptionsManager {
129
129
  * @param {boolean} mutedEnabled
130
130
  * @param {boolean} disallowUnmuteEnabled
131
131
  * @param {boolean} muteOnEntryEnabled
132
+ * @param {array} roles which should be muted
132
133
  * @memberof ControlsOptionsManager
133
134
  * @returns {Promise}
134
135
  */
135
- setMuteAll(mutedEnabled: boolean, disallowUnmuteEnabled: boolean, muteOnEntryEnabled: boolean): Promise<any>;
136
+ setMuteAll(mutedEnabled: boolean, disallowUnmuteEnabled: boolean, muteOnEntryEnabled: boolean, roles: Array<string>): Promise<any>;
136
137
  }
@@ -29,6 +29,8 @@ export interface VideoProperties {
29
29
  }
30
30
  export interface ViewTheParticipantListProperties {
31
31
  enabled?: boolean;
32
+ panelistEnabled?: boolean;
33
+ attendeeCount?: boolean;
32
34
  }
33
35
  export type Properties = AudioProperties | RaiseHandProperties | ReactionsProperties | ShareControlProperties | VideoProperties | ViewTheParticipantListProperties;
34
36
  export interface ControlConfig<Props = Properties> {
@@ -35,6 +35,7 @@ export default class LocusInfo extends EventsScope {
35
35
  replace: any;
36
36
  url: any;
37
37
  services: any;
38
+ resources: any;
38
39
  mainSessionLocusCache: any;
39
40
  /**
40
41
  * Constructor
@@ -190,6 +191,14 @@ export default class LocusInfo extends EventsScope {
190
191
  updateServices(services: Record<'breakout' | 'record', {
191
192
  url: string;
192
193
  }>): void;
194
+ /**
195
+ * @param {Object} resources
196
+ * @returns {undefined}
197
+ * @memberof LocusInfo
198
+ */
199
+ updateResources(resources: Record<'webcastInstance', {
200
+ url: string;
201
+ }>): void;
193
202
  /**
194
203
  * @param {Object} fullState
195
204
  * @returns {undefined}
@@ -61,6 +61,10 @@ interface IInMeetingActions {
61
61
  canUpdateShareControl?: boolean;
62
62
  canEnableViewTheParticipantsList?: boolean;
63
63
  canDisableViewTheParticipantsList?: boolean;
64
+ canEnableViewTheParticipantsListPanelist?: boolean;
65
+ canDisableViewTheParticipantsListPanelist?: boolean;
66
+ canEnableShowAttendeeCount?: boolean;
67
+ canDisableShowAttendeeCount?: boolean;
64
68
  canEnableRaiseHand?: boolean;
65
69
  canDisableRaiseHand?: boolean;
66
70
  canEnableVideo?: boolean;
@@ -80,6 +84,11 @@ interface IInMeetingActions {
80
84
  canShareWhiteBoard?: boolean;
81
85
  enforceVirtualBackground?: boolean;
82
86
  canPollingAndQA?: boolean;
87
+ canStartWebcast?: boolean;
88
+ canStopWebcast?: boolean;
89
+ canShowStageView?: boolean;
90
+ canEnableStageView?: boolean;
91
+ canDisableStageView?: boolean;
83
92
  }
84
93
  /**
85
94
  * @class InMeetingActions
@@ -141,6 +150,10 @@ export default class InMeetingActions implements IInMeetingActions {
141
150
  canUpdateShareControl: any;
142
151
  canEnableViewTheParticipantsList: any;
143
152
  canDisableViewTheParticipantsList: any;
153
+ canEnableViewTheParticipantsListPanelist: any;
154
+ canDisableViewTheParticipantsListPanelist: any;
155
+ canEnableShowAttendeeCount: any;
156
+ canDisableShowAttendeeCount: any;
144
157
  canEnableRaiseHand: any;
145
158
  canDisableRaiseHand: any;
146
159
  canEnableVideo: any;
@@ -160,6 +173,11 @@ export default class InMeetingActions implements IInMeetingActions {
160
173
  supportHDV: any;
161
174
  canShareWhiteBoard: any;
162
175
  canPollingAndQA: any;
176
+ canStartWebcast: any;
177
+ canStopWebcast: any;
178
+ canShowStageView: any;
179
+ canEnableStageView: any;
180
+ canDisableStageView: any;
163
181
  /**
164
182
  * Returns all meeting action options
165
183
  * @returns {Object}
@@ -737,6 +737,15 @@ export default class Meeting extends StatelessWebexPlugin {
737
737
  * @memberof Meeting
738
738
  */
739
739
  private setUpLocusServicesListener;
740
+ /**
741
+ * Set up the locus info resources link listener
742
+ * update the locusInfo for webcast instance url
743
+ * @param {Object} payload - The event payload
744
+ * @returns {undefined}
745
+ * @private
746
+ * @memberof Meeting
747
+ */
748
+ private setUpLocusResourcesListener;
740
749
  /**
741
750
  * Set up the locus info meeting info listener
742
751
  * @returns {undefined}
@@ -1391,6 +1400,7 @@ export default class Meeting extends StatelessWebexPlugin {
1391
1400
  * @returns {Promise<void>}
1392
1401
  */
1393
1402
  private cleanUpBeforeRetryWithTurnServer;
1403
+ private cleanUpBeforeReconnection;
1394
1404
  /**
1395
1405
  * Creates an instance of LocusMediaRequest for this meeting - it is needed for doing any calls
1396
1406
  * to Locus /media API (these are used for sending Roap messages and updating audio/video mute status).
@@ -1605,10 +1615,11 @@ export default class Meeting extends StatelessWebexPlugin {
1605
1615
  * @param {boolean} mutedEnabled
1606
1616
  * @param {boolean} disallowUnmuteEnabled
1607
1617
  * @param {boolean} muteOnEntryEnabled
1618
+ * @param {array} roles
1608
1619
  * @public
1609
1620
  * @memberof Meeting
1610
1621
  */
1611
- setMuteAll(mutedEnabled: boolean, disallowUnmuteEnabled: boolean, muteOnEntryEnabled: boolean): Promise<any>;
1622
+ setMuteAll(mutedEnabled: boolean, disallowUnmuteEnabled: boolean, muteOnEntryEnabled: boolean, roles: Array<string>): Promise<any>;
1612
1623
  /**
1613
1624
  * End the recording of this meeting
1614
1625
  * @returns {Promise}
@@ -302,11 +302,12 @@ export default class Members extends StatelessWebexPlugin {
302
302
  /**
303
303
  * Lower all hands of members in a meeting
304
304
  * @param {String} requestingMemberId - id of the participant which requested the lower all hands
305
+ * @param {array} roles which should be lowered
305
306
  * @returns {Promise}
306
307
  * @public
307
308
  * @memberof Members
308
309
  */
309
- lowerAllHands(requestingMemberId: string): any;
310
+ lowerAllHands(requestingMemberId: string, roles: Array<string>): any;
310
311
  /**
311
312
  * Transfers the host to another member
312
313
  * @param {String} memberId
@@ -95,7 +95,8 @@ declare const MembersUtil: {
95
95
  * @returns {RoleAssignmentOptions}
96
96
  */
97
97
  generateRoleAssignmentMemberOptions: (memberId: string, roles: Array<ServerRoleShape>, locusUrl: string) => RoleAssignmentOptions;
98
- generateLowerAllHandsMemberOptions: (requestingParticipantId: any, locusUrl: any) => {
98
+ generateLowerAllHandsMemberOptions: (requestingParticipantId: any, locusUrl: any, roles: any) => {
99
+ roles: any;
99
100
  requestingParticipantId: any;
100
101
  locusUrl: any;
101
102
  };
@@ -145,6 +146,7 @@ declare const MembersUtil: {
145
146
  uri: string;
146
147
  body: {
147
148
  hand: {
149
+ roles: any;
148
150
  raised: boolean;
149
151
  };
150
152
  requestingParticipantId: any;
@@ -0,0 +1,70 @@
1
+ import EventsScope from '../common/events/events-scope';
2
+ /**
3
+ * Meeting - network quality event
4
+ * Emitted on each interval of retrieving stats Analyzer data
5
+ * @event network:quality
6
+ * @type {Object}
7
+ * @property {string} mediaType {video|audio}
8
+ * @property {number} networkQualityScore - value determined in determineUplinkNetworkQuality
9
+ * @memberof NetworkQualityMonitor
10
+ */
11
+ /**
12
+ * NetworkQualityMonitor class that will emit events based on detected quality
13
+ *
14
+ * @class NetworkQualityMonitor
15
+ * @extends {EventsScope}
16
+ */
17
+ export default class NetworkQualityMonitor extends EventsScope {
18
+ config: any;
19
+ frequencyTypes: any;
20
+ indicatorTypes: any;
21
+ mediaType: any;
22
+ networkQualityScore: any;
23
+ networkQualityStatus: any;
24
+ /**
25
+ * Creates a new instance of NetworkQualityMonitor
26
+ * @constructor
27
+ * @public
28
+ * @param {Object} config
29
+ * @property {Object} indicatorTypes - network properties used to evaluate network quality used as constants
30
+ * @property {Object} frequencyTypes - frequency properties used as constants {uplink|send} {downlink|receive}
31
+ * @property {number} networkQualityScore - 0|1 1 is acceptable 0 is bad/unknown
32
+ * @property {Object} networkQualityStatus - hash object based on indicatorTypes and frequencyTypes
33
+ * @property {string} mediaType - audio|video
34
+ */
35
+ constructor(config: any);
36
+ /**
37
+ * emits NETWORK_QUALITY event on meeting with payload of media type and uplinkNetworkQuality score
38
+ *
39
+ * @memberof NetworkQualityMonitor
40
+ * @returns {void}
41
+ */
42
+ emitNetworkQuality(): void;
43
+ /**
44
+ * invokes emitNetworkQuality method resets values back to default
45
+ * @returns {void}
46
+ * @memberof NetworkQualityMonitor
47
+ */
48
+ updateNetworkQualityStatus(): void;
49
+ /**
50
+ * filter data to determine uplink network quality, invoked on same interval as stats analyzer remote-inbout-rtp
51
+ * @param {Object} configObj
52
+ * @param {string} configObj.mediaType {audio|video}
53
+ * @param {RTCStats} configObj.remoteRtpResults RTC stats remote obj
54
+ * @param {Object} configObj.statsAnalyzerCurrentStats statsResults
55
+ * @returns {void}
56
+ * @public
57
+ * @memberof NetworkQualityMonitor
58
+ */
59
+ determineUplinkNetworkQuality({ mediaType, remoteRtpResults, statsAnalyzerCurrentStats, }: {
60
+ mediaType: string;
61
+ remoteRtpResults: any;
62
+ statsAnalyzerCurrentStats: object;
63
+ }): void;
64
+ /**
65
+ * Get the current status of network quaility object - networkQualityStatus
66
+ * @returns {Object}
67
+ * @public
68
+ */
69
+ get networkQualityStats(): any;
70
+ }
@@ -0,0 +1,4 @@
1
+ declare const RTC_METRICS: {
2
+ APP_ID: string;
3
+ };
4
+ export { RTC_METRICS as default };
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Rtc Metrics
3
+ */
4
+ export default class RtcMetrics {
5
+ /**
6
+ * Array of MetricData items to be sent to the metrics service.
7
+ */
8
+ metricsQueue: any[];
9
+ intervalId: number;
10
+ webex: any;
11
+ meetingId: string;
12
+ correlationId: string;
13
+ connectionId: string;
14
+ shouldSendMetricsOnNextStatsReport: boolean;
15
+ /**
16
+ * Initialize the interval.
17
+ *
18
+ * @param {object} webex - The main `webex` object.
19
+ * @param {string} meetingId - The meeting id.
20
+ * @param {string} correlationId - The correlation id.
21
+ */
22
+ constructor(webex: any, meetingId: any, correlationId: any);
23
+ /**
24
+ * Check to see if the metrics queue has any items.
25
+ *
26
+ * @returns {void}
27
+ */
28
+ sendMetricsInQueue(): void;
29
+ /**
30
+ * Forces sending metrics when we get the next stats-report
31
+ *
32
+ * This is useful for cases when something important happens that affects the media connection,
33
+ * for example when we move from lobby into the meeting.
34
+ *
35
+ * @returns {void}
36
+ */
37
+ sendNextMetrics(): void;
38
+ /**
39
+ * Add metrics items to the metrics queue.
40
+ *
41
+ * @param {object} data - An object with a payload array of metrics items.
42
+ *
43
+ * @returns {void}
44
+ */
45
+ addMetrics(data: any): void;
46
+ /**
47
+ * Clear the metrics interval.
48
+ *
49
+ * @returns {void}
50
+ */
51
+ closeMetrics(): void;
52
+ /**
53
+ * Anonymize IP addresses.
54
+ *
55
+ * @param {array} stats - An RTCStatsReport organized into an array of strings.
56
+ * @returns {string}
57
+ */
58
+ anonymizeIp(stats: string): string;
59
+ /**
60
+ * Set a new connection id.
61
+ *
62
+ * @returns {void}
63
+ */
64
+ private resetConnection;
65
+ /**
66
+ * Send metrics to the metrics service.
67
+ *
68
+ * @returns {void}
69
+ */
70
+ private sendMetrics;
71
+ }