@webex/plugin-meetings 3.6.0 → 3.7.0-next.2
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/README.md +2 -1
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/common/errors/webinar-registration-error.js +50 -0
- package/dist/common/errors/webinar-registration-error.js.map +1 -0
- package/dist/config.js +4 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +31 -2
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +1 -0
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +10 -3
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.js.map +1 -1
- package/dist/controls-options-manager/util.js +12 -0
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +28 -4
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +2 -1
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/index.js +61 -3
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/parser.js +5 -1
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +19 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +762 -528
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +2 -6
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/muteState.js +5 -2
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +21 -29
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +98 -61
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +68 -17
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meetings/index.js +25 -1
- package/dist/meetings/index.js.map +1 -1
- package/dist/members/index.js +3 -2
- package/dist/members/index.js.map +1 -1
- package/dist/members/util.js +9 -5
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +2 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/remoteMedia.js +4 -0
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/reachability/clusterReachability.js +0 -4
- package/dist/reachability/clusterReachability.js.map +1 -1
- package/dist/reachability/index.js +433 -136
- package/dist/reachability/index.js.map +1 -1
- package/dist/{rtcMetrics/constants.js → reachability/reachability.types.js} +1 -5
- package/dist/reachability/reachability.types.js.map +1 -0
- package/dist/reachability/request.js +23 -9
- package/dist/reachability/request.js.map +1 -1
- package/dist/roap/index.js +5 -7
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +45 -79
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +3 -6
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/{common/errors/parameter.d.ts → types/common/errors/webinar-registration-error.d.ts} +4 -5
- package/dist/types/config.d.ts +3 -0
- package/dist/types/constants.d.ts +25 -0
- package/dist/types/controls-options-manager/enums.d.ts +2 -1
- package/dist/types/controls-options-manager/index.d.ts +2 -1
- package/dist/types/controls-options-manager/types.d.ts +2 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/locus-info/index.d.ts +9 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +18 -0
- package/dist/types/meeting/index.d.ts +33 -3
- package/dist/types/meeting/locusMediaRequest.d.ts +2 -3
- package/dist/types/meeting/muteState.d.ts +2 -1
- package/dist/types/meeting/request.d.ts +2 -2
- package/dist/types/meeting/util.d.ts +2 -2
- package/dist/types/meeting-info/meeting-info-v2.d.ts +23 -0
- package/dist/types/meetings/index.d.ts +10 -1
- package/dist/types/members/index.d.ts +2 -1
- package/dist/types/members/util.d.ts +3 -1
- package/dist/types/metrics/constants.d.ts +1 -0
- package/dist/types/multistream/remoteMedia.d.ts +1 -0
- package/dist/types/reachability/clusterReachability.d.ts +1 -10
- package/dist/types/reachability/index.d.ts +74 -35
- package/dist/types/reachability/reachability.types.d.ts +64 -0
- package/dist/types/reachability/request.d.ts +5 -1
- package/dist/types/roap/request.d.ts +1 -13
- package/dist/webinar/index.js +32 -19
- package/dist/webinar/index.js.map +1 -1
- package/package.json +22 -22
- package/src/common/errors/webinar-registration-error.ts +27 -0
- package/src/config.ts +3 -0
- package/src/constants.ts +31 -0
- package/src/controls-options-manager/enums.ts +1 -0
- package/src/controls-options-manager/index.ts +19 -2
- package/src/controls-options-manager/types.ts +2 -0
- package/src/controls-options-manager/util.ts +12 -0
- package/src/index.ts +2 -0
- package/src/locus-info/controlsUtils.ts +46 -2
- package/src/locus-info/fullState.ts +1 -0
- package/src/locus-info/index.ts +60 -0
- package/src/locus-info/parser.ts +8 -1
- package/src/meeting/in-meeting-actions.ts +37 -0
- package/src/meeting/index.ts +219 -22
- package/src/meeting/locusMediaRequest.ts +4 -8
- package/src/meeting/muteState.ts +6 -2
- package/src/meeting/request.ts +4 -11
- package/src/meeting/util.ts +31 -6
- package/src/meeting-info/meeting-info-v2.ts +51 -0
- package/src/meetings/index.ts +68 -40
- package/src/members/index.ts +4 -2
- package/src/members/util.ts +3 -1
- package/src/metrics/constants.ts +1 -0
- package/src/multistream/remoteMedia.ts +5 -0
- package/src/reachability/clusterReachability.ts +1 -14
- package/src/reachability/index.ts +285 -77
- package/src/reachability/reachability.types.ts +85 -0
- package/src/reachability/request.ts +55 -30
- package/src/roap/index.ts +4 -5
- package/src/roap/request.ts +32 -44
- package/src/roap/turnDiscovery.ts +2 -4
- package/src/webinar/index.ts +31 -17
- package/test/unit/spec/controls-options-manager/index.js +56 -32
- package/test/unit/spec/controls-options-manager/util.js +44 -0
- package/test/unit/spec/locus-info/controlsUtils.js +80 -4
- package/test/unit/spec/locus-info/index.js +88 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +18 -0
- package/test/unit/spec/meeting/index.js +329 -82
- package/test/unit/spec/meeting/locusMediaRequest.ts +18 -11
- package/test/unit/spec/meeting/muteState.js +8 -4
- package/test/unit/spec/meeting/request.js +3 -26
- package/test/unit/spec/meeting/utils.js +71 -14
- package/test/unit/spec/meeting-info/meetinginfov2.js +37 -0
- package/test/unit/spec/meetings/index.js +32 -1
- package/test/unit/spec/members/index.js +25 -2
- package/test/unit/spec/members/request.js +37 -3
- package/test/unit/spec/members/utils.js +15 -1
- package/test/unit/spec/multistream/remoteMedia.ts +16 -2
- package/test/unit/spec/reachability/index.ts +265 -1
- package/test/unit/spec/reachability/request.js +56 -15
- package/test/unit/spec/roap/index.ts +1 -1
- package/test/unit/spec/roap/request.ts +51 -109
- package/test/unit/spec/roap/turnDiscovery.ts +202 -147
- package/test/unit/spec/webinar/index.ts +82 -16
- package/dist/annotation/annotation.types.d.ts +0 -42
- package/dist/annotation/constants.d.ts +0 -31
- package/dist/annotation/index.d.ts +0 -117
- package/dist/breakouts/breakout.d.ts +0 -8
- package/dist/breakouts/collection.d.ts +0 -5
- package/dist/breakouts/edit-lock-error.d.ts +0 -15
- package/dist/breakouts/events.d.ts +0 -8
- package/dist/breakouts/index.d.ts +0 -5
- package/dist/breakouts/request.d.ts +0 -22
- package/dist/breakouts/utils.d.ts +0 -15
- package/dist/common/browser-detection.d.ts +0 -9
- package/dist/common/collection.d.ts +0 -48
- package/dist/common/config.d.ts +0 -2
- package/dist/common/errors/captcha-error.d.ts +0 -15
- package/dist/common/errors/intent-to-join.d.ts +0 -16
- package/dist/common/errors/join-meeting.d.ts +0 -17
- package/dist/common/errors/media.d.ts +0 -15
- package/dist/common/errors/no-meeting-info.d.ts +0 -14
- package/dist/common/errors/password-error.d.ts +0 -15
- package/dist/common/errors/permission.d.ts +0 -14
- package/dist/common/errors/reclaim-host-role-error.js +0 -149
- package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
- package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
- package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
- package/dist/common/errors/reconnection-in-progress.js +0 -33
- package/dist/common/errors/reconnection-in-progress.js.map +0 -1
- package/dist/common/errors/reconnection.d.ts +0 -15
- package/dist/common/errors/stats.d.ts +0 -15
- package/dist/common/errors/webex-errors.d.ts +0 -93
- package/dist/common/errors/webex-meetings-error.d.ts +0 -20
- package/dist/common/events/events-scope.d.ts +0 -17
- package/dist/common/events/events.d.ts +0 -12
- package/dist/common/events/trigger-proxy.d.ts +0 -2
- package/dist/common/events/util.d.ts +0 -2
- package/dist/common/logs/logger-config.d.ts +0 -2
- package/dist/common/logs/logger-proxy.d.ts +0 -2
- package/dist/common/logs/request.d.ts +0 -36
- package/dist/common/queue.d.ts +0 -34
- package/dist/config.d.ts +0 -72
- package/dist/constants.d.ts +0 -1088
- package/dist/controls-options-manager/constants.d.ts +0 -4
- package/dist/controls-options-manager/enums.d.ts +0 -15
- package/dist/controls-options-manager/index.d.ts +0 -136
- package/dist/controls-options-manager/types.d.ts +0 -43
- package/dist/controls-options-manager/util.d.ts +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/interceptors/index.d.ts +0 -2
- package/dist/interceptors/locusRetry.d.ts +0 -27
- package/dist/interpretation/collection.d.ts +0 -5
- package/dist/interpretation/index.d.ts +0 -5
- package/dist/interpretation/siLanguage.d.ts +0 -5
- package/dist/locus-info/controlsUtils.d.ts +0 -2
- package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
- package/dist/locus-info/fullState.d.ts +0 -2
- package/dist/locus-info/hostUtils.d.ts +0 -2
- package/dist/locus-info/index.d.ts +0 -322
- package/dist/locus-info/infoUtils.d.ts +0 -2
- package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
- package/dist/locus-info/parser.d.ts +0 -272
- package/dist/locus-info/selfUtils.d.ts +0 -2
- package/dist/media/index.d.ts +0 -34
- package/dist/media/properties.d.ts +0 -93
- package/dist/media/util.d.ts +0 -2
- package/dist/mediaQualityMetrics/config.d.ts +0 -241
- package/dist/mediaQualityMetrics/config.js +0 -502
- package/dist/mediaQualityMetrics/config.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -260
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/meeting/in-meeting-actions.d.ts +0 -167
- package/dist/meeting/index.d.ts +0 -1825
- package/dist/meeting/locusMediaRequest.d.ts +0 -74
- package/dist/meeting/muteState.d.ts +0 -178
- package/dist/meeting/request.d.ts +0 -295
- package/dist/meeting/request.type.d.ts +0 -11
- package/dist/meeting/state.d.ts +0 -9
- package/dist/meeting/util.d.ts +0 -119
- package/dist/meeting/voicea-meeting.d.ts +0 -16
- package/dist/meeting-info/collection.d.ts +0 -20
- package/dist/meeting-info/index.d.ts +0 -69
- package/dist/meeting-info/meeting-info-v2.d.ts +0 -123
- package/dist/meeting-info/request.d.ts +0 -22
- package/dist/meeting-info/util.d.ts +0 -2
- package/dist/meeting-info/utilv2.d.ts +0 -2
- package/dist/meetings/collection.d.ts +0 -40
- package/dist/meetings/index.d.ts +0 -390
- package/dist/meetings/meetings.types.d.ts +0 -4
- package/dist/meetings/request.d.ts +0 -27
- package/dist/meetings/util.d.ts +0 -18
- package/dist/member/index.d.ts +0 -160
- package/dist/member/member.types.js +0 -17
- package/dist/member/member.types.js.map +0 -1
- package/dist/member/types.d.ts +0 -32
- package/dist/member/util.d.ts +0 -2
- package/dist/members/collection.d.ts +0 -29
- package/dist/members/index.d.ts +0 -353
- package/dist/members/request.d.ts +0 -114
- package/dist/members/types.d.ts +0 -25
- package/dist/members/util.d.ts +0 -215
- package/dist/metrics/config.js +0 -276
- package/dist/metrics/config.js.map +0 -1
- package/dist/metrics/constants.d.ts +0 -70
- package/dist/metrics/index.d.ts +0 -45
- package/dist/multistream/mediaRequestManager.d.ts +0 -119
- package/dist/multistream/receiveSlot.d.ts +0 -68
- package/dist/multistream/receiveSlotManager.d.ts +0 -56
- package/dist/multistream/remoteMedia.d.ts +0 -72
- package/dist/multistream/remoteMediaGroup.d.ts +0 -49
- package/dist/multistream/remoteMediaManager.d.ts +0 -300
- package/dist/multistream/sendSlotManager.d.ts +0 -69
- package/dist/networkQualityMonitor/index.d.ts +0 -70
- package/dist/networkQualityMonitor/index.js +0 -221
- package/dist/networkQualityMonitor/index.js.map +0 -1
- package/dist/peer-connection-manager/index.js +0 -671
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/peer-connection-manager/util.js +0 -109
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/dist/personal-meeting-room/index.d.ts +0 -47
- package/dist/personal-meeting-room/request.d.ts +0 -14
- package/dist/personal-meeting-room/util.d.ts +0 -2
- package/dist/reachability/clusterReachability.d.ts +0 -109
- package/dist/reachability/index.d.ts +0 -105
- package/dist/reachability/request.d.ts +0 -39
- package/dist/reachability/util.d.ts +0 -8
- package/dist/reactions/constants.d.ts +0 -3
- package/dist/reactions/reactions.d.ts +0 -4
- package/dist/reactions/reactions.type.d.ts +0 -52
- package/dist/reconnection-manager/index.d.ts +0 -136
- package/dist/recording-controller/enums.d.ts +0 -7
- package/dist/recording-controller/index.d.ts +0 -207
- package/dist/recording-controller/util.d.ts +0 -14
- package/dist/roap/collection.js +0 -62
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.js +0 -275
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/index.d.ts +0 -86
- package/dist/roap/request.d.ts +0 -39
- package/dist/roap/state.js +0 -126
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/turnDiscovery.d.ts +0 -155
- package/dist/roap/util.js +0 -75
- package/dist/roap/util.js.map +0 -1
- package/dist/rtcMetrics/constants.d.ts +0 -4
- package/dist/rtcMetrics/constants.js.map +0 -1
- package/dist/rtcMetrics/index.d.ts +0 -61
- package/dist/rtcMetrics/index.js +0 -197
- package/dist/rtcMetrics/index.js.map +0 -1
- package/dist/statsAnalyzer/global.d.ts +0 -36
- package/dist/statsAnalyzer/global.js +0 -126
- package/dist/statsAnalyzer/global.js.map +0 -1
- package/dist/statsAnalyzer/index.d.ts +0 -217
- package/dist/statsAnalyzer/index.js +0 -1013
- package/dist/statsAnalyzer/index.js.map +0 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +0 -48
- package/dist/statsAnalyzer/mqaUtil.js +0 -179
- package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
- package/dist/transcription/index.d.ts +0 -64
- package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
- package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
- package/dist/types/networkQualityMonitor/index.d.ts +0 -70
- package/dist/types/rtcMetrics/constants.d.ts +0 -4
- package/dist/types/rtcMetrics/index.d.ts +0 -71
- package/dist/types/statsAnalyzer/global.d.ts +0 -36
- package/dist/types/statsAnalyzer/index.d.ts +0 -217
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
- package/dist/webinar/collection.d.ts +0 -16
- package/dist/webinar/index.d.ts +0 -5
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import {MEETINGS} from '../constants';
|
|
6
|
+
import ControlsOptionsUtil from '../controls-options-manager/util';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* IInMeetingActions
|
|
@@ -64,6 +65,10 @@ interface IInMeetingActions {
|
|
|
64
65
|
canUpdateShareControl?: boolean;
|
|
65
66
|
canEnableViewTheParticipantsList?: boolean;
|
|
66
67
|
canDisableViewTheParticipantsList?: boolean;
|
|
68
|
+
canEnableViewTheParticipantsListPanelist?: boolean;
|
|
69
|
+
canDisableViewTheParticipantsListPanelist?: boolean;
|
|
70
|
+
canEnableShowAttendeeCount?: boolean;
|
|
71
|
+
canDisableShowAttendeeCount?: boolean;
|
|
67
72
|
canEnableRaiseHand?: boolean;
|
|
68
73
|
canDisableRaiseHand?: boolean;
|
|
69
74
|
canEnableVideo?: boolean;
|
|
@@ -83,6 +88,11 @@ interface IInMeetingActions {
|
|
|
83
88
|
canShareWhiteBoard?: boolean;
|
|
84
89
|
enforceVirtualBackground?: boolean;
|
|
85
90
|
canPollingAndQA?: boolean;
|
|
91
|
+
canStartWebcast?: boolean;
|
|
92
|
+
canStopWebcast?: boolean;
|
|
93
|
+
canShowStageView?: boolean;
|
|
94
|
+
canEnableStageView?: boolean;
|
|
95
|
+
canDisableStageView?: boolean;
|
|
86
96
|
}
|
|
87
97
|
|
|
88
98
|
/**
|
|
@@ -201,6 +211,14 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
201
211
|
|
|
202
212
|
canDisableViewTheParticipantsList = null;
|
|
203
213
|
|
|
214
|
+
canEnableViewTheParticipantsListPanelist = null;
|
|
215
|
+
|
|
216
|
+
canDisableViewTheParticipantsListPanelist = null;
|
|
217
|
+
|
|
218
|
+
canEnableShowAttendeeCount = null;
|
|
219
|
+
|
|
220
|
+
canDisableShowAttendeeCount = null;
|
|
221
|
+
|
|
204
222
|
canEnableRaiseHand = null;
|
|
205
223
|
|
|
206
224
|
canDisableRaiseHand = null;
|
|
@@ -238,6 +256,16 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
238
256
|
canShareWhiteBoard = null;
|
|
239
257
|
|
|
240
258
|
canPollingAndQA = null;
|
|
259
|
+
|
|
260
|
+
canStartWebcast = null;
|
|
261
|
+
|
|
262
|
+
canStopWebcast = null;
|
|
263
|
+
|
|
264
|
+
canShowStageView = null;
|
|
265
|
+
|
|
266
|
+
canEnableStageView = null;
|
|
267
|
+
|
|
268
|
+
canDisableStageView = null;
|
|
241
269
|
/**
|
|
242
270
|
* Returns all meeting action options
|
|
243
271
|
* @returns {Object}
|
|
@@ -298,6 +326,10 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
298
326
|
canUpdateShareControl: this.canUpdateShareControl,
|
|
299
327
|
canEnableViewTheParticipantsList: this.canEnableViewTheParticipantsList,
|
|
300
328
|
canDisableViewTheParticipantsList: this.canDisableViewTheParticipantsList,
|
|
329
|
+
canEnableViewTheParticipantsListPanelist: this.canEnableViewTheParticipantsListPanelist,
|
|
330
|
+
canDisableViewTheParticipantsListPanelist: this.canDisableViewTheParticipantsListPanelist,
|
|
331
|
+
canEnableShowAttendeeCount: this.canEnableShowAttendeeCount,
|
|
332
|
+
canDisableShowAttendeeCount: this.canDisableShowAttendeeCount,
|
|
301
333
|
canEnableRaiseHand: this.canEnableRaiseHand,
|
|
302
334
|
canDisableRaiseHand: this.canDisableRaiseHand,
|
|
303
335
|
canEnableVideo: this.canEnableVideo,
|
|
@@ -317,6 +349,11 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
317
349
|
supportHDV: this.supportHDV,
|
|
318
350
|
canShareWhiteBoard: this.canShareWhiteBoard,
|
|
319
351
|
canPollingAndQA: this.canPollingAndQA,
|
|
352
|
+
canStartWebcast: this.canStartWebcast,
|
|
353
|
+
canStopWebcast: this.canStopWebcast,
|
|
354
|
+
canShowStageView: this.canShowStageView,
|
|
355
|
+
canEnableStageView: this.canEnableStageView,
|
|
356
|
+
canDisableStageView: this.canDisableStageView,
|
|
320
357
|
});
|
|
321
358
|
|
|
322
359
|
/**
|
package/src/meeting/index.ts
CHANGED
|
@@ -5,6 +5,7 @@ import jwtDecode from 'jwt-decode';
|
|
|
5
5
|
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
6
6
|
// @ts-ignore - Types not available for @webex/common
|
|
7
7
|
import {Defer} from '@webex/common';
|
|
8
|
+
import {safeSetTimeout, safeSetInterval} from '@webex/common-timers';
|
|
8
9
|
import {
|
|
9
10
|
ClientEvent,
|
|
10
11
|
ClientEventLeaveReason,
|
|
@@ -128,6 +129,7 @@ import {
|
|
|
128
129
|
MeetingInfoV2PasswordError,
|
|
129
130
|
MeetingInfoV2CaptchaError,
|
|
130
131
|
MeetingInfoV2PolicyError,
|
|
132
|
+
MeetingInfoV2WebinarRegistrationError,
|
|
131
133
|
} from '../meeting-info/meeting-info-v2';
|
|
132
134
|
import {CSI, ReceiveSlotManager} from '../multistream/receiveSlotManager';
|
|
133
135
|
import SendSlotManager from '../multistream/sendSlotManager';
|
|
@@ -156,6 +158,7 @@ import ControlsOptionsManager from '../controls-options-manager';
|
|
|
156
158
|
import PermissionError from '../common/errors/permission';
|
|
157
159
|
import {LocusMediaRequest} from './locusMediaRequest';
|
|
158
160
|
import {ConnectionStateHandler, ConnectionStateEvent} from './connectionStateHandler';
|
|
161
|
+
import WebinarRegistrationError from '../common/errors/webinar-registration-error';
|
|
159
162
|
|
|
160
163
|
// default callback so we don't call an undefined function, but in practice it should never be used
|
|
161
164
|
const DEFAULT_ICE_PHASE_CALLBACK = () => 'JOIN_MEETING_FINAL';
|
|
@@ -700,6 +703,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
700
703
|
private iceCandidateErrors: Map<string, number>;
|
|
701
704
|
private iceCandidatesCount: number;
|
|
702
705
|
private rtcMetrics?: RtcMetrics;
|
|
706
|
+
private uploadLogsTimer?: ReturnType<typeof setTimeout>;
|
|
707
|
+
private logUploadIntervalIndex: number;
|
|
703
708
|
|
|
704
709
|
/**
|
|
705
710
|
* @param {Object} attrs
|
|
@@ -768,6 +773,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
768
773
|
);
|
|
769
774
|
this.callStateForMetrics.correlationId = this.id;
|
|
770
775
|
}
|
|
776
|
+
this.logUploadIntervalIndex = 0;
|
|
777
|
+
|
|
771
778
|
/**
|
|
772
779
|
* @instance
|
|
773
780
|
* @type {String}
|
|
@@ -1759,8 +1766,16 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1759
1766
|
if (err.meetingInfo) {
|
|
1760
1767
|
this.meetingInfo = err.meetingInfo;
|
|
1761
1768
|
}
|
|
1762
|
-
|
|
1763
1769
|
throw new PermissionError();
|
|
1770
|
+
} else if (err instanceof MeetingInfoV2WebinarRegistrationError) {
|
|
1771
|
+
this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.WEBINAR_REGISTRATION;
|
|
1772
|
+
this.meetingInfoFailureCode = err.wbxAppApiCode;
|
|
1773
|
+
|
|
1774
|
+
if (err.meetingInfo) {
|
|
1775
|
+
this.meetingInfo = err.meetingInfo;
|
|
1776
|
+
}
|
|
1777
|
+
|
|
1778
|
+
throw new WebinarRegistrationError();
|
|
1764
1779
|
} else if (err instanceof MeetingInfoV2PasswordError) {
|
|
1765
1780
|
LoggerProxy.logger.info(
|
|
1766
1781
|
// @ts-ignore
|
|
@@ -2004,6 +2019,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2004
2019
|
this.setUpLocusInfoSelfListener();
|
|
2005
2020
|
this.setUpLocusInfoMeetingListener();
|
|
2006
2021
|
this.setUpLocusServicesListener();
|
|
2022
|
+
this.setUpLocusResourcesListener();
|
|
2007
2023
|
// members update listeners
|
|
2008
2024
|
this.setUpLocusFullStateListener();
|
|
2009
2025
|
this.setUpLocusUrlListener();
|
|
@@ -2625,6 +2641,42 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2625
2641
|
);
|
|
2626
2642
|
});
|
|
2627
2643
|
|
|
2644
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_WEBCAST_CHANGED, ({state}) => {
|
|
2645
|
+
Trigger.trigger(
|
|
2646
|
+
this,
|
|
2647
|
+
{file: 'meeting/index', function: 'setupLocusControlsListener'},
|
|
2648
|
+
EVENT_TRIGGERS.MEETING_CONTROLS_WEBCAST_UPDATED,
|
|
2649
|
+
{state}
|
|
2650
|
+
);
|
|
2651
|
+
});
|
|
2652
|
+
|
|
2653
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_MEETING_FULL_CHANGED, ({state}) => {
|
|
2654
|
+
Trigger.trigger(
|
|
2655
|
+
this,
|
|
2656
|
+
{file: 'meeting/index', function: 'setupLocusControlsListener'},
|
|
2657
|
+
EVENT_TRIGGERS.MEETING_CONTROLS_MEETING_FULL_UPDATED,
|
|
2658
|
+
{state}
|
|
2659
|
+
);
|
|
2660
|
+
});
|
|
2661
|
+
|
|
2662
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_PRACTICE_SESSION_STATUS_UPDATED, ({state}) => {
|
|
2663
|
+
Trigger.trigger(
|
|
2664
|
+
this,
|
|
2665
|
+
{file: 'meeting/index', function: 'setupLocusControlsListener'},
|
|
2666
|
+
EVENT_TRIGGERS.MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED,
|
|
2667
|
+
{state}
|
|
2668
|
+
);
|
|
2669
|
+
});
|
|
2670
|
+
|
|
2671
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_STAGE_VIEW_UPDATED, ({state}) => {
|
|
2672
|
+
Trigger.trigger(
|
|
2673
|
+
this,
|
|
2674
|
+
{file: 'meeting/index', function: 'setupLocusControlsListener'},
|
|
2675
|
+
EVENT_TRIGGERS.MEETING_CONTROLS_STAGE_VIEW_UPDATED,
|
|
2676
|
+
{state}
|
|
2677
|
+
);
|
|
2678
|
+
});
|
|
2679
|
+
|
|
2628
2680
|
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED, ({state}) => {
|
|
2629
2681
|
Trigger.trigger(
|
|
2630
2682
|
this,
|
|
@@ -2739,6 +2791,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2739
2791
|
newShareStatus = SHARE_STATUS.NO_SHARE;
|
|
2740
2792
|
}
|
|
2741
2793
|
|
|
2794
|
+
LoggerProxy.logger.info(
|
|
2795
|
+
`Meeting:index#setUpLocusInfoMediaInactiveListener --> this.shareStatus=${this.shareStatus} newShareStatus=${newShareStatus}`
|
|
2796
|
+
);
|
|
2742
2797
|
if (newShareStatus !== this.shareStatus) {
|
|
2743
2798
|
const oldShareStatus = this.shareStatus;
|
|
2744
2799
|
|
|
@@ -2983,10 +3038,20 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2983
3038
|
this.breakouts.breakoutServiceUrlUpdate(payload?.services?.breakout?.url);
|
|
2984
3039
|
this.annotation.approvalUrlUpdate(payload?.services?.approval?.url);
|
|
2985
3040
|
this.simultaneousInterpretation.approvalUrlUpdate(payload?.services?.approval?.url);
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
3041
|
+
});
|
|
3042
|
+
}
|
|
3043
|
+
|
|
3044
|
+
/**
|
|
3045
|
+
* Set up the locus info resources link listener
|
|
3046
|
+
* update the locusInfo for webcast instance url
|
|
3047
|
+
* @param {Object} payload - The event payload
|
|
3048
|
+
* @returns {undefined}
|
|
3049
|
+
* @private
|
|
3050
|
+
* @memberof Meeting
|
|
3051
|
+
*/
|
|
3052
|
+
private setUpLocusResourcesListener() {
|
|
3053
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.LINKS_RESOURCES, (payload) => {
|
|
3054
|
+
this.webinar.updateWebcastUrl(payload);
|
|
2990
3055
|
});
|
|
2991
3056
|
}
|
|
2992
3057
|
|
|
@@ -3091,7 +3156,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3091
3156
|
private setUpLocusInfoSelfListener() {
|
|
3092
3157
|
this.locusInfo.on(LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED, (payload) => {
|
|
3093
3158
|
if (this.audio) {
|
|
3094
|
-
this.audio.handleServerLocalUnmuteRequired(this);
|
|
3159
|
+
this.audio.handleServerLocalUnmuteRequired(this, payload.unmuteAllowed);
|
|
3095
3160
|
Trigger.trigger(
|
|
3096
3161
|
this,
|
|
3097
3162
|
{
|
|
@@ -3298,7 +3363,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3298
3363
|
this.simultaneousInterpretation.updateCanManageInterpreters(
|
|
3299
3364
|
payload.newRoles?.includes(SELF_ROLES.MODERATOR)
|
|
3300
3365
|
);
|
|
3301
|
-
this.webinar.
|
|
3366
|
+
this.webinar.updateRoleChanged(payload);
|
|
3302
3367
|
Trigger.trigger(
|
|
3303
3368
|
this,
|
|
3304
3369
|
{
|
|
@@ -3792,6 +3857,22 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3792
3857
|
requiredHints: [DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST],
|
|
3793
3858
|
displayHints: this.userDisplayHints,
|
|
3794
3859
|
}),
|
|
3860
|
+
canEnableViewTheParticipantsListPanelist: ControlsOptionsUtil.hasHints({
|
|
3861
|
+
requiredHints: [DISPLAY_HINTS.ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST],
|
|
3862
|
+
displayHints: this.userDisplayHints,
|
|
3863
|
+
}),
|
|
3864
|
+
canDisableViewTheParticipantsListPanelist: ControlsOptionsUtil.hasHints({
|
|
3865
|
+
requiredHints: [DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST],
|
|
3866
|
+
displayHints: this.userDisplayHints,
|
|
3867
|
+
}),
|
|
3868
|
+
canEnableShowAttendeeCount: ControlsOptionsUtil.hasHints({
|
|
3869
|
+
requiredHints: [DISPLAY_HINTS.ENABLE_SHOW_ATTENDEE_COUNT],
|
|
3870
|
+
displayHints: this.userDisplayHints,
|
|
3871
|
+
}),
|
|
3872
|
+
canDisableShowAttendeeCount: ControlsOptionsUtil.hasHints({
|
|
3873
|
+
requiredHints: [DISPLAY_HINTS.DISABLE_SHOW_ATTENDEE_COUNT],
|
|
3874
|
+
displayHints: this.userDisplayHints,
|
|
3875
|
+
}),
|
|
3795
3876
|
canEnableRaiseHand: ControlsOptionsUtil.hasHints({
|
|
3796
3877
|
requiredHints: [DISPLAY_HINTS.ENABLE_RAISE_HAND],
|
|
3797
3878
|
displayHints: this.userDisplayHints,
|
|
@@ -3808,6 +3889,26 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3808
3889
|
requiredHints: [DISPLAY_HINTS.DISABLE_VIDEO],
|
|
3809
3890
|
displayHints: this.userDisplayHints,
|
|
3810
3891
|
}),
|
|
3892
|
+
canStartWebcast: ControlsOptionsUtil.hasHints({
|
|
3893
|
+
requiredHints: [DISPLAY_HINTS.WEBCAST_CONTROL_START],
|
|
3894
|
+
displayHints: this.userDisplayHints,
|
|
3895
|
+
}),
|
|
3896
|
+
canStopWebcast: ControlsOptionsUtil.hasHints({
|
|
3897
|
+
requiredHints: [DISPLAY_HINTS.WEBCAST_CONTROL_STOP],
|
|
3898
|
+
displayHints: this.userDisplayHints,
|
|
3899
|
+
}),
|
|
3900
|
+
canShowStageView: ControlsOptionsUtil.hasHints({
|
|
3901
|
+
requiredHints: [DISPLAY_HINTS.STAGE_VIEW_ACTIVE],
|
|
3902
|
+
displayHints: this.userDisplayHints,
|
|
3903
|
+
}),
|
|
3904
|
+
canEnableStageView: ControlsOptionsUtil.hasHints({
|
|
3905
|
+
requiredHints: [DISPLAY_HINTS.ENABLE_STAGE_VIEW],
|
|
3906
|
+
displayHints: this.userDisplayHints,
|
|
3907
|
+
}),
|
|
3908
|
+
canDisableStageView: ControlsOptionsUtil.hasHints({
|
|
3909
|
+
requiredHints: [DISPLAY_HINTS.DISABLE_STAGE_VIEW],
|
|
3910
|
+
displayHints: this.userDisplayHints,
|
|
3911
|
+
}),
|
|
3811
3912
|
canShareFile:
|
|
3812
3913
|
(ControlsOptionsUtil.hasHints({
|
|
3813
3914
|
requiredHints: [DISPLAY_HINTS.SHARE_FILE],
|
|
@@ -3964,6 +4065,65 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3964
4065
|
Trigger.trigger(this, options, EVENTS.REQUEST_UPLOAD_LOGS, this);
|
|
3965
4066
|
}
|
|
3966
4067
|
|
|
4068
|
+
/**
|
|
4069
|
+
* sets the timer for periodic log upload
|
|
4070
|
+
* @returns {void}
|
|
4071
|
+
*/
|
|
4072
|
+
private setLogUploadTimer() {
|
|
4073
|
+
// start with short timeouts and increase them later on so in case users have very long multi-hour meetings we don't get too fragmented logs
|
|
4074
|
+
const LOG_UPLOAD_INTERVALS = [0.1, 1, 15, 15, 30, 30, 30, 60];
|
|
4075
|
+
|
|
4076
|
+
const delay =
|
|
4077
|
+
1000 *
|
|
4078
|
+
// @ts-ignore - config coming from registerPlugin
|
|
4079
|
+
this.config.logUploadIntervalMultiplicationFactor *
|
|
4080
|
+
LOG_UPLOAD_INTERVALS[this.logUploadIntervalIndex];
|
|
4081
|
+
|
|
4082
|
+
if (this.logUploadIntervalIndex < LOG_UPLOAD_INTERVALS.length - 1) {
|
|
4083
|
+
this.logUploadIntervalIndex += 1;
|
|
4084
|
+
}
|
|
4085
|
+
|
|
4086
|
+
this.uploadLogsTimer = safeSetTimeout(() => {
|
|
4087
|
+
this.uploadLogsTimer = undefined;
|
|
4088
|
+
|
|
4089
|
+
this.uploadLogs();
|
|
4090
|
+
|
|
4091
|
+
// just as an extra precaution, to avoid uploading logs forever in case something goes wrong
|
|
4092
|
+
// and the page remains opened, we stop it if there is no media connection
|
|
4093
|
+
if (!this.mediaProperties.webrtcMediaConnection) {
|
|
4094
|
+
return;
|
|
4095
|
+
}
|
|
4096
|
+
|
|
4097
|
+
this.setLogUploadTimer();
|
|
4098
|
+
}, delay);
|
|
4099
|
+
}
|
|
4100
|
+
|
|
4101
|
+
/**
|
|
4102
|
+
* Starts a periodic upload of logs
|
|
4103
|
+
*
|
|
4104
|
+
* @returns {undefined}
|
|
4105
|
+
*/
|
|
4106
|
+
public startPeriodicLogUpload() {
|
|
4107
|
+
// @ts-ignore - config coming from registerPlugin
|
|
4108
|
+
if (this.config.logUploadIntervalMultiplicationFactor && !this.uploadLogsTimer) {
|
|
4109
|
+
this.logUploadIntervalIndex = 0;
|
|
4110
|
+
|
|
4111
|
+
this.setLogUploadTimer();
|
|
4112
|
+
}
|
|
4113
|
+
}
|
|
4114
|
+
|
|
4115
|
+
/**
|
|
4116
|
+
* Stops the periodic upload of logs
|
|
4117
|
+
*
|
|
4118
|
+
* @returns {undefined}
|
|
4119
|
+
*/
|
|
4120
|
+
public stopPeriodicLogUpload() {
|
|
4121
|
+
if (this.uploadLogsTimer) {
|
|
4122
|
+
clearTimeout(this.uploadLogsTimer);
|
|
4123
|
+
this.uploadLogsTimer = undefined;
|
|
4124
|
+
}
|
|
4125
|
+
}
|
|
4126
|
+
|
|
3967
4127
|
/**
|
|
3968
4128
|
* Removes remote audio, video and share streams from class instance's mediaProperties
|
|
3969
4129
|
* @returns {undefined}
|
|
@@ -4675,8 +4835,6 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4675
4835
|
if (!joinResponse) {
|
|
4676
4836
|
// This is the 1st attempt or a retry after join request failed -> we need to do a join with TURN discovery
|
|
4677
4837
|
|
|
4678
|
-
// @ts-ignore
|
|
4679
|
-
joinOptions.reachability = await this.webex.meetings.reachability.getReachabilityResults();
|
|
4680
4838
|
const turnDiscoveryRequest = await this.roap.generateTurnDiscoveryRequestMessage(
|
|
4681
4839
|
this,
|
|
4682
4840
|
true
|
|
@@ -4808,6 +4966,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4808
4966
|
);
|
|
4809
4967
|
}
|
|
4810
4968
|
|
|
4969
|
+
this.cleanUpBeforeReconnection();
|
|
4970
|
+
|
|
4811
4971
|
return this.reconnectionManager
|
|
4812
4972
|
.reconnect(options, async () => {
|
|
4813
4973
|
await this.waitForRemoteSDPAnswer();
|
|
@@ -6225,7 +6385,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6225
6385
|
this.mediaProperties.webrtcMediaConnection.on(
|
|
6226
6386
|
MediaConnectionEventNames.ICE_CANDIDATE,
|
|
6227
6387
|
(event) => {
|
|
6228
|
-
if (event.candidate) {
|
|
6388
|
+
if (event.candidate && event.candidate.candidate && event.candidate.candidate.length > 0) {
|
|
6229
6389
|
this.iceCandidatesCount += 1;
|
|
6230
6390
|
}
|
|
6231
6391
|
}
|
|
@@ -6936,6 +7096,23 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6936
7096
|
}
|
|
6937
7097
|
}
|
|
6938
7098
|
|
|
7099
|
+
private async cleanUpBeforeReconnection(): Promise<void> {
|
|
7100
|
+
try {
|
|
7101
|
+
// when media fails, we want to upload a webrtc dump to see whats going on
|
|
7102
|
+
// this function is async, but returns once the stats have been gathered
|
|
7103
|
+
await this.forceSendStatsReport({callFrom: 'cleanUpBeforeReconnection'});
|
|
7104
|
+
|
|
7105
|
+
if (this.statsAnalyzer) {
|
|
7106
|
+
await this.statsAnalyzer.stopAnalyzer();
|
|
7107
|
+
}
|
|
7108
|
+
} catch (error) {
|
|
7109
|
+
LoggerProxy.logger.error(
|
|
7110
|
+
'Meeting:index#cleanUpBeforeReconnection --> Error during cleanup: ',
|
|
7111
|
+
error
|
|
7112
|
+
);
|
|
7113
|
+
}
|
|
7114
|
+
}
|
|
7115
|
+
|
|
6939
7116
|
/**
|
|
6940
7117
|
* Creates an instance of LocusMediaRequest for this meeting - it is needed for doing any calls
|
|
6941
7118
|
* to Locus /media API (these are used for sending Roap messages and updating audio/video mute status).
|
|
@@ -7027,7 +7204,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
7027
7204
|
shareAudioEnabled = true,
|
|
7028
7205
|
shareVideoEnabled = true,
|
|
7029
7206
|
remoteMediaManagerConfig,
|
|
7030
|
-
bundlePolicy,
|
|
7207
|
+
bundlePolicy = 'max-bundle',
|
|
7031
7208
|
} = options;
|
|
7032
7209
|
|
|
7033
7210
|
this.allowMediaInLobby = options?.allowMediaInLobby;
|
|
@@ -7132,6 +7309,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
7132
7309
|
|
|
7133
7310
|
// We can log ReceiveSlot SSRCs only after the SDP exchange, so doing it here:
|
|
7134
7311
|
this.remoteMediaManager?.logAllReceiveSlots();
|
|
7312
|
+
this.startPeriodicLogUpload();
|
|
7135
7313
|
} catch (error) {
|
|
7136
7314
|
LoggerProxy.logger.error(`${LOG_HEADER} failed to establish media connection: `, error);
|
|
7137
7315
|
|
|
@@ -7914,18 +8092,21 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
7914
8092
|
* @param {boolean} mutedEnabled
|
|
7915
8093
|
* @param {boolean} disallowUnmuteEnabled
|
|
7916
8094
|
* @param {boolean} muteOnEntryEnabled
|
|
8095
|
+
* @param {array} roles
|
|
7917
8096
|
* @public
|
|
7918
8097
|
* @memberof Meeting
|
|
7919
8098
|
*/
|
|
7920
8099
|
public setMuteAll(
|
|
7921
8100
|
mutedEnabled: boolean,
|
|
7922
8101
|
disallowUnmuteEnabled: boolean,
|
|
7923
|
-
muteOnEntryEnabled: boolean
|
|
8102
|
+
muteOnEntryEnabled: boolean,
|
|
8103
|
+
roles: Array<string>
|
|
7924
8104
|
) {
|
|
7925
8105
|
return this.controlsOptionsManager.setMuteAll(
|
|
7926
8106
|
mutedEnabled,
|
|
7927
8107
|
disallowUnmuteEnabled,
|
|
7928
|
-
muteOnEntryEnabled
|
|
8108
|
+
muteOnEntryEnabled,
|
|
8109
|
+
roles
|
|
7929
8110
|
);
|
|
7930
8111
|
}
|
|
7931
8112
|
|
|
@@ -8182,6 +8363,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8182
8363
|
* @returns {undefined}
|
|
8183
8364
|
*/
|
|
8184
8365
|
private handleShareAudioStreamEnded = async () => {
|
|
8366
|
+
LoggerProxy.logger.info(
|
|
8367
|
+
`Meeting:index#handleShareAudioStreamEnded --> audio share stream ended`
|
|
8368
|
+
);
|
|
8185
8369
|
// current share audio stream has ended, but there might be an active
|
|
8186
8370
|
// share video stream. we only leave from wireless share if share has
|
|
8187
8371
|
// completely ended, which means no share audio or video streams active
|
|
@@ -8224,6 +8408,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8224
8408
|
* @returns {undefined}
|
|
8225
8409
|
*/
|
|
8226
8410
|
private handleShareVideoStreamEnded = async () => {
|
|
8411
|
+
LoggerProxy.logger.info(
|
|
8412
|
+
`Meeting:index#handleShareVideoStreamEnded --> video share stream ended`
|
|
8413
|
+
);
|
|
8227
8414
|
// current share video stream has ended, but there might be an active
|
|
8228
8415
|
// share audio stream. we only leave from wireless share if share has
|
|
8229
8416
|
// completely ended, which means no share audio or video streams active
|
|
@@ -8712,6 +8899,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8712
8899
|
* @returns {Promise}
|
|
8713
8900
|
*/
|
|
8714
8901
|
async publishStreams(streams: LocalStreams): Promise<void> {
|
|
8902
|
+
LoggerProxy.logger.info(
|
|
8903
|
+
`Meeting:index#publishStreams --> called with: ${JSON.stringify(streams)}`
|
|
8904
|
+
);
|
|
8715
8905
|
this.checkMediaConnection();
|
|
8716
8906
|
if (
|
|
8717
8907
|
!streams.microphone &&
|
|
@@ -8723,15 +8913,19 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8723
8913
|
return;
|
|
8724
8914
|
}
|
|
8725
8915
|
|
|
8726
|
-
|
|
8727
|
-
streams?.microphone
|
|
8728
|
-
streams?.camera
|
|
8729
|
-
streams?.screenShare?.audio
|
|
8730
|
-
streams?.screenShare?.video
|
|
8731
|
-
|
|
8732
|
-
|
|
8733
|
-
|
|
8734
|
-
)
|
|
8916
|
+
const streamChecks = [
|
|
8917
|
+
{stream: streams?.microphone, name: 'microphone'},
|
|
8918
|
+
{stream: streams?.camera, name: 'camera'},
|
|
8919
|
+
{stream: streams?.screenShare?.audio, name: 'screenShare audio'},
|
|
8920
|
+
{stream: streams?.screenShare?.video, name: 'screenShare video'},
|
|
8921
|
+
];
|
|
8922
|
+
|
|
8923
|
+
for (const {stream, name} of streamChecks) {
|
|
8924
|
+
if (stream?.readyState === 'ended') {
|
|
8925
|
+
throw new Error(
|
|
8926
|
+
`Attempted to publish ${name} stream with ended readyState, correlationId=${this.correlationId}`
|
|
8927
|
+
);
|
|
8928
|
+
}
|
|
8735
8929
|
}
|
|
8736
8930
|
|
|
8737
8931
|
let floorRequestNeeded = false;
|
|
@@ -8793,6 +8987,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8793
8987
|
* @returns {Promise}
|
|
8794
8988
|
*/
|
|
8795
8989
|
async unpublishStreams(streams: LocalStream[]): Promise<void> {
|
|
8990
|
+
LoggerProxy.logger.info(
|
|
8991
|
+
`Meeting:index#unpublishStreams --> called with: ${JSON.stringify(streams)}`
|
|
8992
|
+
);
|
|
8796
8993
|
this.checkMediaConnection();
|
|
8797
8994
|
|
|
8798
8995
|
const promises = [];
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
import {defer} from 'lodash';
|
|
3
3
|
import {Defer} from '@webex/common';
|
|
4
4
|
import {WebexPlugin} from '@webex/webex-core';
|
|
5
|
-
import {MEDIA, HTTP_VERBS, ROAP
|
|
5
|
+
import {MEDIA, HTTP_VERBS, ROAP} from '../constants';
|
|
6
6
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
7
|
+
import {ClientMediaPreferences} from '../reachability/reachability.types';
|
|
7
8
|
|
|
8
9
|
export type MediaRequestType = 'RoapMessage' | 'LocalMute';
|
|
9
10
|
export type RequestResult = any;
|
|
@@ -14,9 +15,8 @@ export type RoapRequest = {
|
|
|
14
15
|
mediaId: string;
|
|
15
16
|
roapMessage: any;
|
|
16
17
|
reachability: any;
|
|
18
|
+
clientMediaPreferences: ClientMediaPreferences;
|
|
17
19
|
sequence?: any;
|
|
18
|
-
joinCookie: any; // any, because this is opaque to the client, we pass whatever object we got from one backend component (Orpheus) to the other (Locus)
|
|
19
|
-
ipVersion?: IP_VERSION;
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
export type LocalMuteRequest = {
|
|
@@ -202,10 +202,6 @@ export class LocusMediaRequest extends WebexPlugin {
|
|
|
202
202
|
const body: any = {
|
|
203
203
|
device: this.config.device,
|
|
204
204
|
correlationId: this.config.correlationId,
|
|
205
|
-
clientMediaPreferences: {
|
|
206
|
-
preferTranscoding: this.config.preferTranscoding,
|
|
207
|
-
ipver: request.type === 'RoapMessage' ? request.ipVersion : undefined,
|
|
208
|
-
},
|
|
209
205
|
};
|
|
210
206
|
|
|
211
207
|
const localMedias: any = {
|
|
@@ -223,7 +219,7 @@ export class LocusMediaRequest extends WebexPlugin {
|
|
|
223
219
|
case 'RoapMessage':
|
|
224
220
|
localMedias.roapMessage = request.roapMessage;
|
|
225
221
|
localMedias.reachability = request.reachability;
|
|
226
|
-
body.clientMediaPreferences
|
|
222
|
+
body.clientMediaPreferences = request.clientMediaPreferences;
|
|
227
223
|
|
|
228
224
|
// @ts-ignore
|
|
229
225
|
this.webex.internal.newMetrics.submitClientEvent({
|
package/src/meeting/muteState.ts
CHANGED
|
@@ -394,21 +394,25 @@ export class MuteState {
|
|
|
394
394
|
* @public
|
|
395
395
|
* @memberof MuteState
|
|
396
396
|
* @param {Object} [meeting] the meeting object
|
|
397
|
+
* @param {Boolean} [unmuteAllowed] whether the user is allowed to unmute self
|
|
397
398
|
* @returns {undefined}
|
|
398
399
|
*/
|
|
399
|
-
public handleServerLocalUnmuteRequired(meeting
|
|
400
|
+
public handleServerLocalUnmuteRequired(meeting: any, unmuteAllowed: boolean) {
|
|
400
401
|
if (!this.state.client.enabled) {
|
|
401
402
|
LoggerProxy.logger.warn(
|
|
402
403
|
`Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received while ${this.type} is disabled -> local unmute will not result in ${this.type} being sent`
|
|
403
404
|
);
|
|
404
405
|
} else {
|
|
405
406
|
LoggerProxy.logger.info(
|
|
406
|
-
`Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute`
|
|
407
|
+
`Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute (unmuteAllowed=${unmuteAllowed})`
|
|
407
408
|
);
|
|
408
409
|
}
|
|
409
410
|
|
|
410
411
|
// todo: I'm seeing "you can now unmute yourself " popup when this happens - but same thing happens on web.w.c so we can ignore for now
|
|
411
412
|
this.state.server.remoteMute = false;
|
|
413
|
+
this.state.server.unmuteAllowed = unmuteAllowed;
|
|
414
|
+
|
|
415
|
+
this.applyUnmuteAllowedToStream(meeting);
|
|
412
416
|
|
|
413
417
|
// change user mute state to false, but keep localMute true if overall mute state is still true
|
|
414
418
|
this.muteLocalStream(meeting, false, 'localUnmuteRequired');
|
package/src/meeting/request.ts
CHANGED
|
@@ -26,11 +26,11 @@ import {
|
|
|
26
26
|
SEND_DTMF_ENDPOINT,
|
|
27
27
|
_SLIDES_,
|
|
28
28
|
ANNOTATION,
|
|
29
|
-
IP_VERSION,
|
|
30
29
|
} from '../constants';
|
|
31
30
|
import {SendReactionOptions, ToggleReactionsOptions} from './request.type';
|
|
32
31
|
import MeetingUtil from './util';
|
|
33
32
|
import {AnnotationInfo} from '../annotation/annotation.types';
|
|
33
|
+
import {ClientMediaPreferences} from '../reachability/reachability.types';
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* @class MeetingRequest
|
|
@@ -128,8 +128,8 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
128
128
|
locale?: string;
|
|
129
129
|
deviceCapabilities?: Array<string>;
|
|
130
130
|
liveAnnotationSupported: boolean;
|
|
131
|
-
ipVersion?: IP_VERSION;
|
|
132
131
|
alias?: string;
|
|
132
|
+
clientMediaPreferences: ClientMediaPreferences;
|
|
133
133
|
}) {
|
|
134
134
|
const {
|
|
135
135
|
asResourceOccupant,
|
|
@@ -147,12 +147,11 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
147
147
|
moveToResource,
|
|
148
148
|
roapMessage,
|
|
149
149
|
reachability,
|
|
150
|
-
preferTranscoding,
|
|
151
150
|
breakoutsSupported,
|
|
152
151
|
locale,
|
|
153
152
|
deviceCapabilities = [],
|
|
154
153
|
liveAnnotationSupported,
|
|
155
|
-
|
|
154
|
+
clientMediaPreferences,
|
|
156
155
|
alias,
|
|
157
156
|
} = options;
|
|
158
157
|
|
|
@@ -160,8 +159,6 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
160
159
|
|
|
161
160
|
let url = '';
|
|
162
161
|
|
|
163
|
-
const joinCookie = await this.getJoinCookie();
|
|
164
|
-
|
|
165
162
|
const body: any = {
|
|
166
163
|
asResourceOccupant,
|
|
167
164
|
device: {
|
|
@@ -176,11 +173,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
176
173
|
allowMultiDevice: true,
|
|
177
174
|
ensureConversation: ensureConversation || false,
|
|
178
175
|
supportsNativeLobby: 1,
|
|
179
|
-
clientMediaPreferences
|
|
180
|
-
preferTranscoding: preferTranscoding ?? true,
|
|
181
|
-
joinCookie,
|
|
182
|
-
ipver: ipVersion,
|
|
183
|
-
},
|
|
176
|
+
clientMediaPreferences,
|
|
184
177
|
};
|
|
185
178
|
|
|
186
179
|
if (alias) {
|