@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.21
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/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/breakouts/breakout.js +116 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.js +23 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/index.js +226 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/common/browser-detection.js +1 -20
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +5 -20
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +0 -7
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +10 -24
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +11 -24
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +12 -25
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +10 -24
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +10 -24
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +9 -23
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +10 -24
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +10 -24
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +6 -41
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +5 -25
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +0 -22
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +0 -23
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +0 -12
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +0 -15
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +0 -4
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -8
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +37 -60
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +4 -14
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +6 -6
- package/dist/config.js.map +1 -1
- package/dist/constants.js +88 -46
- package/dist/constants.js.map +1 -1
- package/dist/index.js +4 -18
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +12 -29
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -26
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +0 -15
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +4 -12
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +184 -190
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +3 -37
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +12 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +92 -118
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +34 -91
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +67 -111
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +80 -114
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +2 -9
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +10 -12
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.js +125 -190
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +5 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +1692 -1925
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +36 -77
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +224 -230
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +21 -31
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +43 -215
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +6 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +14 -32
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +193 -268
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +3 -15
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +137 -228
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +5 -20
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +490 -560
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +24 -41
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +99 -155
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +78 -86
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +31 -68
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +3 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +93 -200
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +16 -39
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js +9 -38
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +0 -2
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +1 -2
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +55 -135
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +57 -32
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/multistreamMedia.js +15 -21
- package/dist/multistream/multistreamMedia.js.map +1 -1
- package/dist/multistream/receiveSlot.js +10 -50
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +45 -82
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +18 -58
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +6 -40
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +362 -416
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +36 -57
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +21 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +1 -31
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +138 -182
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +3 -18
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +109 -0
- package/dist/reactions/reactions.js.map +1 -0
- package/dist/reactions/reactions.type.js +36 -0
- package/dist/reactions/reactions.type.js.map +1 -0
- package/dist/reconnection-manager/index.js +322 -455
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +39 -64
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +94 -113
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +85 -94
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +0 -2
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +85 -175
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +72 -53
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +22 -47
- package/dist/transcription/index.js.map +1 -1
- package/internal-README.md +7 -6
- package/package.json +25 -20
- package/src/breakouts/README.md +190 -0
- package/src/breakouts/breakout.ts +110 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/index.ts +225 -0
- package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
- package/src/common/collection.ts +9 -7
- package/src/common/{config.js → config.ts} +1 -1
- package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
- package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
- package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
- package/src/common/errors/{media.js → media.ts} +11 -7
- package/src/common/errors/parameter.ts +11 -7
- package/src/common/errors/{password-error.js → password-error.ts} +11 -7
- package/src/common/errors/{permission.js → permission.ts} +10 -6
- package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
- package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
- package/src/common/errors/{stats.js → stats.ts} +11 -7
- package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
- package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
- package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
- package/src/common/events/{events.js → events.ts} +5 -1
- package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
- package/src/common/events/{util.js → util.ts} +2 -3
- package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
- package/src/common/logs/logger-proxy.ts +44 -0
- package/src/common/logs/{request.js → request.ts} +22 -9
- package/src/common/queue.ts +1 -2
- package/src/{config.js → config.ts} +17 -12
- package/src/constants.ts +40 -1
- package/src/index.js +2 -1
- package/src/locus-info/controlsUtils.ts +114 -0
- package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
- package/src/locus-info/{fullState.js → fullState.ts} +16 -12
- package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
- package/src/locus-info/{index.js → index.ts} +148 -64
- package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
- package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
- package/src/locus-info/{parser.js → parser.ts} +67 -79
- package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
- package/src/media/{index.js → index.ts} +181 -131
- package/src/media/{properties.js → properties.ts} +47 -28
- package/src/media/{util.js → util.ts} +2 -2
- package/src/mediaQualityMetrics/{config.js → config.ts} +46 -46
- package/src/meeting/{effectsState.js → effectsState.ts} +47 -41
- package/src/meeting/in-meeting-actions.ts +15 -3
- package/src/meeting/{index.js → index.ts} +2263 -1427
- package/src/meeting/{muteState.js → muteState.ts} +78 -42
- package/src/meeting/{request.js → request.ts} +292 -142
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/{state.js → state.ts} +50 -35
- package/src/meeting/{util.js → util.ts} +112 -115
- package/src/meeting-info/{collection.js → collection.ts} +6 -2
- package/src/meeting-info/{index.js → index.ts} +42 -36
- package/src/meeting-info/meeting-info-v2.ts +273 -0
- package/src/meeting-info/{request.js → request.ts} +14 -4
- package/src/meeting-info/{util.js → util.ts} +60 -51
- package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
- package/src/meetings/{collection.js → collection.ts} +6 -3
- package/src/meetings/index.ts +1159 -0
- package/src/meetings/{request.js → request.ts} +32 -25
- package/src/meetings/{util.js → util.ts} +34 -32
- package/src/member/{index.js → index.ts} +102 -56
- package/src/member/{util.js → util.ts} +52 -25
- package/src/members/{collection.js → collection.ts} +2 -2
- package/src/members/{index.js → index.ts} +219 -142
- package/src/members/{request.js → request.ts} +60 -16
- package/src/members/{util.js → util.ts} +50 -48
- package/src/metrics/{config.js → config.ts} +254 -83
- package/src/metrics/{constants.js → constants.ts} +0 -2
- package/src/metrics/{index.js → index.ts} +106 -74
- package/src/multistream/mediaRequestManager.ts +81 -15
- package/src/multistream/multistreamMedia.ts +5 -0
- package/src/multistream/receiveSlot.ts +18 -12
- package/src/multistream/receiveSlotManager.ts +23 -21
- package/src/multistream/remoteMedia.ts +15 -5
- package/src/multistream/remoteMediaGroup.ts +4 -3
- package/src/multistream/remoteMediaManager.ts +153 -37
- package/src/networkQualityMonitor/{index.js → index.ts} +37 -25
- package/src/personal-meeting-room/{index.js → index.ts} +28 -19
- package/src/personal-meeting-room/{request.js → request.ts} +13 -4
- package/src/personal-meeting-room/{util.js → util.ts} +4 -4
- package/src/reachability/{index.js → index.ts} +99 -83
- package/src/reachability/request.ts +39 -33
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +104 -0
- package/src/reactions/reactions.type.ts +62 -0
- package/src/reconnection-manager/{index.js → index.ts} +195 -102
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/{index.js → index.ts} +73 -56
- package/src/roap/request.ts +157 -0
- package/src/roap/turnDiscovery.ts +77 -37
- package/src/statsAnalyzer/{global.js → global.ts} +30 -33
- package/src/statsAnalyzer/{index.js → index.ts} +468 -192
- package/src/statsAnalyzer/mqaUtil.ts +290 -0
- package/src/transcription/{index.js → index.ts} +46 -39
- package/test/integration/spec/journey.js +664 -463
- package/test/integration/spec/space-meeting.js +320 -206
- package/test/integration/spec/transcription.js +7 -8
- package/test/unit/spec/breakouts/breakout.ts +119 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- package/test/unit/spec/breakouts/index.ts +293 -0
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/fixture/locus.js +92 -90
- package/test/unit/spec/locus-info/controlsUtils.js +25 -5
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +104 -2
- package/test/unit/spec/locus-info/infoUtils.js +41 -32
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +97 -103
- package/test/unit/spec/locus-info/selfUtils.js +105 -12
- package/test/unit/spec/media/index.ts +31 -47
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/effectsState.js +39 -45
- package/test/unit/spec/meeting/in-meeting-actions.ts +5 -2
- package/test/unit/spec/meeting/index.js +2017 -742
- package/test/unit/spec/meeting/muteState.js +42 -33
- package/test/unit/spec/meeting/request.js +115 -44
- package/test/unit/spec/meeting/utils.js +104 -171
- package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +110 -74
- package/test/unit/spec/meetings/collection.js +1 -1
- package/test/unit/spec/meetings/index.js +439 -257
- package/test/unit/spec/meetings/utils.js +14 -12
- package/test/unit/spec/member/index.js +0 -1
- package/test/unit/spec/member/util.js +31 -7
- package/test/unit/spec/members/index.js +104 -54
- package/test/unit/spec/members/request.js +29 -20
- package/test/unit/spec/members/utils.js +8 -5
- package/test/unit/spec/metrics/index.js +16 -21
- package/test/unit/spec/multistream/mediaRequestManager.ts +316 -50
- package/test/unit/spec/multistream/receiveSlot.ts +6 -6
- package/test/unit/spec/multistream/receiveSlotManager.ts +13 -13
- package/test/unit/spec/multistream/remoteMedia.ts +10 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
- package/test/unit/spec/networkQualityMonitor/index.js +21 -15
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +58 -26
- package/test/unit/spec/reconnection-manager/index.js +102 -9
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +2 -1
- package/test/unit/spec/roap/request.ts +114 -0
- package/test/unit/spec/roap/turnDiscovery.ts +64 -45
- package/test/unit/spec/stats-analyzer/index.js +27 -22
- package/test/utils/cmr.js +44 -42
- package/test/utils/testUtils.js +83 -74
- package/test/utils/webex-config.js +18 -18
- package/test/utils/webex-test-users.js +54 -50
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -22
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/peer-connection-manager/util.js +0 -124
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/src/common/logs/logger-proxy.js +0 -33
- package/src/locus-info/controlsUtils.js +0 -102
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/meeting-info/meeting-info-v2.js +0 -255
- package/src/meetings/index.js +0 -1015
- package/src/peer-connection-manager/util.ts +0 -117
- package/src/roap/request.js +0 -127
- package/src/statsAnalyzer/mqaUtil.js +0 -173
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import PermissionError from '../common/errors/permission';
|
|
2
|
+
import {CONTROLS, HTTP_VERBS} from '../constants';
|
|
3
|
+
import MeetingRequest from '../meeting/request';
|
|
4
|
+
import RecordingAction from './enums';
|
|
5
|
+
import Util from './util';
|
|
6
|
+
import LoggerProxy from '../common/logs/logger-proxy';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @description Recording manages the recording functionality of the meeting object, there should only be one instantation of recording per meeting
|
|
10
|
+
* @export
|
|
11
|
+
* @private
|
|
12
|
+
* @class Recording
|
|
13
|
+
*/
|
|
14
|
+
export default class RecordingController {
|
|
15
|
+
/**
|
|
16
|
+
* @instance
|
|
17
|
+
* @type {MeetingRequest}
|
|
18
|
+
* @private
|
|
19
|
+
* @memberof RecordingController
|
|
20
|
+
*/
|
|
21
|
+
private request: MeetingRequest;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @instance
|
|
25
|
+
* @type {Array}
|
|
26
|
+
* @private
|
|
27
|
+
* @memberof RecordingInfo
|
|
28
|
+
*/
|
|
29
|
+
private displayHints: Array<string> = [];
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @instance
|
|
33
|
+
* @type {string}
|
|
34
|
+
* @private
|
|
35
|
+
* @memberof RecordingInfo
|
|
36
|
+
*/
|
|
37
|
+
private serviceUrl: string;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @instance
|
|
41
|
+
* @type {string}
|
|
42
|
+
* @private
|
|
43
|
+
* @memberof RecordingInfo
|
|
44
|
+
*/
|
|
45
|
+
private sessionId: string;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @instance
|
|
49
|
+
* @type {string}
|
|
50
|
+
* @private
|
|
51
|
+
* @memberof RecordingInfo
|
|
52
|
+
*/
|
|
53
|
+
private locusUrl: string;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @instance
|
|
57
|
+
* @type {string}
|
|
58
|
+
* @private
|
|
59
|
+
* @memberof RecordingInfo
|
|
60
|
+
*/
|
|
61
|
+
private locusId: string;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @param {MeetingRequest} request
|
|
65
|
+
* @param {Object} options
|
|
66
|
+
* @constructor
|
|
67
|
+
* @memberof RecordingController
|
|
68
|
+
*/
|
|
69
|
+
constructor(
|
|
70
|
+
request: MeetingRequest,
|
|
71
|
+
options?: {
|
|
72
|
+
serviceUrl?: string;
|
|
73
|
+
sessionId: string;
|
|
74
|
+
locusUrl: string;
|
|
75
|
+
displayHints?: Array<string>;
|
|
76
|
+
}
|
|
77
|
+
) {
|
|
78
|
+
this.initialize(request);
|
|
79
|
+
this.set(options);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @param {MeetingRequest} request
|
|
84
|
+
* @param {LocusInfo} info
|
|
85
|
+
* @returns {void}
|
|
86
|
+
* @private
|
|
87
|
+
* @memberof RecordingController
|
|
88
|
+
*/
|
|
89
|
+
private initialize(request: MeetingRequest) {
|
|
90
|
+
this.request = request;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @param {Object} options
|
|
95
|
+
* @returns {void}
|
|
96
|
+
* @public
|
|
97
|
+
* @memberof RecordingController
|
|
98
|
+
*/
|
|
99
|
+
public set(options?: {
|
|
100
|
+
serviceUrl?: string;
|
|
101
|
+
sessionId: string;
|
|
102
|
+
locusUrl: string;
|
|
103
|
+
displayHints?: Array<string>;
|
|
104
|
+
}) {
|
|
105
|
+
this.extract(options);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @param {string} url
|
|
110
|
+
* @returns {void}
|
|
111
|
+
* @public
|
|
112
|
+
* @memberof RecordingController
|
|
113
|
+
*/
|
|
114
|
+
public setLocusUrl(url: string) {
|
|
115
|
+
this.locusUrl = url;
|
|
116
|
+
this.locusId = Util.extractLocusId(this.locusUrl);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @param {Array} hints
|
|
121
|
+
* @returns {void}
|
|
122
|
+
* @public
|
|
123
|
+
* @memberof RecordingController
|
|
124
|
+
*/
|
|
125
|
+
public setDisplayHints(hints: Array<string>) {
|
|
126
|
+
this.displayHints = hints;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* @param {string} id
|
|
131
|
+
* @returns {void}
|
|
132
|
+
* @public
|
|
133
|
+
* @memberof RecordingController
|
|
134
|
+
*/
|
|
135
|
+
public setSessionId(id: string) {
|
|
136
|
+
this.sessionId = id;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @param {string} url
|
|
141
|
+
* @returns {void}
|
|
142
|
+
* @public
|
|
143
|
+
* @memberof RecordingController
|
|
144
|
+
*/
|
|
145
|
+
public setServiceUrl(url: string) {
|
|
146
|
+
this.serviceUrl = url;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @returns {string}
|
|
151
|
+
* @public
|
|
152
|
+
* @memberof RecordingController
|
|
153
|
+
*/
|
|
154
|
+
public getLocusUrl() {
|
|
155
|
+
return this.locusUrl;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* @returns {string}
|
|
160
|
+
* @public
|
|
161
|
+
* @memberof RecordingController
|
|
162
|
+
*/
|
|
163
|
+
public getLocusId() {
|
|
164
|
+
return this.locusId;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* @returns {string}
|
|
169
|
+
* @public
|
|
170
|
+
* @memberof RecordingController
|
|
171
|
+
*/
|
|
172
|
+
public getSessionId() {
|
|
173
|
+
return this.sessionId;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @returns {string}
|
|
178
|
+
* @public
|
|
179
|
+
* @memberof RecordingController
|
|
180
|
+
*/
|
|
181
|
+
public getServiceUrl() {
|
|
182
|
+
return this.serviceUrl;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* @returns {Array}
|
|
187
|
+
* @public
|
|
188
|
+
* @memberof RecordingController
|
|
189
|
+
*/
|
|
190
|
+
public getDisplayHints() {
|
|
191
|
+
return this.displayHints;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* @param {Object} options
|
|
196
|
+
* @returns {void}
|
|
197
|
+
* @private
|
|
198
|
+
* @memberof RecordingController
|
|
199
|
+
*/
|
|
200
|
+
private extract(options?: {
|
|
201
|
+
serviceUrl?: string;
|
|
202
|
+
sessionId: string;
|
|
203
|
+
locusUrl: string;
|
|
204
|
+
displayHints?: Array<string>;
|
|
205
|
+
}) {
|
|
206
|
+
this.setServiceUrl(options?.serviceUrl);
|
|
207
|
+
this.setSessionId(options?.sessionId);
|
|
208
|
+
this.setDisplayHints(options?.displayHints);
|
|
209
|
+
this.setLocusUrl(options?.locusUrl);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* @param {RecordingAction} action
|
|
214
|
+
* @private
|
|
215
|
+
* @memberof RecordingController
|
|
216
|
+
* @returns {Promise}
|
|
217
|
+
*/
|
|
218
|
+
private recordingService(action: RecordingAction): Promise<any> {
|
|
219
|
+
// @ts-ignore
|
|
220
|
+
return this.request.request({
|
|
221
|
+
body: {
|
|
222
|
+
meetingInfo: {
|
|
223
|
+
locusSessionId: this.sessionId,
|
|
224
|
+
},
|
|
225
|
+
recording: {
|
|
226
|
+
action: action.toLowerCase(),
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
uri: `${this.serviceUrl}/loci/${this.locusId}/recording`,
|
|
230
|
+
method: HTTP_VERBS.PUT,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* @param {RecordingAction} action
|
|
236
|
+
* @private
|
|
237
|
+
* @memberof RecordingController
|
|
238
|
+
* @returns {Promise}
|
|
239
|
+
*/
|
|
240
|
+
private recordingControls(action: RecordingAction): Promise<any> {
|
|
241
|
+
const record = Util.deriveRecordingStates(action);
|
|
242
|
+
|
|
243
|
+
LoggerProxy.logger.log(`RecordingController:index#recordingControls --> ${record}`);
|
|
244
|
+
|
|
245
|
+
// @ts-ignore
|
|
246
|
+
return this.request.request({
|
|
247
|
+
uri: `${this.locusUrl}/${CONTROLS}`,
|
|
248
|
+
body: {
|
|
249
|
+
record,
|
|
250
|
+
},
|
|
251
|
+
method: HTTP_VERBS.PATCH,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* @param {RecordingAction} action
|
|
257
|
+
* @private
|
|
258
|
+
* @memberof RecordingController
|
|
259
|
+
* @returns {Promise}
|
|
260
|
+
*/
|
|
261
|
+
private recordingFacade(action: RecordingAction): Promise<any> {
|
|
262
|
+
LoggerProxy.logger.log(
|
|
263
|
+
`RecordingController:index#recordingFacade --> recording action [${action}]`
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
// assumes action is proper cased (i.e., Example)
|
|
267
|
+
if (Util?.[`canUser${action}`](this.displayHints)) {
|
|
268
|
+
if (this.serviceUrl) {
|
|
269
|
+
return this.recordingService(action);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
return this.recordingControls(action);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return Promise.reject(
|
|
276
|
+
new PermissionError(`${action} recording not allowed, due to moderator property.`)
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* @private
|
|
282
|
+
* @memberof RecordingController
|
|
283
|
+
* @returns {Promise}
|
|
284
|
+
*/
|
|
285
|
+
public startRecording(): Promise<any> {
|
|
286
|
+
return this.recordingFacade(RecordingAction.Start);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* @private
|
|
291
|
+
* @memberof RecordingController
|
|
292
|
+
* @returns {Promise}
|
|
293
|
+
*/
|
|
294
|
+
public stopRecording(): Promise<any> {
|
|
295
|
+
return this.recordingFacade(RecordingAction.Stop);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* @private
|
|
300
|
+
* @memberof RecordingController
|
|
301
|
+
* @returns {Promise}
|
|
302
|
+
*/
|
|
303
|
+
public pauseRecording(): Promise<any> {
|
|
304
|
+
return this.recordingFacade(RecordingAction.Pause);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* @private
|
|
309
|
+
* @memberof RecordingController
|
|
310
|
+
* @returns {Promise}
|
|
311
|
+
*/
|
|
312
|
+
public resumeRecording(): Promise<any> {
|
|
313
|
+
return this.recordingFacade(RecordingAction.Resume);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {DISPLAY_HINTS} from '../constants';
|
|
2
|
+
import RecordingAction from './enums';
|
|
3
|
+
|
|
4
|
+
const canUserStart = (displayHints: Array<string>): boolean =>
|
|
5
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START);
|
|
6
|
+
|
|
7
|
+
const canUserPause = (displayHints: Array<string>): boolean =>
|
|
8
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);
|
|
9
|
+
|
|
10
|
+
const canUserResume = (displayHints: Array<string>): boolean =>
|
|
11
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME);
|
|
12
|
+
|
|
13
|
+
const canUserStop = (displayHints: Array<string>): boolean =>
|
|
14
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP);
|
|
15
|
+
|
|
16
|
+
const extractLocusId = (url: string) => {
|
|
17
|
+
return url?.split('/').pop();
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const deriveRecordingStates = (action: RecordingAction): {recording: boolean; paused: boolean} => {
|
|
21
|
+
let recording;
|
|
22
|
+
let paused;
|
|
23
|
+
|
|
24
|
+
switch (action) {
|
|
25
|
+
case RecordingAction.Start:
|
|
26
|
+
recording = true;
|
|
27
|
+
paused = false;
|
|
28
|
+
break;
|
|
29
|
+
case RecordingAction.Stop:
|
|
30
|
+
recording = false;
|
|
31
|
+
paused = false;
|
|
32
|
+
break;
|
|
33
|
+
case RecordingAction.Resume:
|
|
34
|
+
recording = true;
|
|
35
|
+
paused = false;
|
|
36
|
+
break;
|
|
37
|
+
case RecordingAction.Pause:
|
|
38
|
+
recording = true;
|
|
39
|
+
paused = true;
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
throw new Error(`Recording state cannot be derived from invalid action: ${action}`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
recording,
|
|
47
|
+
paused,
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export default {
|
|
52
|
+
canUserStart,
|
|
53
|
+
canUserPause,
|
|
54
|
+
canUserResume,
|
|
55
|
+
canUserStop,
|
|
56
|
+
deriveRecordingStates,
|
|
57
|
+
extractLocusId,
|
|
58
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// @ts-ignore
|
|
1
2
|
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
2
3
|
|
|
3
4
|
import {ROAP} from '../constants';
|
|
@@ -5,6 +6,7 @@ import LoggerProxy from '../common/logs/logger-proxy';
|
|
|
5
6
|
|
|
6
7
|
import RoapRequest from './request';
|
|
7
8
|
import TurnDiscovery from './turnDiscovery';
|
|
9
|
+
import Meeting from '../meeting';
|
|
8
10
|
|
|
9
11
|
/**
|
|
10
12
|
* Roap options
|
|
@@ -17,11 +19,11 @@ import TurnDiscovery from './turnDiscovery';
|
|
|
17
19
|
*/
|
|
18
20
|
|
|
19
21
|
/**
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
* @typedef {Object} SeqOptions
|
|
23
|
+
* @property {String} correlationId
|
|
24
|
+
* @property {String} mediaId
|
|
25
|
+
* @property {Number} seq
|
|
26
|
+
*/
|
|
25
27
|
|
|
26
28
|
/**
|
|
27
29
|
* @class Roap
|
|
@@ -29,12 +31,19 @@ import TurnDiscovery from './turnDiscovery';
|
|
|
29
31
|
* @private
|
|
30
32
|
*/
|
|
31
33
|
export default class Roap extends StatelessWebexPlugin {
|
|
34
|
+
attrs: any;
|
|
35
|
+
lastRoapOffer: any;
|
|
36
|
+
options: any;
|
|
37
|
+
roapHandler: any;
|
|
38
|
+
roapRequest: any;
|
|
39
|
+
turnDiscovery: any;
|
|
40
|
+
|
|
32
41
|
/**
|
|
33
42
|
*
|
|
34
43
|
* @param {Object} attrs
|
|
35
44
|
* @param {Object} options
|
|
36
45
|
*/
|
|
37
|
-
constructor(attrs, options) {
|
|
46
|
+
constructor(attrs: any, options: any) {
|
|
38
47
|
super({}, options);
|
|
39
48
|
/**
|
|
40
49
|
* @instance
|
|
@@ -57,6 +66,7 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
57
66
|
* @private
|
|
58
67
|
* @memberof Roap
|
|
59
68
|
*/
|
|
69
|
+
// @ts-ignore
|
|
60
70
|
this.roapRequest = new RoapRequest({}, options);
|
|
61
71
|
|
|
62
72
|
this.turnDiscovery = new TurnDiscovery(this.roapRequest);
|
|
@@ -66,16 +76,19 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
66
76
|
*
|
|
67
77
|
* @param {SeqOptions} options
|
|
68
78
|
* @returns {null}
|
|
69
|
-
* @private
|
|
70
79
|
* @memberof Roap
|
|
71
80
|
*/
|
|
72
|
-
sendRoapOK(options) {
|
|
81
|
+
public sendRoapOK(options: any) {
|
|
73
82
|
return Promise.resolve().then(() => {
|
|
74
|
-
|
|
83
|
+
// @ts-ignore
|
|
84
|
+
const meeting = this.webex.meetings.meetingCollection.getByKey(
|
|
85
|
+
'correlationId',
|
|
86
|
+
options.correlationId
|
|
87
|
+
);
|
|
75
88
|
const roapMessage = {
|
|
76
89
|
messageType: ROAP.ROAP_TYPES.OK,
|
|
77
90
|
version: ROAP.ROAP_VERSION,
|
|
78
|
-
seq: options.seq
|
|
91
|
+
seq: options.seq,
|
|
79
92
|
};
|
|
80
93
|
|
|
81
94
|
LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sending with seq ${options.seq}`);
|
|
@@ -103,60 +116,67 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
103
116
|
* @param {Boolean} options.audioMuted
|
|
104
117
|
* @param {Boolean} options.videoMuted
|
|
105
118
|
* @returns {Promise}
|
|
106
|
-
* @private
|
|
107
119
|
* @memberof Roap
|
|
108
120
|
*/
|
|
109
|
-
sendRoapAnswer(options) {
|
|
110
|
-
|
|
121
|
+
public sendRoapAnswer(options: any) {
|
|
122
|
+
// @ts-ignore
|
|
123
|
+
const meeting = this.webex.meetings.meetingCollection.getByKey(
|
|
124
|
+
'correlationId',
|
|
125
|
+
options.correlationId
|
|
126
|
+
);
|
|
111
127
|
const roapMessage = {
|
|
112
128
|
messageType: ROAP.ROAP_TYPES.ANSWER,
|
|
113
129
|
sdps: [options.sdp],
|
|
114
130
|
version: ROAP.ROAP_VERSION,
|
|
115
|
-
seq: options.seq
|
|
131
|
+
seq: options.seq,
|
|
116
132
|
};
|
|
117
133
|
|
|
118
|
-
return this.roapRequest
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
});
|
|
134
|
+
return this.roapRequest.sendRoap({
|
|
135
|
+
roapMessage,
|
|
136
|
+
locusSelfUrl: meeting.selfUrl,
|
|
137
|
+
mediaId: options.mediaId,
|
|
138
|
+
correlationId: options.correlationId,
|
|
139
|
+
audioMuted: meeting.isAudioMuted(),
|
|
140
|
+
videoMuted: meeting.isVideoMuted(),
|
|
141
|
+
meetingId: meeting.id,
|
|
142
|
+
preferTranscoding: !meeting.isMultistream,
|
|
143
|
+
});
|
|
129
144
|
}
|
|
130
145
|
|
|
131
146
|
/**
|
|
132
147
|
* Sends a ROAP error...
|
|
133
148
|
* @param {Object} options
|
|
134
149
|
* @returns {Promise}
|
|
135
|
-
* @private
|
|
136
150
|
* @memberof Roap
|
|
137
151
|
*/
|
|
138
152
|
sendRoapError(options) {
|
|
139
|
-
|
|
153
|
+
// @ts-ignore
|
|
154
|
+
const meeting = this.webex.meetings.meetingCollection.getByKey(
|
|
155
|
+
'correlationId',
|
|
156
|
+
options.correlationId
|
|
157
|
+
);
|
|
140
158
|
const roapMessage = {
|
|
141
159
|
messageType: ROAP.ROAP_TYPES.ERROR,
|
|
142
160
|
version: ROAP.ROAP_VERSION,
|
|
143
161
|
errorType: options.errorType,
|
|
144
|
-
seq: options.seq
|
|
145
|
-
|
|
162
|
+
seq: options.seq,
|
|
146
163
|
};
|
|
147
164
|
|
|
148
|
-
return this.roapRequest
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
165
|
+
return this.roapRequest
|
|
166
|
+
.sendRoap({
|
|
167
|
+
roapMessage,
|
|
168
|
+
locusSelfUrl: meeting.selfUrl,
|
|
169
|
+
mediaId: options.mediaId,
|
|
170
|
+
correlationId: options.correlationId,
|
|
171
|
+
audioMuted: meeting.isAudioMuted(),
|
|
172
|
+
videoMuted: meeting.isVideoMuted(),
|
|
173
|
+
meetingId: meeting.id,
|
|
174
|
+
preferTranscoding: !meeting.isMultistream,
|
|
175
|
+
})
|
|
158
176
|
.then(() => {
|
|
159
|
-
LoggerProxy.logger.log(
|
|
177
|
+
LoggerProxy.logger.log(
|
|
178
|
+
`Roap:index#sendRoapError --> ROAP ERROR sent with seq ${options.seq}`
|
|
179
|
+
);
|
|
160
180
|
});
|
|
161
181
|
}
|
|
162
182
|
|
|
@@ -164,19 +184,16 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
164
184
|
* sends a roap media request
|
|
165
185
|
* @param {RoapOptions} options
|
|
166
186
|
* @returns {Promise}
|
|
167
|
-
* @private
|
|
168
187
|
* @memberof Roap
|
|
169
188
|
*/
|
|
170
|
-
sendRoapMediaRequest(options) {
|
|
171
|
-
const {
|
|
172
|
-
meeting, seq, sdp, reconnect, tieBreaker
|
|
173
|
-
} = options;
|
|
189
|
+
sendRoapMediaRequest(options: any) {
|
|
190
|
+
const {meeting, seq, sdp, reconnect, tieBreaker} = options;
|
|
174
191
|
const roapMessage = {
|
|
175
192
|
messageType: ROAP.ROAP_TYPES.OFFER,
|
|
176
193
|
sdps: [sdp],
|
|
177
194
|
version: ROAP.ROAP_VERSION,
|
|
178
195
|
seq,
|
|
179
|
-
tieBreaker
|
|
196
|
+
tieBreaker,
|
|
180
197
|
};
|
|
181
198
|
|
|
182
199
|
// When reconnecting, it's important that the first roap message being sent out has empty media id.
|
|
@@ -205,16 +222,16 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
205
222
|
}
|
|
206
223
|
|
|
207
224
|
/**
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
doTurnDiscovery(meeting, isReconnecting) {
|
|
225
|
+
* Performs a TURN server discovery procedure, which involves exchanging
|
|
226
|
+
* some roap messages with the server. This exchange has to be done before
|
|
227
|
+
* any other roap messages are sent
|
|
228
|
+
*
|
|
229
|
+
* @param {Meeting} meeting
|
|
230
|
+
* @param {Boolean} isReconnecting should be set to true if this is a new
|
|
231
|
+
* media connection just after a reconnection
|
|
232
|
+
* @returns {Promise}
|
|
233
|
+
*/
|
|
234
|
+
doTurnDiscovery(meeting: Meeting, isReconnecting: boolean) {
|
|
218
235
|
return this.turnDiscovery.doTurnDiscovery(meeting, isReconnecting);
|
|
219
236
|
}
|
|
220
237
|
}
|