@webex/plugin-meetings 2.59.1 → 2.59.3-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +6 -6
- package/LICENSE +1 -1
- package/README.md +1204 -1204
- package/UPGRADING.md +287 -287
- package/babel.config.js +3 -3
- package/browsers.js +108 -108
- package/dist/common/browser-detection.d.ts +9 -9
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.d.ts +48 -48
- package/dist/common/collection.js +43 -43
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.d.ts +2 -2
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.d.ts +15 -15
- package/dist/common/errors/captcha-error.js +7 -7
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.d.ts +16 -16
- package/dist/common/errors/intent-to-join.js +7 -7
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.d.ts +17 -17
- package/dist/common/errors/join-meeting.js +8 -8
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.d.ts +15 -15
- package/dist/common/errors/media.js +7 -7
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.d.ts +15 -15
- package/dist/common/errors/parameter.js +7 -7
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.d.ts +15 -15
- package/dist/common/errors/password-error.js +7 -7
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.d.ts +14 -14
- package/dist/common/errors/permission.js +6 -6
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.d.ts +9 -9
- package/dist/common/errors/reconnection-in-progress.js +6 -6
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.d.ts +15 -15
- package/dist/common/errors/reconnection.js +7 -7
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.d.ts +15 -15
- package/dist/common/errors/stats.js +7 -7
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.d.ts +81 -81
- package/dist/common/errors/webex-errors.js +42 -42
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.d.ts +20 -20
- package/dist/common/errors/webex-meetings-error.js +12 -12
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.d.ts +17 -17
- package/dist/common/events/events-scope.js +10 -10
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.d.ts +12 -12
- package/dist/common/events/events.js +4 -4
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.d.ts +2 -2
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.d.ts +2 -2
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.d.ts +2 -2
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.d.ts +2 -2
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.d.ts +34 -34
- package/dist/common/logs/request.js +18 -18
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.d.ts +32 -32
- package/dist/common/queue.js +18 -18
- package/dist/common/queue.js.map +1 -1
- package/dist/config.d.ts +73 -73
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +924 -924
- package/dist/constants.js +9 -9
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.d.ts +4 -4
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.d.ts +5 -5
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.d.ts +120 -120
- package/dist/controls-options-manager/index.js +81 -81
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/util.d.ts +7 -7
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.d.ts +2 -2
- package/dist/locus-info/controlsUtils.js +21 -21
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.d.ts +2 -2
- package/dist/locus-info/embeddedAppsUtils.js +14 -14
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.d.ts +2 -2
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.d.ts +2 -2
- package/dist/locus-info/hostUtils.js +19 -19
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.d.ts +269 -269
- package/dist/locus-info/index.js +180 -180
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.d.ts +2 -2
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.d.ts +2 -2
- package/dist/locus-info/mediaSharesUtils.js +50 -50
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.d.ts +212 -212
- package/dist/locus-info/parser.js +136 -136
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.d.ts +2 -2
- package/dist/locus-info/selfUtils.js +52 -52
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.d.ts +32 -32
- package/dist/media/index.js +145 -145
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.d.ts +108 -108
- package/dist/media/properties.js +49 -49
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.d.ts +2 -2
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.d.ts +233 -233
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.d.ts +42 -42
- package/dist/meeting/effectsState.js +24 -24
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.d.ts +79 -79
- package/dist/meeting/in-meeting-actions.js +11 -11
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.d.ts +1621 -1621
- package/dist/meeting/index.js +1502 -1505
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.d.ts +116 -116
- package/dist/meeting/muteState.js +85 -85
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.d.ts +255 -255
- package/dist/meeting/request.js +141 -141
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/state.d.ts +9 -9
- package/dist/meeting/state.js +30 -30
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.d.ts +2 -2
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.d.ts +20 -20
- package/dist/meeting-info/collection.js +11 -11
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.d.ts +57 -57
- package/dist/meeting-info/index.js +50 -50
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.d.ts +93 -93
- package/dist/meeting-info/meeting-info-v2.js +52 -52
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.d.ts +22 -22
- package/dist/meeting-info/request.js +14 -14
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.d.ts +2 -2
- package/dist/meeting-info/util.js +9 -9
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.d.ts +2 -2
- package/dist/meeting-info/utilv2.js +20 -20
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.d.ts +23 -23
- package/dist/meetings/collection.js +14 -14
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.d.ts +296 -296
- package/dist/meetings/index.js +259 -259
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.d.ts +27 -27
- package/dist/meetings/request.js +15 -15
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.d.ts +18 -18
- package/dist/meetings/util.js +29 -29
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.d.ts +147 -147
- package/dist/member/index.js +214 -214
- package/dist/member/index.js.map +1 -1
- package/dist/member/member.types.d.ts +11 -11
- package/dist/member/member.types.js.map +1 -1
- package/dist/member/util.d.ts +2 -2
- package/dist/member/util.js +60 -60
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.d.ts +24 -24
- package/dist/members/collection.js +11 -11
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.d.ts +298 -298
- package/dist/members/index.js +275 -275
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.d.ts +50 -50
- package/dist/members/request.js +27 -27
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.d.ts +2 -2
- package/dist/members/util.js +21 -21
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.d.ts +169 -169
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.d.ts +57 -57
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.d.ts +152 -152
- package/dist/metrics/index.js +90 -90
- package/dist/metrics/index.js.map +1 -1
- package/dist/networkQualityMonitor/index.d.ts +70 -70
- package/dist/networkQualityMonitor/index.js +65 -65
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/peer-connection-manager/index.d.ts +6 -6
- package/dist/peer-connection-manager/index.js +87 -87
- package/dist/peer-connection-manager/index.js.map +1 -1
- package/dist/peer-connection-manager/util.d.ts +6 -6
- package/dist/peer-connection-manager/util.js +9 -9
- package/dist/peer-connection-manager/util.js.map +1 -1
- package/dist/personal-meeting-room/index.d.ts +47 -47
- package/dist/personal-meeting-room/index.js +67 -67
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.d.ts +14 -14
- package/dist/personal-meeting-room/request.js +7 -7
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.d.ts +2 -2
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.d.ts +139 -139
- package/dist/reachability/index.js +110 -110
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.d.ts +35 -35
- package/dist/reachability/request.js +15 -15
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/reactions.d.ts +4 -4
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.d.ts +32 -32
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.d.ts +112 -112
- package/dist/reconnection-manager/index.js +112 -112
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.d.ts +7 -7
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.d.ts +193 -193
- package/dist/recording-controller/index.js +127 -127
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.d.ts +13 -13
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/collection.d.ts +10 -10
- package/dist/roap/collection.js.map +1 -1
- package/dist/roap/handler.d.ts +47 -47
- package/dist/roap/handler.js +27 -27
- package/dist/roap/handler.js.map +1 -1
- package/dist/roap/index.d.ts +116 -116
- package/dist/roap/index.js +111 -111
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.d.ts +35 -35
- package/dist/roap/request.js +17 -17
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/state.d.ts +9 -9
- package/dist/roap/state.js +14 -14
- package/dist/roap/state.js.map +1 -1
- package/dist/roap/turnDiscovery.d.ts +67 -67
- package/dist/roap/turnDiscovery.js +46 -46
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/roap/util.d.ts +2 -2
- package/dist/roap/util.js.map +1 -1
- package/dist/statsAnalyzer/global.d.ts +126 -126
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +190 -190
- package/dist/statsAnalyzer/index.js +128 -128
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +22 -22
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.d.ts +64 -64
- package/dist/transcription/index.js +42 -42
- package/dist/transcription/index.js.map +1 -1
- package/internal-README.md +172 -172
- package/jest.config.js +3 -3
- package/package.json +22 -21
- package/process +1 -1
- package/src/common/browser-detection.ts +39 -39
- package/src/common/collection.ts +94 -94
- package/src/common/config.ts +9 -9
- package/src/common/errors/captcha-error.ts +25 -25
- package/src/common/errors/intent-to-join.ts +27 -27
- package/src/common/errors/join-meeting.ts +32 -32
- package/src/common/errors/media.ts +25 -25
- package/src/common/errors/parameter.ts +33 -33
- package/src/common/errors/password-error.ts +25 -25
- package/src/common/errors/permission.ts +24 -24
- package/src/common/errors/reconnection-in-progress.ts +8 -8
- package/src/common/errors/reconnection.ts +25 -25
- package/src/common/errors/stats.ts +25 -25
- package/src/common/errors/webex-errors.ts +140 -140
- package/src/common/errors/webex-meetings-error.ts +35 -35
- package/src/common/events/events-scope.ts +30 -30
- package/src/common/events/events.ts +25 -25
- package/src/common/events/trigger-proxy.ts +25 -25
- package/src/common/events/util.ts +39 -39
- package/src/common/logs/logger-config.ts +8 -8
- package/src/common/logs/logger-proxy.ts +44 -44
- package/src/common/logs/request.ts +65 -65
- package/src/common/queue.ts +50 -50
- package/src/config.ts +96 -96
- package/src/constants.ts +1121 -1121
- package/src/controls-options-manager/constants.ts +5 -5
- package/src/controls-options-manager/enums.ts +6 -6
- package/src/controls-options-manager/index.ts +183 -183
- package/src/controls-options-manager/util.ts +20 -20
- package/src/index.js +15 -15
- package/src/locus-info/controlsUtils.ts +112 -112
- package/src/locus-info/embeddedAppsUtils.ts +57 -57
- package/src/locus-info/fullState.ts +69 -69
- package/src/locus-info/hostUtils.ts +60 -60
- package/src/locus-info/index.ts +1303 -1303
- package/src/locus-info/infoUtils.ts +101 -101
- package/src/locus-info/mediaSharesUtils.ts +173 -173
- package/src/locus-info/parser.ts +680 -680
- package/src/locus-info/selfUtils.ts +428 -428
- package/src/media/index.ts +675 -675
- package/src/media/properties.ts +313 -313
- package/src/media/util.ts +37 -37
- package/src/mediaQualityMetrics/config.ts +382 -382
- package/src/meeting/effectsState.ts +209 -209
- package/src/meeting/in-meeting-actions.ts +153 -153
- package/src/meeting/index.ts +6537 -6543
- package/src/meeting/muteState.ts +365 -365
- package/src/meeting/request.ts +810 -810
- package/src/meeting/state.ts +194 -194
- package/src/meeting/util.ts +530 -530
- package/src/meeting-info/collection.ts +41 -41
- package/src/meeting-info/index.ts +137 -137
- package/src/meeting-info/meeting-info-v2.ts +273 -273
- package/src/meeting-info/request.ts +46 -46
- package/src/meeting-info/util.ts +314 -314
- package/src/meeting-info/utilv2.ts +324 -324
- package/src/meetings/collection.ts +43 -43
- package/src/meetings/index.ts +1128 -1128
- package/src/meetings/request.ts +81 -81
- package/src/meetings/util.ts +181 -181
- package/src/member/index.ts +446 -446
- package/src/member/member.types.ts +13 -13
- package/src/member/util.ts +286 -286
- package/src/members/collection.ts +40 -40
- package/src/members/index.ts +900 -900
- package/src/members/request.ts +175 -175
- package/src/members/util.ts +260 -260
- package/src/metrics/config.ts +485 -485
- package/src/metrics/constants.ts +61 -61
- package/src/metrics/index.ts +543 -543
- package/src/networkQualityMonitor/index.ts +211 -211
- package/src/peer-connection-manager/index.ts +847 -847
- package/src/peer-connection-manager/util.ts +119 -119
- package/src/personal-meeting-room/index.ts +157 -157
- package/src/personal-meeting-room/request.ts +48 -48
- package/src/personal-meeting-room/util.ts +49 -49
- package/src/reachability/index.ts +478 -478
- package/src/reachability/request.ts +81 -81
- package/src/reactions/reactions.ts +104 -104
- package/src/reactions/reactions.type.ts +36 -36
- package/src/reconnection-manager/index.ts +622 -622
- package/src/recording-controller/enums.ts +8 -8
- package/src/recording-controller/index.ts +315 -315
- package/src/recording-controller/util.ts +58 -58
- package/src/roap/collection.ts +62 -62
- package/src/roap/handler.ts +294 -294
- package/src/roap/index.ts +413 -413
- package/src/roap/request.ts +229 -229
- package/src/roap/state.ts +156 -156
- package/src/roap/turnDiscovery.ts +283 -283
- package/src/roap/util.ts +100 -100
- package/src/statsAnalyzer/global.ts +128 -128
- package/src/statsAnalyzer/index.ts +1266 -1266
- package/src/statsAnalyzer/mqaUtil.ts +290 -290
- package/src/transcription/index.ts +154 -154
- package/test/integration/spec/journey.js +941 -941
- package/test/integration/spec/space-meeting.js +457 -457
- package/test/integration/spec/transcription.js +55 -55
- package/test/unit/spec/common/browser-detection.js +119 -119
- package/test/unit/spec/common/queue.js +69 -69
- package/test/unit/spec/controls-options-manager/index.js +123 -123
- package/test/unit/spec/controls-options-manager/util.js +65 -65
- package/test/unit/spec/fixture/locus.js +406 -406
- package/test/unit/spec/locus-info/controlsUtils.js +82 -82
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +104 -104
- package/test/unit/spec/locus-info/index.js +1272 -1272
- package/test/unit/spec/locus-info/infoUtils.js +138 -138
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +975 -975
- package/test/unit/spec/locus-info/lib/SeqCmp.json +522 -522
- package/test/unit/spec/locus-info/lib/selfConstant.js +286 -286
- package/test/unit/spec/locus-info/parser.js +298 -298
- package/test/unit/spec/locus-info/selfUtils.js +185 -185
- package/test/unit/spec/media/properties.ts +305 -305
- package/test/unit/spec/meeting/effectsState.js +281 -281
- package/test/unit/spec/meeting/in-meeting-actions.ts +90 -90
- package/test/unit/spec/meeting/index.js +5227 -5227
- package/test/unit/spec/meeting/muteState.js +430 -430
- package/test/unit/spec/meeting/request.js +317 -317
- package/test/unit/spec/meeting/utils.js +319 -319
- package/test/unit/spec/meeting-info/meetinginfov2.js +376 -376
- package/test/unit/spec/meeting-info/request.js +64 -64
- package/test/unit/spec/meeting-info/util.js +37 -37
- package/test/unit/spec/meeting-info/utilv2.js +330 -330
- package/test/unit/spec/meetings/collection.js +52 -52
- package/test/unit/spec/meetings/index.js +1375 -1375
- package/test/unit/spec/meetings/utils.js +66 -66
- package/test/unit/spec/member/index.js +47 -47
- package/test/unit/spec/member/util.js +80 -80
- package/test/unit/spec/members/index.js +364 -364
- package/test/unit/spec/members/request.js +200 -200
- package/test/unit/spec/members/utils.js +42 -42
- package/test/unit/spec/metrics/index.js +111 -111
- package/test/unit/spec/networkQualityMonitor/index.js +99 -99
- package/test/unit/spec/peerconnection-manager/index.js +218 -218
- package/test/unit/spec/peerconnection-manager/utils.js +49 -49
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +388 -388
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +29 -29
- package/test/unit/spec/reachability/index.ts +50 -50
- package/test/unit/spec/reconnection-manager/index.js +206 -206
- package/test/unit/spec/recording-controller/index.js +230 -230
- package/test/unit/spec/recording-controller/util.js +101 -101
- package/test/unit/spec/roap/index.ts +128 -128
- package/test/unit/spec/roap/turnDiscovery.ts +372 -372
- package/test/unit/spec/roap/util.js +30 -30
- package/test/unit/spec/stats-analyzer/index.js +287 -287
- package/test/utils/cmr.js +104 -104
- package/test/utils/testUtils.js +287 -287
- package/test/utils/webex-config.js +77 -77
- package/test/utils/webex-test-users.js +82 -82
- package/tsconfig.json +5 -5
package/src/roap/index.ts
CHANGED
|
@@ -1,413 +1,413 @@
|
|
|
1
|
-
// @ts-ignore
|
|
2
|
-
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
3
|
-
|
|
4
|
-
import {ROAP} from '../constants';
|
|
5
|
-
import LoggerProxy from '../common/logs/logger-proxy';
|
|
6
|
-
import MeetingUtil from '../meeting/util';
|
|
7
|
-
|
|
8
|
-
import RoapHandler from './handler';
|
|
9
|
-
import RoapRequest from './request';
|
|
10
|
-
import RoapCollection from './collection';
|
|
11
|
-
import TurnDiscovery from './turnDiscovery';
|
|
12
|
-
import Meeting from '../meeting';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Roap options
|
|
16
|
-
* @typedef {Object} RoapOptions
|
|
17
|
-
* @property {String} sdp
|
|
18
|
-
* @property {Meeting} meeting
|
|
19
|
-
* @property {Number} roapSeq
|
|
20
|
-
* @property {Boolean} reconnect
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* @typedef {Object} SeqOptions
|
|
25
|
-
* @property {String} correlationId
|
|
26
|
-
* @property {String} mediaId
|
|
27
|
-
* @property {Number} seq
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* @class Roap
|
|
32
|
-
* @export
|
|
33
|
-
* @private
|
|
34
|
-
*/
|
|
35
|
-
export default class Roap extends StatelessWebexPlugin {
|
|
36
|
-
attrs: any;
|
|
37
|
-
lastRoapOffer: any;
|
|
38
|
-
options: any;
|
|
39
|
-
roapHandler: any;
|
|
40
|
-
roapRequest: any;
|
|
41
|
-
turnDiscovery: any;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
*
|
|
45
|
-
* @param {Object} attrs
|
|
46
|
-
* @param {Object} options
|
|
47
|
-
*/
|
|
48
|
-
constructor(attrs: any, options: any) {
|
|
49
|
-
super({}, options);
|
|
50
|
-
/**
|
|
51
|
-
* @instance
|
|
52
|
-
* @type {Object}
|
|
53
|
-
* @private
|
|
54
|
-
* @memberof Roap
|
|
55
|
-
*/
|
|
56
|
-
this.attrs = attrs;
|
|
57
|
-
/**
|
|
58
|
-
* @instance
|
|
59
|
-
* @type {Object}
|
|
60
|
-
* @private
|
|
61
|
-
* @memberof Roap
|
|
62
|
-
*/
|
|
63
|
-
this.options = options;
|
|
64
|
-
/**
|
|
65
|
-
* The Roap Process State Handler
|
|
66
|
-
* @instance
|
|
67
|
-
* @type {RoapHandler}
|
|
68
|
-
* @private
|
|
69
|
-
* @memberof Roap
|
|
70
|
-
*/
|
|
71
|
-
this.roapHandler = new RoapHandler(
|
|
72
|
-
this.attrs,
|
|
73
|
-
this.options,
|
|
74
|
-
this.sendRoapOK.bind(this),
|
|
75
|
-
this.sendRoapAnswer.bind(this),
|
|
76
|
-
this.roapFinished.bind(this)
|
|
77
|
-
);
|
|
78
|
-
/**
|
|
79
|
-
* The Roap Request Server Proxy Object
|
|
80
|
-
* @instance
|
|
81
|
-
* @type {RoapRequest}
|
|
82
|
-
* @private
|
|
83
|
-
* @memberof Roap
|
|
84
|
-
*/
|
|
85
|
-
// @ts-ignore
|
|
86
|
-
this.roapRequest = new RoapRequest({}, options);
|
|
87
|
-
/**
|
|
88
|
-
* The last roap offer sent to server and acked
|
|
89
|
-
* @instance
|
|
90
|
-
* @type {Object}
|
|
91
|
-
* @private
|
|
92
|
-
* @memberof Roap
|
|
93
|
-
*/
|
|
94
|
-
this.lastRoapOffer = {};
|
|
95
|
-
|
|
96
|
-
this.turnDiscovery = new TurnDiscovery(this.roapRequest);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Starts listening to mercury events for Roap messages
|
|
101
|
-
* @param {object} data event object
|
|
102
|
-
* @returns {Promise}
|
|
103
|
-
* @private
|
|
104
|
-
* @memberof Roap
|
|
105
|
-
*/
|
|
106
|
-
private roapEvent(data: any) {
|
|
107
|
-
const msg = data.message;
|
|
108
|
-
const {correlationId} = data;
|
|
109
|
-
|
|
110
|
-
LoggerProxy.logger.log(
|
|
111
|
-
`Roap:index#roapEvent --> Received Roap Message [${JSON.stringify(msg, null, 2)}]`
|
|
112
|
-
);
|
|
113
|
-
|
|
114
|
-
if (msg.messageType === ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {
|
|
115
|
-
// turn discovery is not part of normal roap protocol and so we are not handling it
|
|
116
|
-
// through the usual roap state machine
|
|
117
|
-
this.turnDiscovery.handleTurnDiscoveryResponse(msg);
|
|
118
|
-
} else {
|
|
119
|
-
this.roapHandler.submit({
|
|
120
|
-
type: ROAP.RECEIVE_ROAP_MSG,
|
|
121
|
-
msg,
|
|
122
|
-
correlationId,
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
*
|
|
129
|
-
* @param {String} correlationId correlation id of a meeting
|
|
130
|
-
* @param {Number} seq ROAP sequence number
|
|
131
|
-
* @returns {Promise}
|
|
132
|
-
* @private
|
|
133
|
-
* @memberof Roap
|
|
134
|
-
*/
|
|
135
|
-
private stop(correlationId: string, seq: number) {
|
|
136
|
-
this.roapHandler.submit({
|
|
137
|
-
type: ROAP.RECEIVE_CALL_LEAVE,
|
|
138
|
-
seq,
|
|
139
|
-
correlationId,
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
return Promise.resolve();
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
*
|
|
147
|
-
* @param {SeqOptions} options
|
|
148
|
-
* @returns {null}
|
|
149
|
-
* @private
|
|
150
|
-
* @memberof Roap
|
|
151
|
-
*/
|
|
152
|
-
private sendRoapOK(options: any) {
|
|
153
|
-
return Promise.resolve().then(() => {
|
|
154
|
-
// @ts-ignore
|
|
155
|
-
const meeting = this.webex.meetings.meetingCollection.getByKey(
|
|
156
|
-
'correlationId',
|
|
157
|
-
options.correlationId
|
|
158
|
-
);
|
|
159
|
-
const roapMessage = {
|
|
160
|
-
messageType: ROAP.ROAP_TYPES.OK,
|
|
161
|
-
version: ROAP.ROAP_VERSION,
|
|
162
|
-
seq: options.seq,
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sending with seq ${options.seq}`);
|
|
166
|
-
|
|
167
|
-
return this.roapRequest
|
|
168
|
-
.sendRoap({
|
|
169
|
-
roapMessage,
|
|
170
|
-
locusSelfUrl: meeting.selfUrl,
|
|
171
|
-
mediaId: options.mediaId,
|
|
172
|
-
correlationId: options.correlationId,
|
|
173
|
-
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
174
|
-
videoMuted: meeting.video?.isLocallyMuted(),
|
|
175
|
-
meetingId: meeting.id,
|
|
176
|
-
})
|
|
177
|
-
.then(() => {
|
|
178
|
-
this.roapHandler.submit({
|
|
179
|
-
type: ROAP.SEND_ROAP_MSG,
|
|
180
|
-
msg: roapMessage,
|
|
181
|
-
correlationId: options.correlationId,
|
|
182
|
-
});
|
|
183
|
-
LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sent with seq ${options.seq}`);
|
|
184
|
-
meeting.setRoapSeq(options.seq);
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// eslint-disable-next-line no-warning-comments
|
|
190
|
-
// TODO: try to merge sendRoapOk and roapAnswer
|
|
191
|
-
/**
|
|
192
|
-
* Sends a ROAP answer...
|
|
193
|
-
* @param {SeqOptions} options
|
|
194
|
-
* @param {Boolean} options.audioMuted
|
|
195
|
-
* @param {Boolean} options.videoMuted
|
|
196
|
-
* @returns {Promise}
|
|
197
|
-
* @private
|
|
198
|
-
* @memberof Roap
|
|
199
|
-
*/
|
|
200
|
-
private sendRoapAnswer(options: any) {
|
|
201
|
-
// @ts-ignore
|
|
202
|
-
const meeting = this.webex.meetings.meetingCollection.getByKey(
|
|
203
|
-
'correlationId',
|
|
204
|
-
options.correlationId
|
|
205
|
-
);
|
|
206
|
-
const roapMessage = {
|
|
207
|
-
messageType: ROAP.ROAP_TYPES.ANSWER,
|
|
208
|
-
sdps: options.sdps,
|
|
209
|
-
version: ROAP.ROAP_VERSION,
|
|
210
|
-
seq: options.seq,
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
this.roapHandler.submit({
|
|
214
|
-
type: ROAP.SEND_ROAP_MSG,
|
|
215
|
-
msg: roapMessage,
|
|
216
|
-
correlationId: options.correlationId,
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
return this.roapRequest
|
|
220
|
-
.sendRoap({
|
|
221
|
-
roapMessage,
|
|
222
|
-
locusSelfUrl: meeting.selfUrl,
|
|
223
|
-
mediaId: options.mediaId,
|
|
224
|
-
correlationId: options.correlationId,
|
|
225
|
-
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
226
|
-
videoMuted: meeting.video?.isLocallyMuted(),
|
|
227
|
-
meetingId: meeting.id,
|
|
228
|
-
})
|
|
229
|
-
.then(() => {
|
|
230
|
-
meeting.setRoapSeq(options.seq);
|
|
231
|
-
|
|
232
|
-
this.roapHandler.submit({
|
|
233
|
-
type: ROAP.SEND_ROAP_MSG_SUCCESS,
|
|
234
|
-
seq: roapMessage.seq,
|
|
235
|
-
correlationId: meeting.correlationId,
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Sends a ROAP error...
|
|
242
|
-
* @param {Object} session
|
|
243
|
-
* @param {Object} locus
|
|
244
|
-
* @param {String} errorType
|
|
245
|
-
* @returns {Promise}
|
|
246
|
-
* @private
|
|
247
|
-
* @memberof Roap
|
|
248
|
-
*/
|
|
249
|
-
private sendRoapError(session: any, locus: object, errorType: string) {
|
|
250
|
-
const msg = {
|
|
251
|
-
messageType: ROAP.ROAP_TYPES.ERROR,
|
|
252
|
-
version: ROAP.ROAP_VERSION,
|
|
253
|
-
errorType,
|
|
254
|
-
seq: session.OFFER.seq,
|
|
255
|
-
};
|
|
256
|
-
|
|
257
|
-
return this.roapRequest.sendRoap(msg, locus);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* sends a roap media request
|
|
262
|
-
* @param {RoapOptions} options
|
|
263
|
-
* @returns {Promise}
|
|
264
|
-
* @private
|
|
265
|
-
* @memberof Roap
|
|
266
|
-
*/
|
|
267
|
-
sendRoapMediaRequest(options: any) {
|
|
268
|
-
const {meeting, reconnect} = options;
|
|
269
|
-
const roapMessage = {
|
|
270
|
-
messageType: ROAP.ROAP_TYPES.OFFER,
|
|
271
|
-
sdps: [options.sdp],
|
|
272
|
-
// sdps: [options.sdp],
|
|
273
|
-
version: ROAP.ROAP_VERSION,
|
|
274
|
-
seq:
|
|
275
|
-
typeof options.roapSeq !== 'number' && Number.isNaN(parseFloat(options.roapSeq))
|
|
276
|
-
? 0
|
|
277
|
-
: options.roapSeq + 1,
|
|
278
|
-
tieBreaker: 4294967294, // Math.floor(Math.random() * (2 ** 32) - 1) // TODO: Handle the roap conflict scenario
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
this.roapHandler.submit({
|
|
282
|
-
type: ROAP.SEND_ROAP_MSG,
|
|
283
|
-
msg: roapMessage,
|
|
284
|
-
correlationId: meeting.correlationId,
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
// When reconnecting, it's important that the first roap message being sent out has empty media id.
|
|
288
|
-
// Normally this is the roap offer, but when TURN discovery is enabled,
|
|
289
|
-
// then this is the TURN discovery request message
|
|
290
|
-
const sendEmptyMediaId = reconnect && !meeting.config.experimental.enableTurnDiscovery;
|
|
291
|
-
|
|
292
|
-
return this.roapRequest
|
|
293
|
-
.sendRoap({
|
|
294
|
-
roapMessage,
|
|
295
|
-
correlationId: meeting.correlationId,
|
|
296
|
-
locusSelfUrl: meeting.selfUrl,
|
|
297
|
-
mediaId: sendEmptyMediaId ? '' : meeting.mediaId,
|
|
298
|
-
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
299
|
-
videoMuted: meeting.video?.isLocallyMuted(),
|
|
300
|
-
meetingId: meeting.id,
|
|
301
|
-
})
|
|
302
|
-
.then(({locus, mediaConnections}) => {
|
|
303
|
-
this.roapHandler.submit({
|
|
304
|
-
type: ROAP.SEND_ROAP_MSG_SUCCESS,
|
|
305
|
-
seq: roapMessage.seq,
|
|
306
|
-
correlationId: meeting.correlationId,
|
|
307
|
-
});
|
|
308
|
-
meeting.setRoapSeq(roapMessage.seq);
|
|
309
|
-
|
|
310
|
-
if (mediaConnections) {
|
|
311
|
-
meeting.updateMediaConnections(mediaConnections);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
// eslint-disable-next-line no-warning-comments
|
|
315
|
-
// TODO: we need to attach peerconenction to locus not sure if we need to pass everything here
|
|
316
|
-
return locus;
|
|
317
|
-
// eslint-disable-next-line no-warning-comments
|
|
318
|
-
// TODO: check where to update the sequence number
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* sends a roap media request
|
|
324
|
-
* @param {RoapOptions} options
|
|
325
|
-
* @returns {Promise}
|
|
326
|
-
* @private
|
|
327
|
-
* @memberof Roap
|
|
328
|
-
*/
|
|
329
|
-
sendRoapCallRequest = (options: any) => {
|
|
330
|
-
const {meeting} = options;
|
|
331
|
-
const roapMessage = {
|
|
332
|
-
messageType: ROAP.ROAP_TYPES.OFFER,
|
|
333
|
-
sdps: [options.sdp],
|
|
334
|
-
version: ROAP.ROAP_VERSION,
|
|
335
|
-
seq:
|
|
336
|
-
typeof options.roapSeq !== 'number' && Number.isNaN(parseFloat(options.roapSeq))
|
|
337
|
-
? 0
|
|
338
|
-
: options.roapSeq + 1,
|
|
339
|
-
tieBreaker: 4294967294, // Math.floor(Math.random() * (2 ** 32) - 1) // TODO: Handle the roap conflict scenario
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
this.roapHandler.submit({
|
|
343
|
-
type: ROAP.SEND_ROAP_MSG,
|
|
344
|
-
msg: roapMessage,
|
|
345
|
-
correlationId: meeting.correlationId,
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
const roapBody = {
|
|
349
|
-
localMedias: [
|
|
350
|
-
{
|
|
351
|
-
localSdp: JSON.stringify(
|
|
352
|
-
this.roapRequest.attachRechabilityData({
|
|
353
|
-
roapMessage,
|
|
354
|
-
// eslint-disable-next-line no-warning-comments
|
|
355
|
-
// TODO: check whats the need for video and audiomute
|
|
356
|
-
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
357
|
-
videoMuted: meeting.video?.isLocallyMuted(),
|
|
358
|
-
})
|
|
359
|
-
),
|
|
360
|
-
// mediaId: meeting.mediaId
|
|
361
|
-
},
|
|
362
|
-
],
|
|
363
|
-
};
|
|
364
|
-
|
|
365
|
-
return MeetingUtil.joinMeetingOptions(meeting, {roapMessage: roapBody}).then((locus) => {
|
|
366
|
-
this.roapHandler.submit({
|
|
367
|
-
type: ROAP.SEND_ROAP_MSG_SUCCESS,
|
|
368
|
-
seq: roapMessage.seq,
|
|
369
|
-
correlationId: meeting.correlationId,
|
|
370
|
-
});
|
|
371
|
-
meeting.setRoapSeq(roapMessage.seq);
|
|
372
|
-
|
|
373
|
-
// eslint-disable-next-line no-warning-comments
|
|
374
|
-
// TODO: we need to attach peerconenction to locus not sure if we need to pass everything here
|
|
375
|
-
return locus;
|
|
376
|
-
// eslint-disable-next-line no-warning-comments
|
|
377
|
-
// TODO: check where to update the sequence number
|
|
378
|
-
});
|
|
379
|
-
};
|
|
380
|
-
|
|
381
|
-
/**
|
|
382
|
-
* Called when the roap sequence is finished (completed successfully or failed)
|
|
383
|
-
* @param {String} correlationId id of the meeting affected
|
|
384
|
-
* @param {String} sequenceId the id of the finished sequence
|
|
385
|
-
* @returns {undefined}
|
|
386
|
-
* @private
|
|
387
|
-
* @memberof Roap
|
|
388
|
-
*/
|
|
389
|
-
private roapFinished(correlationId: string, sequenceId: string) {
|
|
390
|
-
RoapCollection.onSessionSequenceFinish(correlationId, sequenceId);
|
|
391
|
-
// @ts-ignore
|
|
392
|
-
const meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', correlationId);
|
|
393
|
-
|
|
394
|
-
meeting.mediaNegotiatedEvent();
|
|
395
|
-
if (!RoapCollection.isBusy(correlationId)) {
|
|
396
|
-
meeting.processNextQueuedMediaUpdate();
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
/**
|
|
401
|
-
* Performs a TURN server discovery procedure, which involves exchanging
|
|
402
|
-
* some roap messages with the server. This exchange has to be done before
|
|
403
|
-
* any other roap messages are sent
|
|
404
|
-
*
|
|
405
|
-
* @param {Meeting} meeting
|
|
406
|
-
* @param {Boolean} isReconnecting should be set to true if this is a new
|
|
407
|
-
* media connection just after a reconnection
|
|
408
|
-
* @returns {Promise}
|
|
409
|
-
*/
|
|
410
|
-
doTurnDiscovery(meeting: Meeting, isReconnecting: boolean) {
|
|
411
|
-
return this.turnDiscovery.doTurnDiscovery(meeting, isReconnecting);
|
|
412
|
-
}
|
|
413
|
-
}
|
|
1
|
+
// @ts-ignore
|
|
2
|
+
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
3
|
+
|
|
4
|
+
import {ROAP} from '../constants';
|
|
5
|
+
import LoggerProxy from '../common/logs/logger-proxy';
|
|
6
|
+
import MeetingUtil from '../meeting/util';
|
|
7
|
+
|
|
8
|
+
import RoapHandler from './handler';
|
|
9
|
+
import RoapRequest from './request';
|
|
10
|
+
import RoapCollection from './collection';
|
|
11
|
+
import TurnDiscovery from './turnDiscovery';
|
|
12
|
+
import Meeting from '../meeting';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Roap options
|
|
16
|
+
* @typedef {Object} RoapOptions
|
|
17
|
+
* @property {String} sdp
|
|
18
|
+
* @property {Meeting} meeting
|
|
19
|
+
* @property {Number} roapSeq
|
|
20
|
+
* @property {Boolean} reconnect
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @typedef {Object} SeqOptions
|
|
25
|
+
* @property {String} correlationId
|
|
26
|
+
* @property {String} mediaId
|
|
27
|
+
* @property {Number} seq
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @class Roap
|
|
32
|
+
* @export
|
|
33
|
+
* @private
|
|
34
|
+
*/
|
|
35
|
+
export default class Roap extends StatelessWebexPlugin {
|
|
36
|
+
attrs: any;
|
|
37
|
+
lastRoapOffer: any;
|
|
38
|
+
options: any;
|
|
39
|
+
roapHandler: any;
|
|
40
|
+
roapRequest: any;
|
|
41
|
+
turnDiscovery: any;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
* @param {Object} attrs
|
|
46
|
+
* @param {Object} options
|
|
47
|
+
*/
|
|
48
|
+
constructor(attrs: any, options: any) {
|
|
49
|
+
super({}, options);
|
|
50
|
+
/**
|
|
51
|
+
* @instance
|
|
52
|
+
* @type {Object}
|
|
53
|
+
* @private
|
|
54
|
+
* @memberof Roap
|
|
55
|
+
*/
|
|
56
|
+
this.attrs = attrs;
|
|
57
|
+
/**
|
|
58
|
+
* @instance
|
|
59
|
+
* @type {Object}
|
|
60
|
+
* @private
|
|
61
|
+
* @memberof Roap
|
|
62
|
+
*/
|
|
63
|
+
this.options = options;
|
|
64
|
+
/**
|
|
65
|
+
* The Roap Process State Handler
|
|
66
|
+
* @instance
|
|
67
|
+
* @type {RoapHandler}
|
|
68
|
+
* @private
|
|
69
|
+
* @memberof Roap
|
|
70
|
+
*/
|
|
71
|
+
this.roapHandler = new RoapHandler(
|
|
72
|
+
this.attrs,
|
|
73
|
+
this.options,
|
|
74
|
+
this.sendRoapOK.bind(this),
|
|
75
|
+
this.sendRoapAnswer.bind(this),
|
|
76
|
+
this.roapFinished.bind(this)
|
|
77
|
+
);
|
|
78
|
+
/**
|
|
79
|
+
* The Roap Request Server Proxy Object
|
|
80
|
+
* @instance
|
|
81
|
+
* @type {RoapRequest}
|
|
82
|
+
* @private
|
|
83
|
+
* @memberof Roap
|
|
84
|
+
*/
|
|
85
|
+
// @ts-ignore
|
|
86
|
+
this.roapRequest = new RoapRequest({}, options);
|
|
87
|
+
/**
|
|
88
|
+
* The last roap offer sent to server and acked
|
|
89
|
+
* @instance
|
|
90
|
+
* @type {Object}
|
|
91
|
+
* @private
|
|
92
|
+
* @memberof Roap
|
|
93
|
+
*/
|
|
94
|
+
this.lastRoapOffer = {};
|
|
95
|
+
|
|
96
|
+
this.turnDiscovery = new TurnDiscovery(this.roapRequest);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Starts listening to mercury events for Roap messages
|
|
101
|
+
* @param {object} data event object
|
|
102
|
+
* @returns {Promise}
|
|
103
|
+
* @private
|
|
104
|
+
* @memberof Roap
|
|
105
|
+
*/
|
|
106
|
+
private roapEvent(data: any) {
|
|
107
|
+
const msg = data.message;
|
|
108
|
+
const {correlationId} = data;
|
|
109
|
+
|
|
110
|
+
LoggerProxy.logger.log(
|
|
111
|
+
`Roap:index#roapEvent --> Received Roap Message [${JSON.stringify(msg, null, 2)}]`
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
if (msg.messageType === ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {
|
|
115
|
+
// turn discovery is not part of normal roap protocol and so we are not handling it
|
|
116
|
+
// through the usual roap state machine
|
|
117
|
+
this.turnDiscovery.handleTurnDiscoveryResponse(msg);
|
|
118
|
+
} else {
|
|
119
|
+
this.roapHandler.submit({
|
|
120
|
+
type: ROAP.RECEIVE_ROAP_MSG,
|
|
121
|
+
msg,
|
|
122
|
+
correlationId,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
*
|
|
129
|
+
* @param {String} correlationId correlation id of a meeting
|
|
130
|
+
* @param {Number} seq ROAP sequence number
|
|
131
|
+
* @returns {Promise}
|
|
132
|
+
* @private
|
|
133
|
+
* @memberof Roap
|
|
134
|
+
*/
|
|
135
|
+
private stop(correlationId: string, seq: number) {
|
|
136
|
+
this.roapHandler.submit({
|
|
137
|
+
type: ROAP.RECEIVE_CALL_LEAVE,
|
|
138
|
+
seq,
|
|
139
|
+
correlationId,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
return Promise.resolve();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
*
|
|
147
|
+
* @param {SeqOptions} options
|
|
148
|
+
* @returns {null}
|
|
149
|
+
* @private
|
|
150
|
+
* @memberof Roap
|
|
151
|
+
*/
|
|
152
|
+
private sendRoapOK(options: any) {
|
|
153
|
+
return Promise.resolve().then(() => {
|
|
154
|
+
// @ts-ignore
|
|
155
|
+
const meeting = this.webex.meetings.meetingCollection.getByKey(
|
|
156
|
+
'correlationId',
|
|
157
|
+
options.correlationId
|
|
158
|
+
);
|
|
159
|
+
const roapMessage = {
|
|
160
|
+
messageType: ROAP.ROAP_TYPES.OK,
|
|
161
|
+
version: ROAP.ROAP_VERSION,
|
|
162
|
+
seq: options.seq,
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sending with seq ${options.seq}`);
|
|
166
|
+
|
|
167
|
+
return this.roapRequest
|
|
168
|
+
.sendRoap({
|
|
169
|
+
roapMessage,
|
|
170
|
+
locusSelfUrl: meeting.selfUrl,
|
|
171
|
+
mediaId: options.mediaId,
|
|
172
|
+
correlationId: options.correlationId,
|
|
173
|
+
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
174
|
+
videoMuted: meeting.video?.isLocallyMuted(),
|
|
175
|
+
meetingId: meeting.id,
|
|
176
|
+
})
|
|
177
|
+
.then(() => {
|
|
178
|
+
this.roapHandler.submit({
|
|
179
|
+
type: ROAP.SEND_ROAP_MSG,
|
|
180
|
+
msg: roapMessage,
|
|
181
|
+
correlationId: options.correlationId,
|
|
182
|
+
});
|
|
183
|
+
LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sent with seq ${options.seq}`);
|
|
184
|
+
meeting.setRoapSeq(options.seq);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// eslint-disable-next-line no-warning-comments
|
|
190
|
+
// TODO: try to merge sendRoapOk and roapAnswer
|
|
191
|
+
/**
|
|
192
|
+
* Sends a ROAP answer...
|
|
193
|
+
* @param {SeqOptions} options
|
|
194
|
+
* @param {Boolean} options.audioMuted
|
|
195
|
+
* @param {Boolean} options.videoMuted
|
|
196
|
+
* @returns {Promise}
|
|
197
|
+
* @private
|
|
198
|
+
* @memberof Roap
|
|
199
|
+
*/
|
|
200
|
+
private sendRoapAnswer(options: any) {
|
|
201
|
+
// @ts-ignore
|
|
202
|
+
const meeting = this.webex.meetings.meetingCollection.getByKey(
|
|
203
|
+
'correlationId',
|
|
204
|
+
options.correlationId
|
|
205
|
+
);
|
|
206
|
+
const roapMessage = {
|
|
207
|
+
messageType: ROAP.ROAP_TYPES.ANSWER,
|
|
208
|
+
sdps: options.sdps,
|
|
209
|
+
version: ROAP.ROAP_VERSION,
|
|
210
|
+
seq: options.seq,
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
this.roapHandler.submit({
|
|
214
|
+
type: ROAP.SEND_ROAP_MSG,
|
|
215
|
+
msg: roapMessage,
|
|
216
|
+
correlationId: options.correlationId,
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
return this.roapRequest
|
|
220
|
+
.sendRoap({
|
|
221
|
+
roapMessage,
|
|
222
|
+
locusSelfUrl: meeting.selfUrl,
|
|
223
|
+
mediaId: options.mediaId,
|
|
224
|
+
correlationId: options.correlationId,
|
|
225
|
+
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
226
|
+
videoMuted: meeting.video?.isLocallyMuted(),
|
|
227
|
+
meetingId: meeting.id,
|
|
228
|
+
})
|
|
229
|
+
.then(() => {
|
|
230
|
+
meeting.setRoapSeq(options.seq);
|
|
231
|
+
|
|
232
|
+
this.roapHandler.submit({
|
|
233
|
+
type: ROAP.SEND_ROAP_MSG_SUCCESS,
|
|
234
|
+
seq: roapMessage.seq,
|
|
235
|
+
correlationId: meeting.correlationId,
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Sends a ROAP error...
|
|
242
|
+
* @param {Object} session
|
|
243
|
+
* @param {Object} locus
|
|
244
|
+
* @param {String} errorType
|
|
245
|
+
* @returns {Promise}
|
|
246
|
+
* @private
|
|
247
|
+
* @memberof Roap
|
|
248
|
+
*/
|
|
249
|
+
private sendRoapError(session: any, locus: object, errorType: string) {
|
|
250
|
+
const msg = {
|
|
251
|
+
messageType: ROAP.ROAP_TYPES.ERROR,
|
|
252
|
+
version: ROAP.ROAP_VERSION,
|
|
253
|
+
errorType,
|
|
254
|
+
seq: session.OFFER.seq,
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
return this.roapRequest.sendRoap(msg, locus);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* sends a roap media request
|
|
262
|
+
* @param {RoapOptions} options
|
|
263
|
+
* @returns {Promise}
|
|
264
|
+
* @private
|
|
265
|
+
* @memberof Roap
|
|
266
|
+
*/
|
|
267
|
+
sendRoapMediaRequest(options: any) {
|
|
268
|
+
const {meeting, reconnect} = options;
|
|
269
|
+
const roapMessage = {
|
|
270
|
+
messageType: ROAP.ROAP_TYPES.OFFER,
|
|
271
|
+
sdps: [options.sdp],
|
|
272
|
+
// sdps: [options.sdp],
|
|
273
|
+
version: ROAP.ROAP_VERSION,
|
|
274
|
+
seq:
|
|
275
|
+
typeof options.roapSeq !== 'number' && Number.isNaN(parseFloat(options.roapSeq))
|
|
276
|
+
? 0
|
|
277
|
+
: options.roapSeq + 1,
|
|
278
|
+
tieBreaker: 4294967294, // Math.floor(Math.random() * (2 ** 32) - 1) // TODO: Handle the roap conflict scenario
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
this.roapHandler.submit({
|
|
282
|
+
type: ROAP.SEND_ROAP_MSG,
|
|
283
|
+
msg: roapMessage,
|
|
284
|
+
correlationId: meeting.correlationId,
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
// When reconnecting, it's important that the first roap message being sent out has empty media id.
|
|
288
|
+
// Normally this is the roap offer, but when TURN discovery is enabled,
|
|
289
|
+
// then this is the TURN discovery request message
|
|
290
|
+
const sendEmptyMediaId = reconnect && !meeting.config.experimental.enableTurnDiscovery;
|
|
291
|
+
|
|
292
|
+
return this.roapRequest
|
|
293
|
+
.sendRoap({
|
|
294
|
+
roapMessage,
|
|
295
|
+
correlationId: meeting.correlationId,
|
|
296
|
+
locusSelfUrl: meeting.selfUrl,
|
|
297
|
+
mediaId: sendEmptyMediaId ? '' : meeting.mediaId,
|
|
298
|
+
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
299
|
+
videoMuted: meeting.video?.isLocallyMuted(),
|
|
300
|
+
meetingId: meeting.id,
|
|
301
|
+
})
|
|
302
|
+
.then(({locus, mediaConnections}) => {
|
|
303
|
+
this.roapHandler.submit({
|
|
304
|
+
type: ROAP.SEND_ROAP_MSG_SUCCESS,
|
|
305
|
+
seq: roapMessage.seq,
|
|
306
|
+
correlationId: meeting.correlationId,
|
|
307
|
+
});
|
|
308
|
+
meeting.setRoapSeq(roapMessage.seq);
|
|
309
|
+
|
|
310
|
+
if (mediaConnections) {
|
|
311
|
+
meeting.updateMediaConnections(mediaConnections);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// eslint-disable-next-line no-warning-comments
|
|
315
|
+
// TODO: we need to attach peerconenction to locus not sure if we need to pass everything here
|
|
316
|
+
return locus;
|
|
317
|
+
// eslint-disable-next-line no-warning-comments
|
|
318
|
+
// TODO: check where to update the sequence number
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* sends a roap media request
|
|
324
|
+
* @param {RoapOptions} options
|
|
325
|
+
* @returns {Promise}
|
|
326
|
+
* @private
|
|
327
|
+
* @memberof Roap
|
|
328
|
+
*/
|
|
329
|
+
sendRoapCallRequest = (options: any) => {
|
|
330
|
+
const {meeting} = options;
|
|
331
|
+
const roapMessage = {
|
|
332
|
+
messageType: ROAP.ROAP_TYPES.OFFER,
|
|
333
|
+
sdps: [options.sdp],
|
|
334
|
+
version: ROAP.ROAP_VERSION,
|
|
335
|
+
seq:
|
|
336
|
+
typeof options.roapSeq !== 'number' && Number.isNaN(parseFloat(options.roapSeq))
|
|
337
|
+
? 0
|
|
338
|
+
: options.roapSeq + 1,
|
|
339
|
+
tieBreaker: 4294967294, // Math.floor(Math.random() * (2 ** 32) - 1) // TODO: Handle the roap conflict scenario
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
this.roapHandler.submit({
|
|
343
|
+
type: ROAP.SEND_ROAP_MSG,
|
|
344
|
+
msg: roapMessage,
|
|
345
|
+
correlationId: meeting.correlationId,
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
const roapBody = {
|
|
349
|
+
localMedias: [
|
|
350
|
+
{
|
|
351
|
+
localSdp: JSON.stringify(
|
|
352
|
+
this.roapRequest.attachRechabilityData({
|
|
353
|
+
roapMessage,
|
|
354
|
+
// eslint-disable-next-line no-warning-comments
|
|
355
|
+
// TODO: check whats the need for video and audiomute
|
|
356
|
+
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
357
|
+
videoMuted: meeting.video?.isLocallyMuted(),
|
|
358
|
+
})
|
|
359
|
+
),
|
|
360
|
+
// mediaId: meeting.mediaId
|
|
361
|
+
},
|
|
362
|
+
],
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
return MeetingUtil.joinMeetingOptions(meeting, {roapMessage: roapBody}).then((locus) => {
|
|
366
|
+
this.roapHandler.submit({
|
|
367
|
+
type: ROAP.SEND_ROAP_MSG_SUCCESS,
|
|
368
|
+
seq: roapMessage.seq,
|
|
369
|
+
correlationId: meeting.correlationId,
|
|
370
|
+
});
|
|
371
|
+
meeting.setRoapSeq(roapMessage.seq);
|
|
372
|
+
|
|
373
|
+
// eslint-disable-next-line no-warning-comments
|
|
374
|
+
// TODO: we need to attach peerconenction to locus not sure if we need to pass everything here
|
|
375
|
+
return locus;
|
|
376
|
+
// eslint-disable-next-line no-warning-comments
|
|
377
|
+
// TODO: check where to update the sequence number
|
|
378
|
+
});
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Called when the roap sequence is finished (completed successfully or failed)
|
|
383
|
+
* @param {String} correlationId id of the meeting affected
|
|
384
|
+
* @param {String} sequenceId the id of the finished sequence
|
|
385
|
+
* @returns {undefined}
|
|
386
|
+
* @private
|
|
387
|
+
* @memberof Roap
|
|
388
|
+
*/
|
|
389
|
+
private roapFinished(correlationId: string, sequenceId: string) {
|
|
390
|
+
RoapCollection.onSessionSequenceFinish(correlationId, sequenceId);
|
|
391
|
+
// @ts-ignore
|
|
392
|
+
const meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', correlationId);
|
|
393
|
+
|
|
394
|
+
meeting.mediaNegotiatedEvent();
|
|
395
|
+
if (!RoapCollection.isBusy(correlationId)) {
|
|
396
|
+
meeting.processNextQueuedMediaUpdate();
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Performs a TURN server discovery procedure, which involves exchanging
|
|
402
|
+
* some roap messages with the server. This exchange has to be done before
|
|
403
|
+
* any other roap messages are sent
|
|
404
|
+
*
|
|
405
|
+
* @param {Meeting} meeting
|
|
406
|
+
* @param {Boolean} isReconnecting should be set to true if this is a new
|
|
407
|
+
* media connection just after a reconnection
|
|
408
|
+
* @returns {Promise}
|
|
409
|
+
*/
|
|
410
|
+
doTurnDiscovery(meeting: Meeting, isReconnecting: boolean) {
|
|
411
|
+
return this.turnDiscovery.doTurnDiscovery(meeting, isReconnecting);
|
|
412
|
+
}
|
|
413
|
+
}
|