@webex/plugin-meetings 3.8.0 → 3.8.1-next.10
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 +26 -13
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +70 -6
- package/dist/breakouts/index.js.map +1 -1
- package/dist/common/errors/webex-errors.js +12 -2
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +28 -123
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +3 -0
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/types.js.map +1 -1
- package/dist/controls-options-manager/util.js +78 -0
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/interpretation/index.js +4 -4
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +37 -11
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +92 -12
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/selfUtils.js +432 -418
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +17 -17
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +94 -6
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/brbState.js +9 -2
- package/dist/meeting/brbState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +21 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +678 -344
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +21 -22
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/muteState.js +4 -4
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +30 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/util.js +13 -2
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +373 -68
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +5 -1
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/index.js +136 -1
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/util.js +14 -0
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +55 -9
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +3 -0
- package/dist/member/types.js.map +1 -1
- package/dist/member/util.js +335 -353
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +137 -29
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +38 -0
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js +36 -1
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +10 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +40 -8
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/reachability/clusterReachability.js +63 -27
- package/dist/reachability/clusterReachability.js.map +1 -1
- package/dist/reachability/index.js +107 -47
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/reachability.types.js +14 -0
- package/dist/reachability/reachability.types.js.map +1 -1
- package/dist/reachability/request.js +19 -3
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +2 -2
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/util.js +5 -5
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/turnDiscovery.js +45 -27
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/roap/types.js +17 -0
- package/dist/roap/types.js.map +1 -0
- package/dist/types/common/errors/webex-errors.d.ts +7 -1
- package/dist/types/config.d.ts +3 -0
- package/dist/types/constants.d.ts +20 -85
- package/dist/types/controls-options-manager/enums.d.ts +4 -1
- package/dist/types/controls-options-manager/types.d.ts +10 -1
- package/dist/types/locus-info/index.d.ts +3 -3
- package/dist/types/locus-info/selfUtils.d.ts +216 -1
- package/dist/types/media/properties.d.ts +15 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +20 -0
- package/dist/types/meeting/index.d.ts +65 -1
- package/dist/types/meeting/muteState.d.ts +0 -1
- package/dist/types/meeting/request.d.ts +12 -1
- package/dist/types/meeting/request.type.d.ts +6 -0
- package/dist/types/meeting/util.d.ts +3 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +82 -1
- package/dist/types/meetings/index.d.ts +57 -0
- package/dist/types/member/index.d.ts +21 -6
- package/dist/types/member/types.d.ts +73 -14
- package/dist/types/member/util.d.ts +156 -1
- package/dist/types/members/collection.d.ts +6 -5
- package/dist/types/members/index.d.ts +32 -43
- package/dist/types/members/request.d.ts +26 -0
- package/dist/types/members/util.d.ts +27 -0
- package/dist/types/metrics/constants.d.ts +10 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +10 -1
- package/dist/types/reachability/clusterReachability.d.ts +15 -7
- package/dist/types/reachability/index.d.ts +10 -1
- package/dist/types/reachability/reachability.types.d.ts +5 -0
- package/dist/types/roap/index.d.ts +3 -2
- package/dist/types/roap/turnDiscovery.d.ts +5 -17
- package/dist/types/roap/types.d.ts +16 -0
- package/dist/webinar/index.js +2 -2
- package/dist/webinar/index.js.map +1 -1
- package/package.json +24 -23
- package/src/breakouts/index.ts +69 -0
- package/src/common/errors/webex-errors.ts +8 -1
- package/src/config.ts +3 -0
- package/src/constants.ts +30 -90
- package/src/controls-options-manager/enums.ts +3 -0
- package/src/controls-options-manager/types.ts +16 -1
- package/src/controls-options-manager/util.ts +93 -0
- package/src/interpretation/index.ts +3 -3
- package/src/locus-info/controlsUtils.ts +59 -14
- package/src/locus-info/index.ts +97 -13
- package/src/locus-info/selfUtils.ts +496 -442
- package/src/media/index.ts +23 -21
- package/src/media/properties.ts +96 -0
- package/src/meeting/brbState.ts +11 -2
- package/src/meeting/in-meeting-actions.ts +40 -0
- package/src/meeting/index.ts +470 -105
- package/src/meeting/locusMediaRequest.ts +27 -22
- package/src/meeting/muteState.ts +4 -4
- package/src/meeting/request.ts +36 -1
- package/src/meeting/request.type.ts +7 -0
- package/src/meeting/util.ts +11 -2
- package/src/meeting-info/meeting-info-v2.ts +254 -8
- package/src/meeting-info/utilv2.ts +5 -0
- package/src/meetings/index.ts +148 -1
- package/src/meetings/util.ts +18 -0
- package/src/member/index.ts +68 -22
- package/src/member/types.ts +82 -16
- package/src/member/util.ts +357 -350
- package/src/members/collection.ts +4 -3
- package/src/members/index.ts +137 -18
- package/src/members/request.ts +44 -0
- package/src/members/util.ts +43 -1
- package/src/metrics/constants.ts +10 -0
- package/src/multistream/remoteMediaManager.ts +32 -10
- package/src/reachability/clusterReachability.ts +73 -26
- package/src/reachability/index.ts +62 -1
- package/src/reachability/reachability.types.ts +6 -0
- package/src/reachability/request.ts +7 -0
- package/src/reconnection-manager/index.ts +2 -2
- package/src/recording-controller/util.ts +17 -13
- package/src/roap/index.ts +3 -7
- package/src/roap/turnDiscovery.ts +34 -39
- package/src/roap/types.ts +23 -0
- package/src/webinar/index.ts +1 -1
- package/test/unit/spec/breakouts/index.ts +167 -95
- package/test/unit/spec/controls-options-manager/util.js +178 -0
- package/test/unit/spec/interpretation/index.ts +39 -1
- package/test/unit/spec/locus-info/controlsUtils.js +155 -9
- package/test/unit/spec/locus-info/index.js +209 -73
- package/test/unit/spec/locus-info/selfUtils.js +98 -24
- package/test/unit/spec/media/index.ts +150 -18
- package/test/unit/spec/media/properties.ts +130 -0
- package/test/unit/spec/meeting/brbState.ts +40 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +23 -4
- package/test/unit/spec/meeting/index.js +804 -139
- package/test/unit/spec/meeting/locusMediaRequest.ts +95 -87
- package/test/unit/spec/meeting/muteState.js +73 -2
- package/test/unit/spec/meeting/request.js +32 -1
- package/test/unit/spec/meeting/utils.js +119 -18
- package/test/unit/spec/meeting-info/meetinginfov2.js +484 -114
- package/test/unit/spec/meeting-info/utilv2.js +19 -0
- package/test/unit/spec/meetings/index.js +146 -2
- package/test/unit/spec/member/index.js +7 -0
- package/test/unit/spec/member/util.js +24 -0
- package/test/unit/spec/members/index.js +304 -78
- package/test/unit/spec/members/request.js +68 -22
- package/test/unit/spec/members/utils.js +75 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +397 -118
- package/test/unit/spec/reachability/clusterReachability.ts +88 -56
- package/test/unit/spec/reachability/index.ts +97 -0
- package/test/unit/spec/reachability/request.js +47 -2
- package/test/unit/spec/reconnection-manager/index.js +4 -4
- package/test/unit/spec/roap/turnDiscovery.ts +110 -28
- package/test/unit/spec/webinar/index.ts +5 -0
- 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/parameter.d.ts +0 -15
- 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 +0 -11
- 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
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_common","require","_metrics","_interopRequireDefault","_constants","_loggerProxy","_constants2","TURN_DISCOVERY_TIMEOUT","TURN_DISCOVERY_SEQ","TurnDiscoverySkipReason","missingHttpResponse","reachability","alreadyInProgress","TurnDiscovery","exports","default","roapRequest","_classCallCheck2","_defineProperty2","turnInfo","url","username","password","_createClass2","key","value","waitForTurnDiscoveryResponse","defer","LoggerProxy","logger","warn","_promise","reject","Error","responseTimer","setTimeout","concat","info","promise","handleTurnDiscoveryResponse","roapMessage","from","_this","headers","messageType","ROAP","ROAP_TYPES","TURN_DISCOVERY_RESPONSE","_stringify","expectedHeaders","headerName","field","foundHeaders","forEach","receivedHeader","expectedHeader","startsWith","substring","length","clearTimeout","undefined","resolve","isOkRequired","includes","_generateTurnDiscoveryRequestMessage","_asyncToGenerator2","_regenerator","mark","_callee","meeting","isForced","turnDiscoverySkippedReason","wrap","_callee$","_context","prev","next","abrupt","getSkipReason","sent","Defer","TURN_DISCOVERY_REQUEST","version","ROAP_VERSION","seq","stop","generateTurnDiscoveryRequestMessage","_x","_x2","apply","arguments","handleTurnDiscoveryFailure","error","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","TURN_DISCOVERY_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","reason","message","stack","turnServerInfo","_handleTurnDiscoveryHttpResponse","_callee2","httpResponse","_yield$this$defer$pro","_callee2$","_context2","parseHttpTurnDiscoveryResponse","sendRoapOK","t0","abort","handleTurnDiscoveryHttpResponse","_x3","_x4","_httpResponse$mediaCo","_httpResponse$mediaCo2","turnDiscoveryResponse","mediaConnections","remoteSdp","JSON","parse","_remoteSdp$roapMessag","errorType","errorCause","ROAP_HTTP_RESPONSE_MISSING","isMultistream","sendRoapTurnDiscoveryRequest","isReconnecting","_this2","sendRoap","locusSelfUrl","selfUrl","mediaId","locusMediaRequest","then","_ref","_callee3","response","_callee3$","_context3","updateMediaConnections","_x5","TURN_DISCOVERY_REQUIRES_OK","OK","_getSkipReason","_callee4","isAnyPublicClusterReachable","_callee4$","_context4","webex","meetings","_x6","_isSkipped","_callee5","skipReason","_callee5$","_context5","isSkipped","_x7","_doTurnDiscovery","_callee6","turnDiscoveryResult","_yield$this$waitForTu","_callee6$","_context6","doTurnDiscovery","_x8","_x9","_x10"],"sources":["turnDiscovery.ts"],"sourcesContent":["// @ts-ignore - Types not available for @webex/common\nimport {Defer} from '@webex/common';\n\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ROAP, Enum} from '../constants';\n\nimport RoapRequest from './request';\nimport Meeting from '../meeting';\nimport MeetingUtil from '../meeting/util';\n\nconst TURN_DISCOVERY_TIMEOUT = 10; // in seconds\n\n// Roap spec says that seq should start from 1, but TURN discovery works fine with seq=0\n// and this is handy for us, because TURN discovery is always done before the first SDP exchange,\n// so we can do it with seq=0 or not do it at all and then we create the RoapMediaConnection\n// and do the SDP offer with seq=1\nconst TURN_DISCOVERY_SEQ = 0;\n\nconst TurnDiscoverySkipReason = {\n missingHttpResponse: 'missing http response', // when we asked for the TURN discovery response to be in the http response, but it wasn't there\n reachability: 'reachability', // when udp reachability to public clusters is ok, so we don't need TURN (this doens't apply when joinWithMedia() is used)\n alreadyInProgress: 'already in progress', // when we try to start TURN discovery while it's already in progress\n} as const;\n\nexport type TurnDiscoverySkipReason =\n | Enum<typeof TurnDiscoverySkipReason> // this is a kind of FYI, because in practice typescript will infer the type of TurnDiscoverySkipReason as a string\n | string // used in case of errors, contains the error message\n | undefined; // used when TURN discovery is not skipped\n\nexport type TurnServerInfo = {\n url: string;\n username: string;\n password: string;\n};\n\nexport type TurnDiscoveryResult = {\n turnServerInfo?: TurnServerInfo;\n turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n};\n\n/**\n * Handles the process of finding out TURN server information from Linus.\n * This is achieved by sending a TURN_DISCOVERY_REQUEST.\n */\nexport default class TurnDiscovery {\n private roapRequest: RoapRequest;\n\n private defer?: Defer; // used for waiting for the response\n\n private turnInfo: TurnServerInfo;\n\n private responseTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * Constructor\n *\n * @param {RoapRequest} roapRequest\n */\n constructor(roapRequest: RoapRequest) {\n this.roapRequest = roapRequest;\n this.turnInfo = {\n url: '',\n username: '',\n password: '',\n };\n }\n\n /**\n * waits for TURN_DISCOVERY_RESPONSE message to arrive\n *\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private waitForTurnDiscoveryResponse(): Promise<{isOkRequired: boolean}> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'\n );\n\n return Promise.reject(\n new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()')\n );\n }\n\n const {defer} = this;\n\n this.responseTimer = setTimeout(() => {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`\n );\n\n defer.reject(new Error('Timed out waiting for TURN_DISCOVERY_RESPONSE'));\n }, TURN_DISCOVERY_TIMEOUT * 1000);\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...'\n );\n\n return defer.promise;\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message. Use it if the roap message comes over the websocket,\n * otherwise use handleTurnDiscoveryHttpResponse() if it comes in the http response.\n *\n * @param {Object} roapMessage\n * @param {string} from string to indicate how we got the response (used just for logging)\n * @returns {void}\n * @public\n * @memberof Roap\n */\n public handleTurnDiscoveryResponse(roapMessage: any, from: string) {\n const {headers} = roapMessage;\n\n if (!this.defer) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response ${from}`\n );\n\n return;\n }\n\n if (roapMessage.messageType !== ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} has unexpected messageType: ${JSON.stringify(\n roapMessage\n )}`\n )\n );\n }\n\n const expectedHeaders = [\n {headerName: 'x-cisco-turn-url', field: 'url'},\n {headerName: 'x-cisco-turn-username', field: 'username'},\n {headerName: 'x-cisco-turn-password', field: 'password'},\n ];\n\n let foundHeaders = 0;\n\n headers?.forEach((receivedHeader) => {\n // check if it matches any of our expected headers\n expectedHeaders.forEach((expectedHeader) => {\n if (receivedHeader.startsWith(`${expectedHeader.headerName}=`)) {\n this.turnInfo[expectedHeader.field] = receivedHeader.substring(\n expectedHeader.headerName.length + 1\n );\n foundHeaders += 1;\n }\n });\n });\n\n clearTimeout(this.responseTimer);\n this.responseTimer = undefined;\n\n if (foundHeaders !== expectedHeaders.length) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received ${from}: ${JSON.stringify(\n headers\n )}`\n );\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} missing some headers: ${JSON.stringify(headers)}`\n )\n );\n } else {\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ${from}, url=${this.turnInfo.url}`\n );\n\n this.defer.resolve({isOkRequired: !headers?.includes('noOkInTransaction')});\n }\n }\n\n /**\n * Generates TURN_DISCOVERY_REQUEST roap message. When this method returns a roapMessage, it means that a TURN discovery process has started.\n * It needs be ended by calling handleTurnDiscoveryHttpResponse() once you get a response from the backend. If you don't get any response\n * or want to abort, you need to call abort().\n *\n * @param {Meeting} meeting\n * @param {boolean} isForced\n * @returns {Object}\n */\n public async generateTurnDiscoveryRequestMessage(\n meeting: Meeting,\n isForced: boolean\n ): Promise<{roapMessage?: object; turnDiscoverySkippedReason: TurnDiscoverySkipReason}> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> TURN discovery already in progress'\n );\n\n return {\n roapMessage: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n };\n }\n\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {roapMessage: undefined, turnDiscoverySkippedReason};\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> generated TURN_DISCOVERY_REQUEST message'\n );\n\n return {roapMessage, turnDiscoverySkippedReason: undefined};\n }\n\n /**\n * Handles any errors that occur during TURN discovery without re-throwing them.\n *\n * @param {Meeting} meeting\n * @param {Error} error\n * @returns {TurnDiscoveryResult}\n */\n private handleTurnDiscoveryFailure(meeting: Meeting, error: Error): TurnDiscoveryResult {\n // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${error}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n return {turnServerInfo: undefined, turnDiscoverySkippedReason: `failure: ${error.message}`};\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message that came in http response. If the response is not valid,\n * it returns an object with turnServerInfo set to undefined. In that case you need to call abort()\n * to end the TURN discovery process.\n *\n * @param {Meeting} meeting\n * @param {Object|undefined} httpResponse can be undefined to indicate that we didn't get the response\n * @returns {Promise<TurnDiscoveryResult>}\n * @memberof Roap\n */\n public async handleTurnDiscoveryHttpResponse(\n meeting: Meeting,\n httpResponse?: object\n ): Promise<TurnDiscoveryResult> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#handleTurnDiscoveryHttpResponse --> unexpected http response, TURN discovery is not in progress'\n );\n\n throw new Error(\n 'handleTurnDiscoveryHttpResponse() called before generateTurnDiscoveryRequestMessage()'\n );\n }\n\n if (httpResponse === undefined) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n try {\n const roapMessage = this.parseHttpTurnDiscoveryResponse(meeting, httpResponse);\n\n if (!roapMessage) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n this.handleTurnDiscoveryResponse(roapMessage, 'in http response');\n\n const {isOkRequired} = await this.defer.promise;\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (error) {\n this.abort();\n\n return this.handleTurnDiscoveryFailure(meeting, error);\n }\n }\n\n /**\n * Aborts current TURN discovery. This method needs to be called if you called generateTurnDiscoveryRequestMessage(),\n * but then never got any response from the server.\n * @returns {void}\n */\n public abort() {\n if (this.defer) {\n this.defer.reject(new Error('TURN discovery aborted'));\n this.defer = undefined;\n }\n }\n\n /**\n * Parses the TURN_DISCOVERY_RESPONSE roap message out of the http response\n * and returns it.\n *\n * @param {Meeting} meeting\n * @param {any} httpResponse\n * @returns {any}\n */\n private parseHttpTurnDiscoveryResponse(\n meeting: Meeting,\n httpResponse: {mediaConnections?: Array<{remoteSdp?: string}>}\n ) {\n let turnDiscoveryResponse;\n\n if (httpResponse.mediaConnections?.[0]?.remoteSdp) {\n const remoteSdp = JSON.parse(httpResponse.mediaConnections[0].remoteSdp);\n\n if (remoteSdp.roapMessage) {\n // yes, it's misleading that remoteSdp actually contains a TURN discovery response, but that's how the backend works...\n const {seq, messageType, errorType, errorCause, headers} = remoteSdp.roapMessage;\n\n turnDiscoveryResponse = {\n seq,\n messageType,\n errorType,\n errorCause,\n headers,\n };\n }\n }\n\n if (!turnDiscoveryResponse) {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING, {\n correlationId: meeting.correlationId,\n messageType: 'TURN_DISCOVERY_RESPONSE',\n isMultistream: meeting.isMultistream,\n });\n }\n\n return turnDiscoveryResponse;\n }\n\n /**\n * sends the TURN_DISCOVERY_REQUEST roap request\n *\n * @param {Meeting} meeting\n * @param {Boolean} isReconnecting\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapTurnDiscoveryRequest(\n meeting: Meeting,\n isReconnecting: boolean\n ): Promise<TurnDiscoveryResult> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'\n );\n\n return Promise.resolve({\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n });\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST'\n );\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n // @ts-ignore - Fix missing type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - Fix missing type\n mediaId: isReconnecting ? '' : meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n })\n .then(async (response) => {\n const {mediaConnections} = response;\n\n if (mediaConnections) {\n meeting.updateMediaConnections(mediaConnections);\n }\n\n return this.handleTurnDiscoveryHttpResponse(meeting, response);\n });\n }\n\n /**\n * Sends the OK message that server expects to receive\n * after it sends us TURN_DISCOVERY_RESPONSE\n *\n * @param {Meeting} meeting\n * @returns {Promise}\n */\n sendRoapOK(meeting: Meeting) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapOK --> TURN discovery response requires OK, sending it...'\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_REQUIRES_OK, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n });\n\n return this.roapRequest.sendRoap({\n roapMessage: {\n messageType: ROAP.ROAP_TYPES.OK,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n },\n // @ts-ignore - fix type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - fix type\n mediaId: meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n });\n }\n\n /**\n * Gets the reason why reachability is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped\n */\n private async getSkipReason(meeting: Meeting): Promise<TurnDiscoverySkipReason> {\n const isAnyPublicClusterReachable =\n // @ts-ignore - fix type\n await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();\n\n if (isAnyPublicClusterReachable) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'\n );\n\n return TurnDiscoverySkipReason.reachability;\n }\n\n return undefined;\n }\n\n /**\n * Checks if TURN discovery is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Boolean} true if TURN discovery is being skipped, false if it is being done\n */\n async isSkipped(meeting) {\n const skipReason = await this.getSkipReason(meeting);\n\n return !!skipReason;\n }\n\n /**\n * Retrieves TURN server information from the backend by doing\n * a roap message exchange:\n * client server\n * | -----TURN_DISCOVERY_REQUEST-----> |\n * | <----TURN_DISCOVERY_RESPONSE----- |\n * | --------------OK----------------> |\n *\n * This TURN discovery roap exchange is always done with seq=0.\n * The RoapMediaConnection SDP exchange always starts with seq=1,\n * so it works fine no matter if TURN discovery is done or not.\n *\n * @param {Meeting} meeting\n * @param {Boolean} [isReconnecting] should be set to true if this is a new\n * media connection just after a reconnection\n * @param {Boolean} [isForced]\n * @returns {Promise}\n */\n async doTurnDiscovery(\n meeting: Meeting,\n isReconnecting?: boolean,\n isForced?: boolean\n ): Promise<TurnDiscoveryResult> {\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason,\n };\n }\n\n try {\n const turnDiscoveryResult = await this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting);\n\n if (\n turnDiscoveryResult.turnDiscoverySkippedReason !==\n TurnDiscoverySkipReason.missingHttpResponse\n ) {\n return turnDiscoveryResult;\n }\n\n // if we haven't got the response over http, we need to wait for it to come over the websocket via Mercury\n const {isOkRequired} = await this.waitForTurnDiscoveryResponse();\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (e) {\n return this.handleTurnDiscoveryFailure(meeting, e);\n }\n }\n}\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["_common","require","_metrics","_interopRequireDefault","_constants","_loggerProxy","_constants2","_types","TURN_DISCOVERY_TIMEOUT","TURN_DISCOVERY_SEQ","TurnDiscovery","exports","default","roapRequest","_classCallCheck2","_defineProperty2","resetTurnInfo","_createClass2","key","value","turnInfo","urls","username","password","waitForTurnDiscoveryResponse","defer","LoggerProxy","logger","warn","_promise","reject","Error","responseTimer","setTimeout","concat","info","promise","handleTurnDiscoveryResponse","roapMessage","from","_this","headers","messageType","ROAP","ROAP_TYPES","TURN_DISCOVERY_RESPONSE","_stringify","expectedHeaders","headerName","field","multipleAllowed","foundHeaders","forEach","receivedHeader","expectedHeader","startsWith","headerValue","substring","length","push","clearTimeout","undefined","some","header","filter","url","resolve","isOkRequired","includes","_generateTurnDiscoveryRequestMessage","_asyncToGenerator2","_regenerator","mark","_callee","meeting","isForced","turnDiscoverySkippedReason","wrap","_callee$","_context","prev","next","abrupt","TurnDiscoverySkipReason","alreadyInProgress","getSkipReason","sent","Defer","TURN_DISCOVERY_REQUEST","version","ROAP_VERSION","seq","stop","generateTurnDiscoveryRequestMessage","_x","_x2","apply","arguments","handleTurnDiscoveryFailure","error","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","TURN_DISCOVERY_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","reason","message","stack","turnServerInfo","_handleTurnDiscoveryHttpResponse","_callee2","httpResponse","_yield$this$defer$pro","_callee2$","_context2","missingHttpResponse","parseHttpTurnDiscoveryResponse","sendRoapOK","t0","abort","handleTurnDiscoveryHttpResponse","_x3","_x4","_httpResponse$mediaCo","_httpResponse$mediaCo2","turnDiscoveryResponse","mediaConnections","remoteSdp","JSON","parse","_remoteSdp$roapMessag","errorType","errorCause","ROAP_HTTP_RESPONSE_MISSING","isMultistream","sendRoapTurnDiscoveryRequest","isReconnecting","_this2","sendRoap","locusSelfUrl","selfUrl","mediaId","locusMediaRequest","then","_ref","_callee3","response","_callee3$","_context3","updateMediaConnections","_x5","TURN_DISCOVERY_REQUIRES_OK","OK","_getSkipReason","_callee4","isAnyPublicClusterReachable","_callee4$","_context4","webex","meetings","reachability","_x6","_isSkipped","_callee5","skipReason","_callee5$","_context5","isSkipped","_x7","_doTurnDiscovery","_callee6","turnDiscoveryResult","_yield$this$waitForTu","_callee6$","_context6","doTurnDiscovery","_x8","_x9","_x10"],"sources":["turnDiscovery.ts"],"sourcesContent":["// @ts-ignore - Types not available for @webex/common\nimport {Defer} from '@webex/common';\n\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ROAP} from '../constants';\n\nimport RoapRequest from './request';\nimport Meeting from '../meeting';\nimport {TurnDiscoverySkipReason, TurnServerInfo, TurnDiscoveryResult} from './types';\n\nconst TURN_DISCOVERY_TIMEOUT = 10; // in seconds\n\n// Roap spec says that seq should start from 1, but TURN discovery works fine with seq=0\n// and this is handy for us, because TURN discovery is always done before the first SDP exchange,\n// so we can do it with seq=0 or not do it at all and then we create the RoapMediaConnection\n// and do the SDP offer with seq=1\nconst TURN_DISCOVERY_SEQ = 0;\n\n/**\n * Handles the process of finding out TURN server information from Linus.\n * This is achieved by sending a TURN_DISCOVERY_REQUEST.\n */\nexport default class TurnDiscovery {\n private roapRequest: RoapRequest;\n\n private defer?: Defer; // used for waiting for the response\n\n private turnInfo: TurnServerInfo;\n\n private responseTimer?: ReturnType<typeof setTimeout>;\n\n /** Resets the turnInfo structure to the defaults\n * @returns {void}\n */\n private resetTurnInfo() {\n this.turnInfo = {\n urls: [],\n username: '',\n password: '',\n };\n }\n\n /**\n * Constructor\n *\n * @param {RoapRequest} roapRequest\n */\n constructor(roapRequest: RoapRequest) {\n this.roapRequest = roapRequest;\n this.resetTurnInfo();\n }\n\n /**\n * waits for TURN_DISCOVERY_RESPONSE message to arrive\n *\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private waitForTurnDiscoveryResponse(): Promise<{isOkRequired: boolean}> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'\n );\n\n return Promise.reject(\n new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()')\n );\n }\n\n const {defer} = this;\n\n this.responseTimer = setTimeout(() => {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`\n );\n\n defer.reject(new Error('Timed out waiting for TURN_DISCOVERY_RESPONSE'));\n }, TURN_DISCOVERY_TIMEOUT * 1000);\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...'\n );\n\n return defer.promise;\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message. Use it if the roap message comes over the websocket,\n * otherwise use handleTurnDiscoveryHttpResponse() if it comes in the http response.\n *\n * @param {Object} roapMessage\n * @param {string} from string to indicate how we got the response (used just for logging)\n * @returns {void}\n * @public\n * @memberof Roap\n */\n public handleTurnDiscoveryResponse(roapMessage: any, from: string) {\n const {headers} = roapMessage;\n\n if (!this.defer) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response ${from}`\n );\n\n return;\n }\n\n if (roapMessage.messageType !== ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} has unexpected messageType: ${JSON.stringify(\n roapMessage\n )}`\n )\n );\n }\n\n const expectedHeaders = [\n {headerName: 'x-cisco-turn-url', field: 'urls', multipleAllowed: true},\n {headerName: 'x-cisco-turn-username', field: 'username', multipleAllowed: false},\n {headerName: 'x-cisco-turn-password', field: 'password', multipleAllowed: false},\n ];\n\n const foundHeaders = {};\n\n this.resetTurnInfo();\n\n headers?.forEach((receivedHeader) => {\n // check if it matches any of our expected headers\n expectedHeaders.forEach((expectedHeader) => {\n if (receivedHeader.startsWith(`${expectedHeader.headerName}=`)) {\n foundHeaders[expectedHeader.headerName] = true;\n\n const headerValue = receivedHeader.substring(expectedHeader.headerName.length + 1);\n\n if (expectedHeader.multipleAllowed) {\n this.turnInfo[expectedHeader.field].push(headerValue);\n } else {\n // just store the last one we find\n this.turnInfo[expectedHeader.field] = headerValue;\n }\n }\n });\n });\n\n clearTimeout(this.responseTimer);\n this.responseTimer = undefined;\n\n if (expectedHeaders.some((header) => !foundHeaders[header.headerName])) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received ${from}: ${JSON.stringify(\n headers\n )}`\n );\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} missing some headers: ${JSON.stringify(headers)}`\n )\n );\n } else {\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ${from}, urls=${this.turnInfo.urls}`\n );\n\n this.turnInfo.urls = this.turnInfo.urls.filter((url) => url !== ''); // remove empty urls, we might get them if we land on video-mesh nodes (VMN)\n\n this.defer.resolve({isOkRequired: !headers?.includes('noOkInTransaction')});\n }\n }\n\n /**\n * Generates TURN_DISCOVERY_REQUEST roap message. When this method returns a roapMessage, it means that a TURN discovery process has started.\n * It needs be ended by calling handleTurnDiscoveryHttpResponse() once you get a response from the backend. If you don't get any response\n * or want to abort, you need to call abort().\n *\n * @param {Meeting} meeting\n * @param {boolean} isForced\n * @returns {Object}\n */\n public async generateTurnDiscoveryRequestMessage(\n meeting: Meeting,\n isForced: boolean\n ): Promise<{roapMessage?: object; turnDiscoverySkippedReason: TurnDiscoverySkipReason}> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> TURN discovery already in progress'\n );\n\n return {\n roapMessage: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n };\n }\n\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {roapMessage: undefined, turnDiscoverySkippedReason};\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> generated TURN_DISCOVERY_REQUEST message'\n );\n\n return {roapMessage, turnDiscoverySkippedReason: undefined};\n }\n\n /**\n * Handles any errors that occur during TURN discovery without re-throwing them.\n *\n * @param {Meeting} meeting\n * @param {Error} error\n * @returns {TurnDiscoveryResult}\n */\n private handleTurnDiscoveryFailure(meeting: Meeting, error: Error): TurnDiscoveryResult {\n // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${error}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n return {turnServerInfo: undefined, turnDiscoverySkippedReason: `failure: ${error.message}`};\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message that came in http response. If the response is not valid,\n * it returns an object with turnServerInfo set to undefined. In that case you need to call abort()\n * to end the TURN discovery process.\n *\n * @param {Meeting} meeting\n * @param {Object|undefined} httpResponse can be undefined to indicate that we didn't get the response\n * @returns {Promise<TurnDiscoveryResult>}\n * @memberof Roap\n */\n public async handleTurnDiscoveryHttpResponse(\n meeting: Meeting,\n httpResponse?: object\n ): Promise<TurnDiscoveryResult> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#handleTurnDiscoveryHttpResponse --> unexpected http response, TURN discovery is not in progress'\n );\n\n throw new Error(\n 'handleTurnDiscoveryHttpResponse() called before generateTurnDiscoveryRequestMessage()'\n );\n }\n\n if (httpResponse === undefined) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n try {\n const roapMessage = this.parseHttpTurnDiscoveryResponse(meeting, httpResponse);\n\n if (!roapMessage) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n this.handleTurnDiscoveryResponse(roapMessage, 'in http response');\n\n const {isOkRequired} = await this.defer.promise;\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (error) {\n this.abort();\n\n return this.handleTurnDiscoveryFailure(meeting, error);\n }\n }\n\n /**\n * Aborts current TURN discovery. This method needs to be called if you called generateTurnDiscoveryRequestMessage(),\n * but then never got any response from the server.\n * @returns {void}\n */\n public abort() {\n if (this.defer) {\n this.defer.reject(new Error('TURN discovery aborted'));\n this.defer = undefined;\n }\n }\n\n /**\n * Parses the TURN_DISCOVERY_RESPONSE roap message out of the http response\n * and returns it.\n *\n * @param {Meeting} meeting\n * @param {any} httpResponse\n * @returns {any}\n */\n private parseHttpTurnDiscoveryResponse(\n meeting: Meeting,\n httpResponse: {mediaConnections?: Array<{remoteSdp?: string}>}\n ) {\n let turnDiscoveryResponse;\n\n if (httpResponse.mediaConnections?.[0]?.remoteSdp) {\n const remoteSdp = JSON.parse(httpResponse.mediaConnections[0].remoteSdp);\n\n if (remoteSdp.roapMessage) {\n // yes, it's misleading that remoteSdp actually contains a TURN discovery response, but that's how the backend works...\n const {seq, messageType, errorType, errorCause, headers} = remoteSdp.roapMessage;\n\n turnDiscoveryResponse = {\n seq,\n messageType,\n errorType,\n errorCause,\n headers,\n };\n }\n }\n\n if (!turnDiscoveryResponse) {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING, {\n correlationId: meeting.correlationId,\n messageType: 'TURN_DISCOVERY_RESPONSE',\n isMultistream: meeting.isMultistream,\n });\n }\n\n return turnDiscoveryResponse;\n }\n\n /**\n * sends the TURN_DISCOVERY_REQUEST roap request\n *\n * @param {Meeting} meeting\n * @param {Boolean} isReconnecting\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapTurnDiscoveryRequest(\n meeting: Meeting,\n isReconnecting: boolean\n ): Promise<TurnDiscoveryResult> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'\n );\n\n return Promise.resolve({\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n });\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST'\n );\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n // @ts-ignore - Fix missing type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - Fix missing type\n mediaId: isReconnecting ? '' : meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n })\n .then(async (response) => {\n const {mediaConnections} = response;\n\n if (mediaConnections) {\n meeting.updateMediaConnections(mediaConnections);\n }\n\n return this.handleTurnDiscoveryHttpResponse(meeting, response);\n });\n }\n\n /**\n * Sends the OK message that server expects to receive\n * after it sends us TURN_DISCOVERY_RESPONSE\n *\n * @param {Meeting} meeting\n * @returns {Promise}\n */\n sendRoapOK(meeting: Meeting) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapOK --> TURN discovery response requires OK, sending it...'\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_REQUIRES_OK, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n });\n\n return this.roapRequest.sendRoap({\n roapMessage: {\n messageType: ROAP.ROAP_TYPES.OK,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n },\n // @ts-ignore - fix type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - fix type\n mediaId: meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n });\n }\n\n /**\n * Gets the reason why reachability is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped\n */\n private async getSkipReason(meeting: Meeting): Promise<TurnDiscoverySkipReason> {\n const isAnyPublicClusterReachable =\n // @ts-ignore - fix type\n await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();\n\n if (isAnyPublicClusterReachable) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'\n );\n\n return TurnDiscoverySkipReason.reachability;\n }\n\n return undefined;\n }\n\n /**\n * Checks if TURN discovery is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Boolean} true if TURN discovery is being skipped, false if it is being done\n */\n async isSkipped(meeting) {\n const skipReason = await this.getSkipReason(meeting);\n\n return !!skipReason;\n }\n\n /**\n * Retrieves TURN server information from the backend by doing\n * a roap message exchange:\n * client server\n * | -----TURN_DISCOVERY_REQUEST-----> |\n * | <----TURN_DISCOVERY_RESPONSE----- |\n * | --------------OK----------------> |\n *\n * This TURN discovery roap exchange is always done with seq=0.\n * The RoapMediaConnection SDP exchange always starts with seq=1,\n * so it works fine no matter if TURN discovery is done or not.\n *\n * @param {Meeting} meeting\n * @param {Boolean} [isReconnecting] should be set to true if this is a new\n * media connection just after a reconnection\n * @param {Boolean} [isForced]\n * @returns {Promise}\n */\n async doTurnDiscovery(\n meeting: Meeting,\n isReconnecting?: boolean,\n isForced?: boolean\n ): Promise<TurnDiscoveryResult> {\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason,\n };\n }\n\n try {\n const turnDiscoveryResult = await this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting);\n\n if (\n turnDiscoveryResult.turnDiscoverySkippedReason !==\n TurnDiscoverySkipReason.missingHttpResponse\n ) {\n return turnDiscoveryResult;\n }\n\n // if we haven't got the response over http, we need to wait for it to come over the websocket via Mercury\n const {isOkRequired} = await this.waitForTurnDiscoveryResponse();\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (e) {\n return this.handleTurnDiscoveryFailure(meeting, e);\n }\n }\n}\n"],"mappings":"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"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
4
|
+
_Object$defineProperty(exports, "__esModule", {
|
5
|
+
value: true
|
6
|
+
});
|
7
|
+
exports.TurnDiscoverySkipReason = void 0;
|
8
|
+
var TurnDiscoverySkipReason = exports.TurnDiscoverySkipReason = {
|
9
|
+
missingHttpResponse: 'missing http response',
|
10
|
+
// when we asked for the TURN discovery response to be in the http response, but it wasn't there
|
11
|
+
reachability: 'reachability',
|
12
|
+
// when udp reachability to public clusters is ok, so we don't need TURN (this doens't apply when joinWithMedia() is used)
|
13
|
+
alreadyInProgress: 'already in progress' // when we try to start TURN discovery while it's already in progress
|
14
|
+
};
|
15
|
+
|
16
|
+
// used when TURN discovery is not skipped
|
17
|
+
//# sourceMappingURL=types.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["TurnDiscoverySkipReason","exports","missingHttpResponse","reachability","alreadyInProgress"],"sources":["types.ts"],"sourcesContent":["import {Enum} from '../constants';\n\nexport const TurnDiscoverySkipReason = {\n missingHttpResponse: 'missing http response', // when we asked for the TURN discovery response to be in the http response, but it wasn't there\n reachability: 'reachability', // when udp reachability to public clusters is ok, so we don't need TURN (this doens't apply when joinWithMedia() is used)\n alreadyInProgress: 'already in progress', // when we try to start TURN discovery while it's already in progress\n} as const;\n\nexport type TurnDiscoverySkipReason =\n | Enum<typeof TurnDiscoverySkipReason> // this is a kind of FYI, because in practice typescript will infer the type of TurnDiscoverySkipReason as a string\n | string // used in case of errors, contains the error message\n | undefined; // used when TURN discovery is not skipped\n\nexport type TurnServerInfo = {\n urls: string[];\n username: string;\n password: string;\n};\n\nexport type TurnDiscoveryResult = {\n turnServerInfo?: TurnServerInfo;\n turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n};\n"],"mappings":";;;;;;;AAEO,IAAMA,uBAAuB,GAAAC,OAAA,CAAAD,uBAAA,GAAG;EACrCE,mBAAmB,EAAE,uBAAuB;EAAE;EAC9CC,YAAY,EAAE,cAAc;EAAE;EAC9BC,iBAAiB,EAAE,qBAAqB,CAAE;AAC5C,CAAU;;AAKK"}
|
@@ -85,9 +85,15 @@ export { IceGatheringFailed };
|
|
85
85
|
* @extends WebexMeetingsError
|
86
86
|
* @property {number} code - 30203
|
87
87
|
* @property {string} message - 'Failed to add media'
|
88
|
+
* @property {Error} [cause] - The underlying error that caused the failure
|
88
89
|
*/
|
89
90
|
declare class AddMediaFailed extends WebexMeetingsError {
|
90
91
|
static CODE: number;
|
91
|
-
|
92
|
+
cause?: Error;
|
93
|
+
/**
|
94
|
+
* Creates a new AddMediaFailed error
|
95
|
+
* @param {Error} [cause] - The underlying error that caused the media addition to fail
|
96
|
+
*/
|
97
|
+
constructor(cause?: Error);
|
92
98
|
}
|
93
99
|
export { AddMediaFailed };
|
package/dist/types/config.d.ts
CHANGED
@@ -70,8 +70,11 @@ declare const _default: {
|
|
70
70
|
};
|
71
71
|
iceCandidatesGatheringTimeout: any;
|
72
72
|
backendIpv6NativeSupport: boolean;
|
73
|
+
enableReachabilityChecks: boolean;
|
73
74
|
reachabilityGetClusterTimeout: number;
|
74
75
|
logUploadIntervalMultiplicationFactor: number;
|
76
|
+
stopIceGatheringAfterFirstRelayCandidate: boolean;
|
77
|
+
enableAudioTwccForMultistream: boolean;
|
75
78
|
};
|
76
79
|
};
|
77
80
|
export default _default;
|
@@ -275,13 +275,18 @@ export declare const EVENT_TRIGGERS: {
|
|
275
275
|
MEETING_CONTROLS_WEBCAST_UPDATED: string;
|
276
276
|
MEETING_CONTROLS_MEETING_FULL_UPDATED: string;
|
277
277
|
MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: string;
|
278
|
+
MEETING_CONTROLS_ANNOTATION_UPDATED: string;
|
279
|
+
MEETING_CONTROLS_REMOTE_DESKTOP_CONTROL_UPDATED: string;
|
280
|
+
MEETING_CONTROLS_POLLING_QA_UPDATED: string;
|
278
281
|
MEETING_LOCUS_URL_UPDATE: string;
|
279
282
|
MEETING_STREAM_PUBLISH_STATE_CHANGED: string;
|
280
283
|
MEETING_TRANSCRIPTION_CONNECTED: string;
|
281
284
|
MEETING_STARTED_RECEIVING_TRANSCRIPTION: string;
|
282
285
|
MEETING_STOPPED_RECEIVING_TRANSCRIPTION: string;
|
286
|
+
MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED: string;
|
283
287
|
MEETING_MANUAL_CAPTION_UPDATED: string;
|
284
288
|
MEETING_CAPTION_RECEIVED: string;
|
289
|
+
MEETING_PARTICIPANT_REASON_CHANGED: string;
|
285
290
|
};
|
286
291
|
export declare const EVENT_TYPES: {
|
287
292
|
SELF: string;
|
@@ -562,6 +567,7 @@ export declare const LOCUSINFO: {
|
|
562
567
|
CONTROLS_MEETING_LAYOUT_UPDATED: string;
|
563
568
|
CONTROLS_RECORDING_UPDATED: string;
|
564
569
|
CONTROLS_MEETING_TRANSCRIBE_UPDATED: string;
|
570
|
+
CONTROLS_MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED: string;
|
565
571
|
CONTROLS_MEETING_MANUAL_CAPTION_UPDATED: string;
|
566
572
|
CONTROLS_MEETING_BREAKOUT_UPDATED: string;
|
567
573
|
CONTROLS_MEETING_CONTAINER_UPDATED: string;
|
@@ -578,6 +584,9 @@ export declare const LOCUSINFO: {
|
|
578
584
|
CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: string;
|
579
585
|
CONTROLS_VIDEO_CHANGED: string;
|
580
586
|
CONTROLS_STAGE_VIEW_UPDATED: string;
|
587
|
+
CONTROLS_ANNOTATION_CHANGED: string;
|
588
|
+
CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED: string;
|
589
|
+
CONTROLS_POLLING_QA_CHANGED: string;
|
581
590
|
SELF_UNADMITTED_GUEST: string;
|
582
591
|
SELF_ADMITTED_GUEST: string;
|
583
592
|
SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: string;
|
@@ -605,6 +614,7 @@ export declare const LOCUSINFO: {
|
|
605
614
|
MEDIA_INACTIVITY: string;
|
606
615
|
LINKS_SERVICES: string;
|
607
616
|
LINKS_RESOURCES: string;
|
617
|
+
PARTICIPANT_REASON_CHANGED: string;
|
608
618
|
};
|
609
619
|
};
|
610
620
|
export declare const LOCUSEVENT: {
|
@@ -737,7 +747,9 @@ export declare enum SELF_POLICY {
|
|
737
747
|
ENFORCE_VIRTUAL_BACKGROUND = "enforceVirtualBackground",
|
738
748
|
SUPPORT_LOCAL_RECORD = "supportLocalRecord",
|
739
749
|
SUPPORT_NETWORK_BASED_RECORD = "supportNetworkBasedRecord",
|
750
|
+
SUPPORT_PREMISE_RECORD = "supportPremiseRecord",
|
740
751
|
SUPPORT_REALTIME_CLOSE_CAPTION = "supportRealtimeCloseCaption",
|
752
|
+
SUPPORT_REALTIME_CLOSE_CAPTION_MANUAL = "supportRealtimeCloseCaptionManual",
|
741
753
|
SUPPORT_CHAT = "supportChat",
|
742
754
|
SUPPORT_DESKTOP_SHARE_REMOTE = "supportDesktopShareRemote",
|
743
755
|
SUPPORT_DESKTOP_SHARE = "supportDesktopShare",
|
@@ -804,6 +816,7 @@ export declare const DISPLAY_HINTS: {
|
|
804
816
|
PRESENTER_CONTROL: string;
|
805
817
|
CAN_RENAME_SELF_AND_OBSERVED: string;
|
806
818
|
CAN_RENAME_OTHERS: string;
|
819
|
+
MOVE_TO_LOBBY: string;
|
807
820
|
BREAKOUT_MANAGEMENT: string;
|
808
821
|
BROADCAST_MESSAGE_TO_BREAKOUT: string;
|
809
822
|
UCF_SUPPRESS_BREAKOUTS_SUPPORT: string;
|
@@ -838,6 +851,13 @@ export declare const DISPLAY_HINTS: {
|
|
838
851
|
PRACTICE_SESSION_OFF: string;
|
839
852
|
SHOW_PRACTICE_SESSION_START: string;
|
840
853
|
SHOW_PRACTICE_SESSION_STOP: string;
|
854
|
+
SHOW_POST_MEETING_DATA_CONSENT_PROMPT: string;
|
855
|
+
ENABLE_ANNOTATION_MEETING_OPTION: string;
|
856
|
+
DISABLE_ANNOTATION_MEETING_OPTION: string;
|
857
|
+
ENABLE_RDC_MEETING_OPTION: string;
|
858
|
+
DISABLE_RDC_MEETING_OPTION: string;
|
859
|
+
ENABLE_ATTENDEE_START_POLLING_QA: string;
|
860
|
+
DISABLE_ATTENDEE_START_POLLING_QA: string;
|
841
861
|
};
|
842
862
|
export declare const INTERSTITIAL_DISPLAY_HINTS: string[];
|
843
863
|
export declare const SELF_ROLES: {
|
@@ -946,91 +966,6 @@ export declare const NETWORK_STATUS: {
|
|
946
966
|
readonly CONNECTED: "CONNECTED";
|
947
967
|
};
|
948
968
|
export type NETWORK_STATUS = Enum<typeof NETWORK_STATUS>;
|
949
|
-
export declare const NETWORK_TYPE: {
|
950
|
-
VPN: string;
|
951
|
-
UNKNOWN: string;
|
952
|
-
WIFI: string;
|
953
|
-
ETHERNET: string;
|
954
|
-
};
|
955
|
-
export declare const STATS: {
|
956
|
-
SEND_DIRECTION: string;
|
957
|
-
RECEIVE_DIRECTION: string;
|
958
|
-
REMOTE: string;
|
959
|
-
LOCAL: string;
|
960
|
-
};
|
961
|
-
export declare const MQA_STATS: {
|
962
|
-
MQA_SIZE: number;
|
963
|
-
CA_TYPE: string;
|
964
|
-
DEFAULT_IP: string;
|
965
|
-
DEFAULT_SHARE_SENDER_STATS: {
|
966
|
-
common: {
|
967
|
-
common: {
|
968
|
-
direction: string;
|
969
|
-
isMain: boolean;
|
970
|
-
mariFecEnabled: boolean;
|
971
|
-
mariRtxEnabled: boolean;
|
972
|
-
mariLiteEnabled: boolean;
|
973
|
-
mariQosEnabled: boolean;
|
974
|
-
multistreamEnabled: boolean;
|
975
|
-
};
|
976
|
-
availableBitrate: number;
|
977
|
-
dtlsBitrate: number;
|
978
|
-
dtlsPackets: number;
|
979
|
-
fecBitrate: number;
|
980
|
-
fecPackets: number;
|
981
|
-
maxBitrate: number;
|
982
|
-
queueDelay: number;
|
983
|
-
remoteJitter: number;
|
984
|
-
remoteLossRate: number;
|
985
|
-
roundTripTime: number;
|
986
|
-
rtcpBitrate: number;
|
987
|
-
rtcpPackets: number;
|
988
|
-
rtpBitrate: number;
|
989
|
-
rtpPackets: number;
|
990
|
-
stunBitrate: number;
|
991
|
-
stunPackets: number;
|
992
|
-
transportType: string;
|
993
|
-
};
|
994
|
-
streams: {
|
995
|
-
common: {
|
996
|
-
codec: string;
|
997
|
-
duplicateSsci: number;
|
998
|
-
requestedBitrate: number;
|
999
|
-
requestedFrames: number;
|
1000
|
-
rtpPackets: number;
|
1001
|
-
ssci: number;
|
1002
|
-
transmittedBitrate: number;
|
1003
|
-
transmittedFrameRate: number;
|
1004
|
-
};
|
1005
|
-
h264CodecProfile: string;
|
1006
|
-
localConfigurationChanges: number;
|
1007
|
-
remoteConfigurationChanges: number;
|
1008
|
-
requestedFrameSize: number;
|
1009
|
-
requestedKeyFrames: number;
|
1010
|
-
transmittedFrameSize: number;
|
1011
|
-
transmittedHeight: number;
|
1012
|
-
transmittedKeyFrames: number;
|
1013
|
-
transmittedWidth: number;
|
1014
|
-
}[];
|
1015
|
-
};
|
1016
|
-
intervalMetadata: {
|
1017
|
-
memoryUsage: {
|
1018
|
-
cpuBitWidth: number;
|
1019
|
-
mainProcessMaximumMemoryBytes: number;
|
1020
|
-
osBitWidth: number;
|
1021
|
-
processAverageMemoryUsage: number;
|
1022
|
-
processMaximumMemoryBytes: number;
|
1023
|
-
processMaximumMemoryUsage: number;
|
1024
|
-
systemAverageMemoryUsage: number;
|
1025
|
-
systemMaximumMemoryUsage: number;
|
1026
|
-
};
|
1027
|
-
peerReflexiveIP: string;
|
1028
|
-
processAverageCPU: number;
|
1029
|
-
processMaximumCPU: number;
|
1030
|
-
systemAverageCPU: number;
|
1031
|
-
systemMaximumCPU: number;
|
1032
|
-
};
|
1033
|
-
};
|
1034
969
|
export declare const QUALITY_LEVELS: {
|
1035
970
|
LOW: string;
|
1036
971
|
MEDIUM: string;
|
@@ -10,7 +10,10 @@ declare enum Control {
|
|
10
10
|
reactions = "reactions",
|
11
11
|
shareControl = "shareControl",
|
12
12
|
video = "video",
|
13
|
-
viewTheParticipantList = "viewTheParticipantList"
|
13
|
+
viewTheParticipantList = "viewTheParticipantList",
|
14
|
+
annotation = "annotation",
|
15
|
+
rdc = "rdc",
|
16
|
+
pollingQA = "pollingQA"
|
14
17
|
}
|
15
18
|
export { Control, Setting };
|
16
19
|
export default Setting;
|
@@ -32,7 +32,16 @@ export interface ViewTheParticipantListProperties {
|
|
32
32
|
panelistEnabled?: boolean;
|
33
33
|
attendeeCount?: boolean;
|
34
34
|
}
|
35
|
-
export
|
35
|
+
export interface AnnotationProperties {
|
36
|
+
enabled?: boolean;
|
37
|
+
}
|
38
|
+
export interface RemoteDesktopControlProperties {
|
39
|
+
enabled?: boolean;
|
40
|
+
}
|
41
|
+
export interface PollingQAProperties {
|
42
|
+
enabled?: boolean;
|
43
|
+
}
|
44
|
+
export type Properties = AudioProperties | RaiseHandProperties | ReactionsProperties | ShareControlProperties | VideoProperties | ViewTheParticipantListProperties | AnnotationProperties | RemoteDesktopControlProperties | PollingQAProperties;
|
36
45
|
export interface ControlConfig<Props = Properties> {
|
37
46
|
/**
|
38
47
|
* The scope of the control within this object.
|
@@ -37,6 +37,7 @@ export default class LocusInfo extends EventsScope {
|
|
37
37
|
services: any;
|
38
38
|
resources: any;
|
39
39
|
mainSessionLocusCache: any;
|
40
|
+
self: any;
|
40
41
|
/**
|
41
42
|
* Constructor
|
42
43
|
* @param {function} updateMeeting callback to update the meeting object from an object
|
@@ -249,13 +250,12 @@ export default class LocusInfo extends EventsScope {
|
|
249
250
|
updateReplace(replace: object): void;
|
250
251
|
/**
|
251
252
|
* handles when the locus.self is updated
|
252
|
-
* @param {Object} self the locus.
|
253
|
-
* @param {Array} participants the locus.participants property
|
253
|
+
* @param {Object} self the new locus.self
|
254
254
|
* @returns {undefined}
|
255
255
|
* @memberof LocusInfo
|
256
256
|
* emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self
|
257
257
|
*/
|
258
|
-
updateSelf(self: any
|
258
|
+
updateSelf(self: any): void;
|
259
259
|
/**
|
260
260
|
* handles when the locus.url is updated
|
261
261
|
* @param {String} url
|