@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/breakouts/breakout.js +116 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.js +23 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/index.js +226 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/common/browser-detection.js +1 -20
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +5 -20
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +0 -7
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +10 -24
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +11 -24
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +12 -25
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +10 -24
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +10 -24
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +9 -23
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +10 -24
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +10 -24
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +6 -41
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +5 -25
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +0 -22
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +0 -23
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +0 -12
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +0 -15
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +0 -4
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -8
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +37 -60
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +4 -14
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +6 -6
- package/dist/config.js.map +1 -1
- package/dist/constants.js +88 -46
- package/dist/constants.js.map +1 -1
- package/dist/index.js +1 -17
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +12 -29
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -26
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +0 -15
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +4 -12
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +184 -190
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +3 -37
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +12 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +92 -118
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +34 -91
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +67 -111
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +80 -114
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +2 -9
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +10 -12
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.js +125 -190
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +5 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +1692 -1925
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +36 -77
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +224 -230
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +21 -31
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +43 -215
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +6 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +14 -32
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +193 -268
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +3 -15
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +137 -228
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +5 -20
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +490 -560
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +24 -41
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +99 -155
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +78 -86
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +31 -68
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +3 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +93 -200
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +16 -39
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js +9 -38
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +0 -2
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +1 -2
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +55 -135
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +57 -32
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/multistreamMedia.js +15 -21
- package/dist/multistream/multistreamMedia.js.map +1 -1
- package/dist/multistream/receiveSlot.js +10 -50
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +45 -82
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +18 -58
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +6 -40
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +362 -416
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +36 -57
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +21 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +1 -31
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +138 -182
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +3 -18
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +109 -0
- package/dist/reactions/reactions.js.map +1 -0
- package/dist/reactions/reactions.type.js +36 -0
- package/dist/reactions/reactions.type.js.map +1 -0
- package/dist/reconnection-manager/index.js +322 -455
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +39 -64
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +94 -113
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +85 -94
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +0 -2
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +85 -175
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +72 -53
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +22 -47
- package/dist/transcription/index.js.map +1 -1
- package/internal-README.md +7 -6
- package/package.json +25 -20
- package/src/breakouts/README.md +190 -0
- package/src/breakouts/breakout.ts +110 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/index.ts +225 -0
- package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
- package/src/common/collection.ts +9 -7
- package/src/common/{config.js → config.ts} +1 -1
- package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
- package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
- package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
- package/src/common/errors/{media.js → media.ts} +11 -7
- package/src/common/errors/parameter.ts +11 -7
- package/src/common/errors/{password-error.js → password-error.ts} +11 -7
- package/src/common/errors/{permission.js → permission.ts} +10 -6
- package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
- package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
- package/src/common/errors/{stats.js → stats.ts} +11 -7
- package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
- package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
- package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
- package/src/common/events/{events.js → events.ts} +5 -1
- package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
- package/src/common/events/{util.js → util.ts} +2 -3
- package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
- package/src/common/logs/logger-proxy.ts +44 -0
- package/src/common/logs/{request.js → request.ts} +22 -9
- package/src/common/queue.ts +1 -2
- package/src/{config.js → config.ts} +17 -12
- package/src/constants.ts +40 -1
- package/src/index.js +1 -1
- package/src/locus-info/controlsUtils.ts +114 -0
- package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
- package/src/locus-info/{fullState.js → fullState.ts} +16 -12
- package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
- package/src/locus-info/{index.js → index.ts} +148 -64
- package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
- package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
- package/src/locus-info/{parser.js → parser.ts} +67 -79
- package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
- package/src/media/{index.js → index.ts} +181 -131
- package/src/media/{properties.js → properties.ts} +47 -28
- package/src/media/{util.js → util.ts} +2 -2
- package/src/mediaQualityMetrics/{config.js → config.ts} +46 -46
- package/src/meeting/{effectsState.js → effectsState.ts} +47 -41
- package/src/meeting/in-meeting-actions.ts +15 -3
- package/src/meeting/{index.js → index.ts} +2263 -1427
- package/src/meeting/{muteState.js → muteState.ts} +78 -42
- package/src/meeting/{request.js → request.ts} +292 -142
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/{state.js → state.ts} +50 -35
- package/src/meeting/{util.js → util.ts} +112 -115
- package/src/meeting-info/{collection.js → collection.ts} +6 -2
- package/src/meeting-info/{index.js → index.ts} +42 -36
- package/src/meeting-info/meeting-info-v2.ts +273 -0
- package/src/meeting-info/{request.js → request.ts} +14 -4
- package/src/meeting-info/{util.js → util.ts} +60 -51
- package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
- package/src/meetings/{collection.js → collection.ts} +6 -3
- package/src/meetings/index.ts +1159 -0
- package/src/meetings/{request.js → request.ts} +32 -25
- package/src/meetings/{util.js → util.ts} +34 -32
- package/src/member/{index.js → index.ts} +102 -56
- package/src/member/{util.js → util.ts} +52 -25
- package/src/members/{collection.js → collection.ts} +2 -2
- package/src/members/{index.js → index.ts} +219 -142
- package/src/members/{request.js → request.ts} +60 -16
- package/src/members/{util.js → util.ts} +50 -48
- package/src/metrics/{config.js → config.ts} +254 -83
- package/src/metrics/{constants.js → constants.ts} +0 -2
- package/src/metrics/{index.js → index.ts} +106 -74
- package/src/multistream/mediaRequestManager.ts +81 -15
- package/src/multistream/multistreamMedia.ts +5 -0
- package/src/multistream/receiveSlot.ts +18 -12
- package/src/multistream/receiveSlotManager.ts +23 -21
- package/src/multistream/remoteMedia.ts +15 -5
- package/src/multistream/remoteMediaGroup.ts +4 -3
- package/src/multistream/remoteMediaManager.ts +153 -37
- package/src/networkQualityMonitor/{index.js → index.ts} +37 -25
- package/src/personal-meeting-room/{index.js → index.ts} +28 -19
- package/src/personal-meeting-room/{request.js → request.ts} +13 -4
- package/src/personal-meeting-room/{util.js → util.ts} +4 -4
- package/src/reachability/{index.js → index.ts} +99 -83
- package/src/reachability/request.ts +39 -33
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +104 -0
- package/src/reactions/reactions.type.ts +62 -0
- package/src/reconnection-manager/{index.js → index.ts} +195 -102
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/{index.js → index.ts} +73 -56
- package/src/roap/request.ts +157 -0
- package/src/roap/turnDiscovery.ts +77 -37
- package/src/statsAnalyzer/{global.js → global.ts} +30 -33
- package/src/statsAnalyzer/{index.js → index.ts} +468 -192
- package/src/statsAnalyzer/mqaUtil.ts +290 -0
- package/src/transcription/{index.js → index.ts} +46 -39
- package/test/integration/spec/journey.js +664 -463
- package/test/integration/spec/space-meeting.js +320 -206
- package/test/integration/spec/transcription.js +7 -8
- package/test/unit/spec/breakouts/breakout.ts +119 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- package/test/unit/spec/breakouts/index.ts +293 -0
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/fixture/locus.js +92 -90
- package/test/unit/spec/locus-info/controlsUtils.js +25 -5
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +104 -2
- package/test/unit/spec/locus-info/infoUtils.js +41 -32
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +97 -103
- package/test/unit/spec/locus-info/selfUtils.js +105 -12
- package/test/unit/spec/media/index.ts +31 -47
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/effectsState.js +39 -45
- package/test/unit/spec/meeting/in-meeting-actions.ts +5 -2
- package/test/unit/spec/meeting/index.js +2017 -742
- package/test/unit/spec/meeting/muteState.js +42 -33
- package/test/unit/spec/meeting/request.js +115 -44
- package/test/unit/spec/meeting/utils.js +104 -171
- package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +110 -74
- package/test/unit/spec/meetings/collection.js +1 -1
- package/test/unit/spec/meetings/index.js +439 -257
- package/test/unit/spec/meetings/utils.js +14 -12
- package/test/unit/spec/member/index.js +0 -1
- package/test/unit/spec/member/util.js +31 -7
- package/test/unit/spec/members/index.js +104 -54
- package/test/unit/spec/members/request.js +29 -20
- package/test/unit/spec/members/utils.js +8 -5
- package/test/unit/spec/metrics/index.js +16 -21
- package/test/unit/spec/multistream/mediaRequestManager.ts +316 -50
- package/test/unit/spec/multistream/receiveSlot.ts +6 -6
- package/test/unit/spec/multistream/receiveSlotManager.ts +13 -13
- package/test/unit/spec/multistream/remoteMedia.ts +10 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
- package/test/unit/spec/networkQualityMonitor/index.js +21 -15
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +58 -26
- package/test/unit/spec/reconnection-manager/index.js +102 -9
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +2 -1
- package/test/unit/spec/roap/request.ts +114 -0
- package/test/unit/spec/roap/turnDiscovery.ts +64 -45
- package/test/unit/spec/stats-analyzer/index.js +27 -22
- package/test/utils/cmr.js +44 -42
- package/test/utils/testUtils.js +83 -74
- package/test/utils/webex-config.js +18 -18
- package/test/utils/webex-test-users.js +54 -50
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -22
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/peer-connection-manager/util.js +0 -124
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/src/common/logs/logger-proxy.js +0 -33
- package/src/locus-info/controlsUtils.js +0 -102
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/meeting-info/meeting-info-v2.js +0 -255
- package/src/meetings/index.js +0 -1015
- package/src/peer-connection-manager/util.ts +0 -117
- package/src/roap/request.js +0 -127
- package/src/statsAnalyzer/mqaUtil.js +0 -173
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["OSMap","OS_NAME","chrome","macOS","MAC","Windows","WINDOWS","iOS","IOS","Android","ANDROID","Linux","LINUX","BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","localIp","anonymize","triggerTimers","event","meeting","data","eventType","CALL_INITIATED","setStartCallInitiateJoinReq","LOCUS_JOIN_REQUEST","setEndCallInitiateJoinReq","setStartJoinReqResp","LOCUS_JOIN_RESPONSE","setEndJoinReqResp","setStartSetupDelay","mediaType","AUDIO","VIDEO","setStartSendingMediaDelay","RECEIVING_MEDIA_START","setEndSetupDelay","SENDING_MEDIA_START","setEndSendingMediaDelay","LOCAL_SDP_GENERATED","setStartLocalSDPGenRemoteSDPRecvDelay","REMOTE_SDP_RECEIVED","setEndLocalSDPGenRemoteSDPRecvDelay","Metrics","instance","_events","meetingCollection","keys","webex","options","meetingId","indexOf","LoggerProxy","logger","error","get","callEvents","MEDIA_QUALITY","sendMediaQualityAnalyzerMetrics","push","sendCallAnalyzerMetrics","info","identifiers","payload","eventId","uuid","v4","version","origin","name","networkType","userAgent","userAgentToString","clientInfo","clientType","clientVersion","CLIENT_NAME","localNetworkPrefix","meetings","geoHintInfo","clientAddress","osVersion","subClientType","os","getOsName","browser","browserVersion","originTime","triggered","Date","toISOString","senderCountryCode","countryCode","canProceed","eventData","webClientDomain","window","location","hostname","Object","prototype","hasOwnProperty","call","errors","trigger","pstnAudioType","mediaCapabilities","recoveredBy","joinTimes","isRoapCallEnabled","OTHERS","audioSetupDelay","videoSetupDelay","UNKNOWN","intervals","intervalData","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","err","showToUser","errorCode","statusCode","body","ERROR_CODE","MEETING_ERRORS","FREE_USER_MAX_PARTICIPANTS_EXCEEDED","PAID_USER_MAX_PARTICIPANTS_EXCEEDED","SERVICE_MAX_PARTICIPANTS_EXCEEDED","INACTIVE","EXCEEDED_MAX_JOINED_PARTICIPANTS","EXCEEDED_SERVICE_MAX_PARTICIPANTS","MEETING_IS_LOCKED","MEETING_IS_TERMINATING","MEETING_REQUIRE_MODERATOR_PIN_INTENT","MEETING_REQUIRE_MODERATOR_PIN","MEETING_REQUIRE_MODERATOR_ROLE","JOIN_RESTRICTED_USER","GET_RESTRICTED_USER","CREATE_MEDIA_RESTRICTED_USER","JOIN_RESTRICTED_USER_NOT_IN_ROOM","MEETING_NOT_FOUND","NOT_WEBEX_SITE","INVALID_JOIN_TIME","PHONE_NUMBER_NOT_A_NUMBER","PHONE_NUMBER_TOO_LONG","INVALID_DIALABLE_KEY","ONE_ON_ONE_TO_SELF_NOT_ALLOWED","REMOVED_PARTICIPANT","MEETING_LINK_NOT_FOUND","PHONE_NUMBER_TOO_SHORT_AFTER_IDD","INVALID_INVITEE_ADDRESS","PMR_ACCOUNT_LOCKED","RESOURCE_GUEST_FORBIDDEN","PMR_ACCOUNT_SUSPENDED","EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE","INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST","CONVERSATION_NOT_FOUND","RECORDING_CONTROL_NOT_SUPPORTED","RECORDING_NOT_STARTED","RECORDING_NOT_ENABLED","generateErrorPayload","LOCUS_RESPONSE","shownToUser","errorPayload","category","errorDescription","fatal","notFatalErrorList","OTHER","errorData","httpCode","userAgentOption","browserInfo","util","format","metrics","clientName","toLowerCase","split","osInfo","process","env","NODE_ENV","metricName","metricFields","metricTags","internal","submitClientMetrics","type","config","fields","tags"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport util from 'util';\n\nimport {includes} from 'lodash';\nimport uuid from 'uuid';\nimport window from 'global/window';\nimport anonymize from 'ip-anonymize';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEETING_ERRORS} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\n\nimport {\n error, eventType, errorCodes as ERROR_CODE, OS_NAME, UNKNOWN, CLIENT_NAME,\n mediaType\n} from './config';\n\nconst OSMap = {\n 'Chrome OS': OS_NAME.chrome,\n macOS: OS_NAME.MAC,\n Windows: OS_NAME.WINDOWS,\n iOS: OS_NAME.IOS,\n Android: OS_NAME.ANDROID,\n Linux: OS_NAME.LINUX\n};\n\nconst {\n getOSName,\n getOSVersion,\n getBrowserName,\n getBrowserVersion\n} = BrowserDetection();\n\n// Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses\n// For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing\nconst anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\nconst triggerTimers = ({event, meeting, data}) => {\n switch (event) {\n case eventType.CALL_INITIATED:\n meeting.setStartCallInitiateJoinReq();\n break;\n case eventType.LOCUS_JOIN_REQUEST:\n meeting.setEndCallInitiateJoinReq();\n meeting.setStartJoinReqResp();\n break;\n case eventType.LOCUS_JOIN_RESPONSE:\n meeting.setEndJoinReqResp();\n meeting.setStartSetupDelay(mediaType.AUDIO);\n meeting.setStartSetupDelay(mediaType.VIDEO);\n meeting.setStartSendingMediaDelay(mediaType.AUDIO);\n meeting.setStartSendingMediaDelay(mediaType.VIDEO);\n break;\n case eventType.RECEIVING_MEDIA_START:\n meeting.setEndSetupDelay(data.mediaType);\n break;\n case eventType.SENDING_MEDIA_START:\n meeting.setEndSendingMediaDelay(data.mediaType);\n break;\n case eventType.LOCAL_SDP_GENERATED:\n meeting.setStartLocalSDPGenRemoteSDPRecvDelay();\n break;\n case eventType.REMOTE_SDP_RECEIVED:\n meeting.setEndLocalSDPGenRemoteSDPRecvDelay();\n break;\n default:\n break;\n }\n};\n\n/**\n * @description Metrics handles all the call metrics events\n * @export\n * @class Metrics\n */\nclass Metrics {\n /**\n * Create Metrics Object\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor() {\n if (!Metrics.instance) {\n /**\n * @instance\n * @type {Array}\n * @private\n * @memberof Metrics\n */\n this._events = [];\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.meetingCollection = null;\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.keys = Object.values(eventType);\n /**\n * @instance\n * @type {Metrics}\n * @private\n * @memberof Metrics\n */\n Metrics.instance = this;\n }\n\n return Metrics.instance;\n }\n\n /**\n * Initializes the Metrics singleton with a meeting Collection.\n *\n * @param {Object} meetingCollection meetings object\n * @param {Object} webex webex SDK object\n *\n * @returns {void}\n */\n initialSetup(meetingCollection, webex) {\n this.meetingCollection = meetingCollection;\n this.webex = webex;\n }\n\n /**\n * poste Meeting event metrics\n * @param {object} options {meetingId/meeting} as a json object\n * @param {Meeting} options.meeting Meeting object\n * @param {String} options.meetingId\n * @param {object} options.data\n * @param {object} options.event\n * @returns {object} null\n */\n postEvent(options) {\n const {meetingId, data = {}, event} = options;\n let {meeting} = options;\n\n if (this.keys.indexOf(event) === -1) {\n LoggerProxy.logger.error(`Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`);\n }\n\n if (!meeting && meetingId) {\n meeting = this.meetingCollection.get(meetingId);\n options.meeting = meeting;\n }\n\n if (meeting) {\n triggerTimers(options);\n\n if (!meeting.callEvents) {\n meeting.callEvents = [];\n }\n if (event === eventType.MEDIA_QUALITY) {\n data.event = event;\n meeting.sendMediaQualityAnalyzerMetrics(data);\n }\n else {\n meeting.callEvents.push(event);\n data.event = event;\n meeting.sendCallAnalyzerMetrics(data);\n }\n }\n\n else {\n LoggerProxy.logger.info(`Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`);\n }\n }\n\n /**\n * Docs for Call analyzer metrics\n * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki\n * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml\n */\n\n initPayload(eventType, identifiers, options) {\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n name: 'endpoint',\n networkType: 'unknown',\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType,\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n osVersion: getOSVersion() || 'unknown',\n subClientType: options.subClientType,\n os: this.getOsName(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n eventData: {webClientDomain: window.location.hostname}\n }\n };\n\n // TODO: more options should be checked and some of them should be mandatory in certain conditions\n if (options) {\n if (Object.prototype.hasOwnProperty.call(options, 'canProceed')) {\n payload.event.canProceed = options.canProceed;\n }\n if (options.errors) {\n payload.event.errors = options.errors;\n }\n if (options.mediaType) {\n payload.event.mediaType = options.mediaType;\n }\n if (options.trigger) {\n payload.event.trigger = options.trigger;\n }\n if (options.pstnAudioType) {\n payload.event.pstnAudioType = options.pstnAudioType;\n }\n if (options.mediaCapabilities) {\n payload.event.mediaCapabilities = options.mediaCapabilities;\n }\n if (options.recoveredBy) {\n payload.event.recoveredBy = options.recoveredBy;\n }\n if (options.joinTimes) {\n payload.event.joinTimes = options.joinTimes;\n }\n if (options.isRoapCallEnabled) {\n payload.event.isRoapCallEnabled = options.isRoapCallEnabled;\n }\n }\n\n return payload;\n }\n\n /**\n * returns metrics friendly OS versions\n * @param {String} osName Os name\n * @returns {String}\n * @private\n * @memberof Metrics\n */\n getOsName() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n }\n\n /**\n * get the payload specific for a media quality event through call analyzer\n * @param {String} eventType the event name\n * @param {Object} identifiers contains the identifiers needed for CA\n * @param {String} identifiers.correlationId\n * @param {String} identifiers.locusUrl\n * @param {String} identifiers.locusId\n * @param {Object} options\n * @param {Object} options.intervalData\n * @param {String} options.clientType\n * @returns {Object}\n * @public\n * @memberof Metrics\n */\n initMediaPayload(eventType, identifiers, options = {}) {\n const {audioSetupDelay, videoSetupDelay, joinTimes} = options;\n\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n audioSetupDelay,\n videoSetupDelay,\n name: 'endpoint',\n networkType: options.networkType || UNKNOWN,\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n os: this.getOsName(),\n osVersion: getOSVersion() || UNKNOWN,\n subClientType: options.subClientType,\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n intervals: [options.intervalData],\n joinTimes,\n eventData: {\n webClientDomain: window.location.hostname\n },\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,\n startTime: new Date().toISOString()\n }\n }\n };\n\n return payload;\n }\n\n /**\n * This function Parses a Locus error and returns a diagnostic event payload.\n * It should keep updating from:\n * https://sqbu-github.cisco.com/WebExSquared/spark-client-framework/blob/master/spark-client-framework/Adapters/TelephonyAdapter/TelephonyAdapter.cpp#L920\n *\n * @param {Object} err the error Object from Locus response\n * @param {boolean} showToUser true if a toast is shown to user\n * @returns {{showToUser: boolean, category: string, errorDescription: string,\n * errorCode: number, errorData: *, fatal: boolean, name: string}}\n */\n parseLocusError(err, showToUser) {\n let errorCode;\n\n if (err && err.statusCode && err.statusCode >= 500) {\n errorCode = 1003;\n }\n else if (err && err.body && err.body.errorCode) {\n // locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties\n switch (ERROR_CODE[err.body.errorCode]) {\n case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3007;\n break;\n case MEETING_ERRORS.PAID_USER_MAX_PARTICIPANTS_EXCEEDED:\n case MEETING_ERRORS.SERVICE_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3002;\n break;\n case MEETING_ERRORS.INACTIVE:\n errorCode = 4001;\n break;\n case MEETING_ERRORS.EXCEEDED_MAX_JOINED_PARTICIPANTS:\n case MEETING_ERRORS.EXCEEDED_SERVICE_MAX_PARTICIPANTS:\n errorCode = 3001;\n break;\n case MEETING_ERRORS.MEETING_IS_LOCKED:\n errorCode = 4002;\n break;\n case MEETING_ERRORS.MEETING_IS_TERMINATING:\n errorCode = 4003;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN_INTENT:\n errorCode = 4004;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN:\n errorCode = 4005;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_ROLE:\n errorCode = 4006;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER:\n case MEETING_ERRORS.GET_RESTRICTED_USER:\n case MEETING_ERRORS.CREATE_MEDIA_RESTRICTED_USER:\n errorCode = 3005;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER_NOT_IN_ROOM:\n errorCode = 4007;\n break;\n case MEETING_ERRORS.MEETING_NOT_FOUND:\n errorCode = 4011;\n break;\n case MEETING_ERRORS.NOT_WEBEX_SITE:\n errorCode = 4012;\n break;\n case MEETING_ERRORS.INVALID_JOIN_TIME:\n errorCode = 4013;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_NOT_A_NUMBER:\n errorCode = 4016;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_LONG:\n errorCode = 4017;\n break;\n case MEETING_ERRORS.INVALID_DIALABLE_KEY:\n errorCode = 4018;\n break;\n case MEETING_ERRORS.ONE_ON_ONE_TO_SELF_NOT_ALLOWED:\n errorCode = 4019;\n break;\n case MEETING_ERRORS.REMOVED_PARTICIPANT:\n errorCode = 4020;\n break;\n case MEETING_ERRORS.MEETING_LINK_NOT_FOUND:\n errorCode = 4021;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_SHORT_AFTER_IDD:\n errorCode = 4022;\n break;\n case MEETING_ERRORS.INVALID_INVITEE_ADDRESS:\n errorCode = 4023;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_LOCKED:\n errorCode = 4024;\n break;\n case MEETING_ERRORS.RESOURCE_GUEST_FORBIDDEN:\n errorCode = 4025;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_SUSPENDED:\n errorCode = 4026;\n break;\n case MEETING_ERRORS.EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE:\n errorCode = 4027;\n break;\n case MEETING_ERRORS.INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST:\n errorCode = 1006;\n break;\n case MEETING_ERRORS.CONVERSATION_NOT_FOUND:\n errorCode = 4028;\n break;\n case MEETING_ERRORS.RECORDING_CONTROL_NOT_SUPPORTED:\n case MEETING_ERRORS.RECORDING_NOT_STARTED:\n case MEETING_ERRORS.RECORDING_NOT_ENABLED:\n errorCode = 4029;\n break;\n default:\n errorCode = 4008;\n }\n }\n else {\n errorCode = 4008;\n }\n\n return this.generateErrorPayload(\n errorCode, showToUser, error.name.LOCUS_RESPONSE, err\n );\n }\n\n\n generateErrorPayload(errorCode, shownToUser, name, err) {\n if (error.errors[errorCode]) {\n const errorPayload = {\n shownToUser: shownToUser || false,\n category: error.errors[errorCode][2],\n errorDescription: error.errors[errorCode][0],\n errorCode,\n fatal: !includes(error.notFatalErrorList, errorCode),\n name: name || error.name.OTHER\n };\n\n if (err && err.body) {\n errorPayload.errorData = err.body;\n }\n\n if (err && err.statusCode) {\n errorPayload.httpCode = err.statusCode;\n }\n\n return errorPayload;\n }\n\n return null;\n }\n\n /**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\n userAgentToString() {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);\n\n if (['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1) {\n browserInfo = util.format('browser=%s', `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`);\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption ? `${userAgentOption}; ${clientInfo}; ${osInfo}` : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format('webex-js-sdk/%s %s', `${process.env.NODE_ENV}-${this.webex.version}`, userAgentOption);\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);\n }\n\n /**\n * Uploads given metric to the Metrics service as an Behavioral metric.\n * Metadata about the environment such as browser, OS, SDK and their versions\n * are automatically added when the metric is sent.\n *\n * The Metrics service will send an Behavioral metric to InfluxDB for\n * aggregation.\n * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.\n *\n * @param {string} metricName Name of the metric (measurement) to send\n * @param {Object} metricFields Key-valye pairs of data or values about this metric\n * @param {Object} metricTags Key-value pairs of metric metadata\n *\n * @returns {void}\n */\n sendBehavioralMetric(metricName, metricFields = {}, metricTags = {}) {\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: this.webex.config.metrics.type,\n fields: metricFields,\n tags: metricTags\n });\n }\n}\n\n// Export Metrics singleton ---------------------------------------------------\nconst instance = new Metrics();\n\nexport default instance;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["OSMap","OS_NAME","chrome","macOS","MAC","Windows","WINDOWS","iOS","IOS","Android","ANDROID","Linux","LINUX","BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","localIp","anonymize","triggerTimers","event","meeting","data","eventType","CALL_INITIATED","setStartCallInitiateJoinReq","LOCUS_JOIN_REQUEST","setEndCallInitiateJoinReq","setStartJoinReqResp","LOCUS_JOIN_RESPONSE","setEndJoinReqResp","setStartSetupDelay","mediaType","AUDIO","VIDEO","setStartSendingMediaDelay","RECEIVING_MEDIA_START","setEndSetupDelay","SENDING_MEDIA_START","setEndSendingMediaDelay","LOCAL_SDP_GENERATED","setStartLocalSDPGenRemoteSDPRecvDelay","REMOTE_SDP_RECEIVED","setEndLocalSDPGenRemoteSDPRecvDelay","Metrics","instance","_events","meetingCollection","keys","webex","options","meetingId","indexOf","LoggerProxy","logger","error","get","callEvents","MEDIA_QUALITY","sendMediaQualityAnalyzerMetrics","push","sendCallAnalyzerMetrics","info","identifiers","payload","eventId","uuid","v4","version","origin","name","networkType","userAgent","userAgentToString","clientInfo","clientType","clientVersion","CLIENT_NAME","localNetworkPrefix","meetings","geoHintInfo","clientAddress","osVersion","subClientType","os","getOsName","browser","browserVersion","originTime","triggered","Date","toISOString","senderCountryCode","countryCode","canProceed","eventData","webClientDomain","window","location","hostname","Object","prototype","hasOwnProperty","call","errors","trigger","pstnAudioType","mediaCapabilities","recoveredBy","joinTimes","isRoapCallEnabled","OTHERS","audioSetupDelay","videoSetupDelay","UNKNOWN","intervals","intervalData","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","err","showToUser","errorCode","statusCode","body","ERROR_CODE","MEETING_ERRORS","FREE_USER_MAX_PARTICIPANTS_EXCEEDED","PAID_USER_MAX_PARTICIPANTS_EXCEEDED","SERVICE_MAX_PARTICIPANTS_EXCEEDED","INACTIVE","EXCEEDED_MAX_JOINED_PARTICIPANTS","EXCEEDED_SERVICE_MAX_PARTICIPANTS","MEETING_IS_LOCKED","MEETING_IS_TERMINATING","MEETING_REQUIRE_MODERATOR_PIN_INTENT","MEETING_REQUIRE_MODERATOR_PIN","MEETING_REQUIRE_MODERATOR_ROLE","JOIN_RESTRICTED_USER","GET_RESTRICTED_USER","CREATE_MEDIA_RESTRICTED_USER","JOIN_RESTRICTED_USER_NOT_IN_ROOM","MEETING_NOT_FOUND","NOT_WEBEX_SITE","INVALID_JOIN_TIME","PHONE_NUMBER_NOT_A_NUMBER","PHONE_NUMBER_TOO_LONG","INVALID_DIALABLE_KEY","ONE_ON_ONE_TO_SELF_NOT_ALLOWED","REMOVED_PARTICIPANT","MEETING_LINK_NOT_FOUND","PHONE_NUMBER_TOO_SHORT_AFTER_IDD","INVALID_INVITEE_ADDRESS","PMR_ACCOUNT_LOCKED","RESOURCE_GUEST_FORBIDDEN","PMR_ACCOUNT_SUSPENDED","EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE","INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST","CONVERSATION_NOT_FOUND","RECORDING_CONTROL_NOT_SUPPORTED","RECORDING_NOT_STARTED","RECORDING_NOT_ENABLED","generateErrorPayload","LOCUS_RESPONSE","shownToUser","errorPayload","category","errorDescription","fatal","notFatalErrorList","OTHER","errorData","httpCode","userAgentOption","browserInfo","util","format","metrics","clientName","toLowerCase","split","osInfo","process","env","NODE_ENV","metricName","metricFields","metricTags","internal","submitClientMetrics","type","config","fields","tags"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport util from 'util';\n\nimport {includes} from 'lodash';\nimport uuid from 'uuid';\nimport window from 'global/window';\nimport anonymize from 'ip-anonymize';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEETING_ERRORS} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\n\nimport {\n error,\n eventType,\n errorCodes as ERROR_CODE,\n OS_NAME,\n UNKNOWN,\n CLIENT_NAME,\n mediaType,\n} from './config';\n\nconst OSMap = {\n // @ts-ignore\n 'Chrome OS': OS_NAME.chrome,\n macOS: OS_NAME.MAC,\n Windows: OS_NAME.WINDOWS,\n iOS: OS_NAME.IOS,\n Android: OS_NAME.ANDROID,\n Linux: OS_NAME.LINUX,\n};\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\n// Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses\n// For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing\nconst anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\nconst triggerTimers = ({event, meeting, data}) => {\n switch (event) {\n case eventType.CALL_INITIATED:\n meeting.setStartCallInitiateJoinReq();\n break;\n case eventType.LOCUS_JOIN_REQUEST:\n meeting.setEndCallInitiateJoinReq();\n meeting.setStartJoinReqResp();\n break;\n case eventType.LOCUS_JOIN_RESPONSE:\n meeting.setEndJoinReqResp();\n meeting.setStartSetupDelay(mediaType.AUDIO);\n meeting.setStartSetupDelay(mediaType.VIDEO);\n meeting.setStartSendingMediaDelay(mediaType.AUDIO);\n meeting.setStartSendingMediaDelay(mediaType.VIDEO);\n break;\n case eventType.RECEIVING_MEDIA_START:\n meeting.setEndSetupDelay(data.mediaType);\n break;\n case eventType.SENDING_MEDIA_START:\n meeting.setEndSendingMediaDelay(data.mediaType);\n break;\n case eventType.LOCAL_SDP_GENERATED:\n meeting.setStartLocalSDPGenRemoteSDPRecvDelay();\n break;\n case eventType.REMOTE_SDP_RECEIVED:\n meeting.setEndLocalSDPGenRemoteSDPRecvDelay();\n break;\n default:\n break;\n }\n};\n\n/**\n * @description Metrics handles all the call metrics events\n * @export\n * @class Metrics\n */\nclass Metrics {\n static instance: Metrics;\n\n _events: any;\n keys: any;\n meetingCollection: any;\n webex: any;\n\n /**\n * Create Metrics Object\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor() {\n if (!Metrics.instance) {\n /**\n * @instance\n * @type {Array}\n * @private\n * @memberof Metrics\n */\n this._events = [];\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.meetingCollection = null;\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.keys = Object.values(eventType);\n /**\n * @instance\n * @type {Metrics}\n * @private\n * @memberof Metrics\n */\n Metrics.instance = this;\n }\n\n // eslint-disable-next-line no-constructor-return\n return Metrics.instance;\n }\n\n /**\n * Initializes the Metrics singleton with a meeting Collection.\n *\n * @param {Object} meetingCollection meetings object\n * @param {Object} webex webex SDK object\n *\n * @returns {void}\n */\n initialSetup(meetingCollection: object, webex: object) {\n this.meetingCollection = meetingCollection;\n this.webex = webex;\n }\n\n /**\n * poste Meeting event metrics\n * @param {object} options {meetingId/meeting} as a json object\n * @param {Meeting} options.meeting Meeting object\n * @param {String} options.meetingId\n * @param {object} options.data\n * @param {object} options.event\n * @returns {object} null\n */\n postEvent(options: {meeting?: any; meetingId?: string; data?: object; event?: any} | any) {\n const {meetingId, data = {}, event} = options;\n let {meeting} = options;\n\n if (this.keys.indexOf(event) === -1) {\n LoggerProxy.logger.error(\n `Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`\n );\n }\n\n if (!meeting && meetingId) {\n meeting = this.meetingCollection.get(meetingId);\n options.meeting = meeting;\n }\n\n if (meeting) {\n triggerTimers(options);\n\n if (!meeting.callEvents) {\n meeting.callEvents = [];\n }\n if (event === eventType.MEDIA_QUALITY) {\n data.event = event;\n meeting.sendMediaQualityAnalyzerMetrics(data);\n } else {\n meeting.callEvents.push(event);\n data.event = event;\n meeting.sendCallAnalyzerMetrics(data);\n }\n } else {\n LoggerProxy.logger.info(\n `Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`\n );\n }\n }\n\n /**\n * Docs for Call analyzer metrics\n * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki\n * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml\n */\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n initPayload(eventType, identifiers, options) {\n const payload: any = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n name: 'endpoint',\n networkType: 'unknown',\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType,\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n osVersion: getOSVersion() || 'unknown',\n subClientType: options.subClientType,\n os: this.getOsName(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n },\n originTime: {\n triggered: new Date().toISOString(),\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n eventData: {webClientDomain: window.location.hostname},\n },\n };\n\n // TODO: more options should be checked and some of them should be mandatory in certain conditions\n if (options) {\n if (Object.prototype.hasOwnProperty.call(options, 'canProceed')) {\n payload.event.canProceed = options.canProceed;\n }\n if (options.errors) {\n payload.event.errors = options.errors;\n }\n if (options.mediaType) {\n payload.event.mediaType = options.mediaType;\n }\n if (options.trigger) {\n payload.event.trigger = options.trigger;\n }\n if (options.pstnAudioType) {\n payload.event.pstnAudioType = options.pstnAudioType;\n }\n if (options.mediaCapabilities) {\n payload.event.mediaCapabilities = options.mediaCapabilities;\n }\n if (options.recoveredBy) {\n payload.event.recoveredBy = options.recoveredBy;\n }\n if (options.joinTimes) {\n payload.event.joinTimes = options.joinTimes;\n }\n if (options.isRoapCallEnabled) {\n payload.event.isRoapCallEnabled = options.isRoapCallEnabled;\n }\n }\n\n return payload;\n }\n\n /**\n * returns metrics friendly OS versions\n * @param {String} osName Os name\n * @returns {String}\n * @private\n * @memberof Metrics\n */\n private getOsName() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n }\n\n /**\n * get the payload specific for a media quality event through call analyzer\n * @param {String} eventType the event name\n * @param {Object} identifiers contains the identifiers needed for CA\n * @param {String} identifiers.correlationId\n * @param {String} identifiers.locusUrl\n * @param {String} identifiers.locusId\n * @param {Object} options\n * @param {Object} options.intervalData\n * @param {String} options.clientType\n * @returns {Object}\n * @public\n * @memberof Metrics\n */\n public initMediaPayload(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n eventType: string,\n identifiers: {\n correlationId: string;\n locusUrl: string;\n locusId: string;\n },\n options:\n | {\n intervalData: object;\n clientType: string;\n }\n | any = {}\n ) {\n const {audioSetupDelay, videoSetupDelay, joinTimes} = options;\n\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n audioSetupDelay,\n videoSetupDelay,\n name: 'endpoint',\n networkType: options.networkType || UNKNOWN,\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n os: this.getOsName(),\n osVersion: getOSVersion() || UNKNOWN,\n subClientType: options.subClientType,\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n },\n originTime: {\n triggered: new Date().toISOString(),\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n intervals: [options.intervalData],\n joinTimes,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,\n startTime: new Date().toISOString(),\n },\n },\n };\n\n return payload;\n }\n\n /**\n * This function Parses a Locus error and returns a diagnostic event payload.\n * It should keep updating from:\n * https://sqbu-github.cisco.com/WebExSquared/spark-client-framework/blob/master/spark-client-framework/Adapters/TelephonyAdapter/TelephonyAdapter.cpp#L920\n *\n * @param {Object} err the error Object from Locus response\n * @param {boolean} showToUser true if a toast is shown to user\n * @returns {{showToUser: boolean, category: string, errorDescription: string,\n * errorCode: number, errorData: *, fatal: boolean, name: string}}\n */\n parseLocusError(err: any, showToUser: boolean) {\n let errorCode;\n\n if (err && err.statusCode && err.statusCode >= 500) {\n errorCode = 1003;\n } else if (err && err.body && err.body.errorCode) {\n // locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties\n switch (ERROR_CODE[err.body.errorCode]) {\n case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3007;\n break;\n case MEETING_ERRORS.PAID_USER_MAX_PARTICIPANTS_EXCEEDED:\n case MEETING_ERRORS.SERVICE_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3002;\n break;\n case MEETING_ERRORS.INACTIVE:\n errorCode = 4001;\n break;\n case MEETING_ERRORS.EXCEEDED_MAX_JOINED_PARTICIPANTS:\n case MEETING_ERRORS.EXCEEDED_SERVICE_MAX_PARTICIPANTS:\n errorCode = 3001;\n break;\n case MEETING_ERRORS.MEETING_IS_LOCKED:\n errorCode = 4002;\n break;\n case MEETING_ERRORS.MEETING_IS_TERMINATING:\n errorCode = 4003;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN_INTENT:\n errorCode = 4004;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN:\n errorCode = 4005;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_ROLE:\n errorCode = 4006;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER:\n case MEETING_ERRORS.GET_RESTRICTED_USER:\n case MEETING_ERRORS.CREATE_MEDIA_RESTRICTED_USER:\n errorCode = 3005;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER_NOT_IN_ROOM:\n errorCode = 4007;\n break;\n case MEETING_ERRORS.MEETING_NOT_FOUND:\n errorCode = 4011;\n break;\n case MEETING_ERRORS.NOT_WEBEX_SITE:\n errorCode = 4012;\n break;\n case MEETING_ERRORS.INVALID_JOIN_TIME:\n errorCode = 4013;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_NOT_A_NUMBER:\n errorCode = 4016;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_LONG:\n errorCode = 4017;\n break;\n case MEETING_ERRORS.INVALID_DIALABLE_KEY:\n errorCode = 4018;\n break;\n case MEETING_ERRORS.ONE_ON_ONE_TO_SELF_NOT_ALLOWED:\n errorCode = 4019;\n break;\n case MEETING_ERRORS.REMOVED_PARTICIPANT:\n errorCode = 4020;\n break;\n case MEETING_ERRORS.MEETING_LINK_NOT_FOUND:\n errorCode = 4021;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_SHORT_AFTER_IDD:\n errorCode = 4022;\n break;\n case MEETING_ERRORS.INVALID_INVITEE_ADDRESS:\n errorCode = 4023;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_LOCKED:\n errorCode = 4024;\n break;\n case MEETING_ERRORS.RESOURCE_GUEST_FORBIDDEN:\n errorCode = 4025;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_SUSPENDED:\n errorCode = 4026;\n break;\n case MEETING_ERRORS.EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE:\n errorCode = 4027;\n break;\n case MEETING_ERRORS.INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST:\n errorCode = 1006;\n break;\n case MEETING_ERRORS.CONVERSATION_NOT_FOUND:\n errorCode = 4028;\n break;\n case MEETING_ERRORS.RECORDING_CONTROL_NOT_SUPPORTED:\n case MEETING_ERRORS.RECORDING_NOT_STARTED:\n case MEETING_ERRORS.RECORDING_NOT_ENABLED:\n errorCode = 4029;\n break;\n default:\n errorCode = 4008;\n }\n } else {\n errorCode = 4008;\n }\n\n return this.generateErrorPayload(errorCode, showToUser, error.name.LOCUS_RESPONSE, err);\n }\n\n generateErrorPayload(errorCode, shownToUser, name, err) {\n if (error.errors[errorCode]) {\n const errorPayload: any = {\n shownToUser: shownToUser || false,\n category: error.errors[errorCode][2],\n errorDescription: error.errors[errorCode][0],\n errorCode,\n fatal: !includes(error.notFatalErrorList, errorCode),\n name: name || error.name.OTHER,\n };\n\n if (err && err.body) {\n errorPayload.errorData = err.body;\n }\n\n if (err && err.statusCode) {\n errorPayload.httpCode = err.statusCode;\n }\n\n return errorPayload;\n }\n\n return null;\n }\n\n /**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\n userAgentToString() {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);\n\n if (\n ['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !==\n -1\n ) {\n browserInfo = util.format(\n 'browser=%s',\n `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`\n );\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption\n ? `${userAgentOption}; ${clientInfo}; ${osInfo}`\n : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format(\n 'webex-js-sdk/%s %s',\n `${process.env.NODE_ENV}-${this.webex.version}`,\n userAgentOption\n );\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);\n }\n\n /**\n * Uploads given metric to the Metrics service as an Behavioral metric.\n * Metadata about the environment such as browser, OS, SDK and their versions\n * are automatically added when the metric is sent.\n *\n * The Metrics service will send an Behavioral metric to InfluxDB for\n * aggregation.\n * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.\n *\n * @param {string} metricName Name of the metric (measurement) to send\n * @param {Object} metricFields Key-valye pairs of data or values about this metric\n * @param {Object} metricTags Key-value pairs of metric metadata\n *\n * @returns {void}\n */\n sendBehavioralMetric(metricName: string, metricFields: object = {}, metricTags: object = {}) {\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: this.webex.config.metrics.type,\n fields: metricFields,\n tags: metricTags,\n });\n }\n}\n\n// Export Metrics singleton ---------------------------------------------------\nconst instance = new Metrics();\n\nexport default instance;\n"],"mappings":"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"}
|
|
@@ -1,32 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
-
|
|
5
4
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
6
|
-
|
|
7
5
|
_Object$defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
10
|
-
|
|
11
8
|
exports.MediaRequestManager = void 0;
|
|
12
|
-
|
|
13
9
|
var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
|
|
14
|
-
|
|
15
10
|
var _entries = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/entries"));
|
|
16
|
-
|
|
17
11
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
|
|
18
|
-
|
|
19
12
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
20
|
-
|
|
21
13
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
22
|
-
|
|
23
14
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
24
|
-
|
|
15
|
+
var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
25
16
|
var _internalMediaCore = require("@webex/internal-media-core");
|
|
26
|
-
|
|
27
17
|
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
|
28
|
-
|
|
18
|
+
var _remoteMedia = require("./remoteMedia");
|
|
29
19
|
/* eslint-disable require-jsdoc */
|
|
20
|
+
|
|
30
21
|
var CODEC_DEFAULTS = {
|
|
31
22
|
h264: {
|
|
32
23
|
maxFs: 8192,
|
|
@@ -34,57 +25,95 @@ var CODEC_DEFAULTS = {
|
|
|
34
25
|
maxMbps: 245760
|
|
35
26
|
}
|
|
36
27
|
};
|
|
37
|
-
|
|
38
28
|
var MediaRequestManager = /*#__PURE__*/function () {
|
|
39
|
-
function MediaRequestManager(sendMediaRequestsCallback) {
|
|
29
|
+
function MediaRequestManager(degradationPreferences, sendMediaRequestsCallback) {
|
|
40
30
|
(0, _classCallCheck2.default)(this, MediaRequestManager);
|
|
41
31
|
(0, _defineProperty2.default)(this, "sendMediaRequestsCallback", void 0);
|
|
42
32
|
(0, _defineProperty2.default)(this, "counter", void 0);
|
|
43
33
|
(0, _defineProperty2.default)(this, "clientRequests", void 0);
|
|
44
34
|
(0, _defineProperty2.default)(this, "slotsActiveInLastMediaRequest", void 0);
|
|
35
|
+
(0, _defineProperty2.default)(this, "degradationPreferences", void 0);
|
|
45
36
|
this.sendMediaRequestsCallback = sendMediaRequestsCallback;
|
|
46
37
|
this.counter = 0;
|
|
47
38
|
this.clientRequests = {};
|
|
48
39
|
this.slotsActiveInLastMediaRequest = {};
|
|
40
|
+
this.degradationPreferences = degradationPreferences;
|
|
49
41
|
}
|
|
50
|
-
|
|
51
42
|
(0, _createClass2.default)(MediaRequestManager, [{
|
|
52
43
|
key: "resetInactiveReceiveSlots",
|
|
53
44
|
value: function resetInactiveReceiveSlots() {
|
|
54
|
-
var activeSlots = {};
|
|
45
|
+
var activeSlots = {};
|
|
55
46
|
|
|
47
|
+
// create a map of all currently used slot ids
|
|
56
48
|
(0, _values.default)(this.clientRequests).forEach(function (request) {
|
|
57
49
|
return request.receiveSlots.forEach(function (slot) {
|
|
58
50
|
activeSlots[slot.id] = slot;
|
|
59
51
|
});
|
|
60
|
-
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// when we stop using some receive slots and they are not included in the new media request,
|
|
61
55
|
// we will never get a 'no source' notification for them, so we reset their state,
|
|
62
56
|
// so that the client doesn't try to display their video anymore
|
|
63
|
-
|
|
64
57
|
for (var _i = 0, _Object$entries = (0, _entries.default)(this.slotsActiveInLastMediaRequest); _i < _Object$entries.length; _i++) {
|
|
65
58
|
var _Object$entries$_i = (0, _slicedToArray2.default)(_Object$entries[_i], 2),
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
59
|
+
slotId = _Object$entries$_i[0],
|
|
60
|
+
slot = _Object$entries$_i[1];
|
|
69
61
|
if (!(slotId in activeSlots)) {
|
|
70
62
|
_loggerProxy.default.logger.info("multistream:mediaRequestManager --> resetting sourceState to \"no source\" for slot ".concat(slot.id));
|
|
71
|
-
|
|
72
63
|
slot.resetSourceState();
|
|
73
64
|
}
|
|
74
65
|
}
|
|
75
|
-
|
|
76
66
|
this.slotsActiveInLastMediaRequest = activeSlots;
|
|
77
67
|
}
|
|
68
|
+
}, {
|
|
69
|
+
key: "setDegradationPreferences",
|
|
70
|
+
value: function setDegradationPreferences(degradationPreferences) {
|
|
71
|
+
this.degradationPreferences = degradationPreferences;
|
|
72
|
+
this.sendRequests(); // re-send requests after preferences are set
|
|
73
|
+
}
|
|
74
|
+
}, {
|
|
75
|
+
key: "getDegradedClientRequests",
|
|
76
|
+
value: function getDegradedClientRequests() {
|
|
77
|
+
var _this = this;
|
|
78
|
+
var clientRequests = (0, _cloneDeep2.default)(this.clientRequests);
|
|
79
|
+
var maxFsLimits = [(0, _remoteMedia.getMaxFs)('best'), (0, _remoteMedia.getMaxFs)('large'), (0, _remoteMedia.getMaxFs)('medium'), (0, _remoteMedia.getMaxFs)('small'), (0, _remoteMedia.getMaxFs)('very small'), (0, _remoteMedia.getMaxFs)('thumbnail')];
|
|
80
|
+
|
|
81
|
+
// reduce max-fs until total macroblocks is below limit
|
|
82
|
+
var _loop = function _loop(i) {
|
|
83
|
+
var totalMacroblocksRequested = 0;
|
|
84
|
+
(0, _values.default)(clientRequests).forEach(function (mr) {
|
|
85
|
+
if (mr.codecInfo) {
|
|
86
|
+
mr.codecInfo.maxFs = Math.min(mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs, maxFsLimits[i]);
|
|
87
|
+
totalMacroblocksRequested += mr.codecInfo.maxFs * mr.receiveSlots.length;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
if (totalMacroblocksRequested <= _this.degradationPreferences.maxMacroblocksLimit) {
|
|
91
|
+
if (i !== 0) {
|
|
92
|
+
_loggerProxy.default.logger.warn("multistream:mediaRequestManager --> too many requests with high max-fs, frame size will be limited to ".concat(maxFsLimits[i]));
|
|
93
|
+
}
|
|
94
|
+
return "break";
|
|
95
|
+
} else if (i === maxFsLimits.length - 1) {
|
|
96
|
+
_loggerProxy.default.logger.warn("multistream:mediaRequestManager --> even with frame size limited to ".concat(maxFsLimits[i], " you are still requesting too many streams, consider reducing the number of requests"));
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
for (var i = 0; i < maxFsLimits.length; i += 1) {
|
|
100
|
+
var _ret = _loop(i);
|
|
101
|
+
if (_ret === "break") break;
|
|
102
|
+
}
|
|
103
|
+
return clientRequests;
|
|
104
|
+
}
|
|
78
105
|
}, {
|
|
79
106
|
key: "sendRequests",
|
|
80
107
|
value: function sendRequests() {
|
|
81
|
-
var wcmeMediaRequests = [];
|
|
82
|
-
|
|
108
|
+
var wcmeMediaRequests = [];
|
|
109
|
+
var clientRequests = this.getDegradedClientRequests();
|
|
110
|
+
var maxPayloadBitsPerSecond = 10 * 1000 * 1000;
|
|
83
111
|
|
|
84
|
-
|
|
85
|
-
|
|
112
|
+
// map all the client media requests to wcme media requests
|
|
113
|
+
(0, _values.default)(clientRequests).forEach(function (mr) {
|
|
114
|
+
wcmeMediaRequests.push(new _internalMediaCore.MediaRequest(mr.policyInfo.policy === 'active-speaker' ? _internalMediaCore.Policy.ActiveSpeaker : _internalMediaCore.Policy.ReceiverSelected, mr.policyInfo.policy === 'active-speaker' ? new _internalMediaCore.ActiveSpeakerInfo(mr.policyInfo.priority, mr.policyInfo.crossPriorityDuplication, mr.policyInfo.crossPolicyDuplication, mr.policyInfo.preferLiveVideo) : new _internalMediaCore.ReceiverSelectedInfo(mr.policyInfo.csi), mr.receiveSlots.map(function (receiveSlot) {
|
|
86
115
|
return receiveSlot.wcmeReceiveSlot;
|
|
87
|
-
}), mr.codecInfo && [new _internalMediaCore.
|
|
116
|
+
}), maxPayloadBitsPerSecond, mr.codecInfo && [new _internalMediaCore.CodecInfo(0x80, new _internalMediaCore.H264Codec(mr.codecInfo.maxFs, mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps, mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps, mr.codecInfo.maxWidth, mr.codecInfo.maxHeight))]));
|
|
88
117
|
});
|
|
89
118
|
this.sendMediaRequestsCallback(wcmeMediaRequests);
|
|
90
119
|
this.resetInactiveReceiveSlots();
|
|
@@ -96,11 +125,9 @@ var MediaRequestManager = /*#__PURE__*/function () {
|
|
|
96
125
|
// eslint-disable-next-line no-plusplus
|
|
97
126
|
var newId = "".concat(this.counter++);
|
|
98
127
|
this.clientRequests[newId] = mediaRequest;
|
|
99
|
-
|
|
100
128
|
if (commit) {
|
|
101
129
|
this.commit();
|
|
102
130
|
}
|
|
103
|
-
|
|
104
131
|
return newId;
|
|
105
132
|
}
|
|
106
133
|
}, {
|
|
@@ -108,7 +135,6 @@ var MediaRequestManager = /*#__PURE__*/function () {
|
|
|
108
135
|
value: function cancelRequest(requestId) {
|
|
109
136
|
var commit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
110
137
|
delete this.clientRequests[requestId];
|
|
111
|
-
|
|
112
138
|
if (commit) {
|
|
113
139
|
this.commit();
|
|
114
140
|
}
|
|
@@ -127,6 +153,5 @@ var MediaRequestManager = /*#__PURE__*/function () {
|
|
|
127
153
|
}]);
|
|
128
154
|
return MediaRequestManager;
|
|
129
155
|
}();
|
|
130
|
-
|
|
131
156
|
exports.MediaRequestManager = MediaRequestManager;
|
|
132
157
|
//# sourceMappingURL=mediaRequestManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CODEC_DEFAULTS","h264","maxFs","maxFps","maxMbps","MediaRequestManager","sendMediaRequestsCallback","counter","clientRequests","slotsActiveInLastMediaRequest","activeSlots","forEach","request","receiveSlots","slot","id","slotId","LoggerProxy","logger","info","resetSourceState","wcmeMediaRequests","mr","push","MC","MediaRequest","policyInfo","policy","Policy","ActiveSpeaker","ReceiverSelected","ActiveSpeakerInfo","priority","crossPriorityDuplication","crossPolicyDuplication","preferLiveVideo","ReceiverSelectedInfo","csi","map","receiveSlot","wcmeReceiveSlot","codecInfo","CodecInfo","H264Codec","maxWidth","maxHeight","resetInactiveReceiveSlots","mediaRequest","commit","newId","requestId","sendRequests"],"sources":["mediaRequestManager.ts"],"sourcesContent":["/* eslint-disable require-jsdoc */\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {ReceiveSlot, ReceiveSlotId} from './receiveSlot';\n\nexport interface ActiveSpeakerPolicyInfo {\n policy: 'active-speaker';\n priority: number;\n crossPriorityDuplication: boolean;\n crossPolicyDuplication: boolean;\n preferLiveVideo: boolean;\n}\n\nexport interface ReceiverSelectedPolicyInfo {\n policy: 'receiver-selected';\n csi: number;\n}\n\nexport type PolicyInfo = ActiveSpeakerPolicyInfo | ReceiverSelectedPolicyInfo;\n\nexport interface H264CodecInfo {\n codec: 'h264';\n maxFs?: number;\n maxFps?: number;\n maxMbps?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport type CodecInfo = H264CodecInfo; // we'll add AV1 here in the future when it's available\n\nexport interface MediaRequest {\n policyInfo: PolicyInfo;\n receiveSlots: Array<ReceiveSlot>;\n codecInfo?: CodecInfo;\n}\n\nexport type MediaRequestId = string;\n\nconst CODEC_DEFAULTS = {\n h264: {\n maxFs: 8192,\n maxFps: 3000,\n maxMbps: 245760,\n },\n};\n\ntype SendMediaRequestsCallback = (mediaRequests: MC.MediaRequest[]) => void;\n\nexport class MediaRequestManager {\n private sendMediaRequestsCallback: SendMediaRequestsCallback;\n\n private counter;\n\n private clientRequests: {[key: MediaRequestId]: MediaRequest};\n\n private slotsActiveInLastMediaRequest: {[key: ReceiveSlotId]: ReceiveSlot};\n\n constructor(sendMediaRequestsCallback: SendMediaRequestsCallback) {\n this.sendMediaRequestsCallback = sendMediaRequestsCallback;\n this.counter = 0;\n this.clientRequests = {};\n this.slotsActiveInLastMediaRequest = {};\n }\n\n private resetInactiveReceiveSlots() {\n const activeSlots: {[key: ReceiveSlotId]: ReceiveSlot} = {};\n\n // create a map of all currently used slot ids\n Object.values(this.clientRequests).forEach((request) =>\n request.receiveSlots.forEach((slot) => {\n activeSlots[slot.id] = slot;\n })\n );\n\n // when we stop using some receive slots and they are not included in the new media request,\n // we will never get a 'no source' notification for them, so we reset their state,\n // so that the client doesn't try to display their video anymore\n for (const [slotId, slot] of Object.entries(this.slotsActiveInLastMediaRequest)) {\n if (!(slotId in activeSlots)) {\n LoggerProxy.logger.info(\n `multistream:mediaRequestManager --> resetting sourceState to \"no source\" for slot ${slot.id}`\n );\n slot.resetSourceState();\n }\n }\n\n this.slotsActiveInLastMediaRequest = activeSlots;\n }\n\n private sendRequests() {\n const wcmeMediaRequests: MC.MediaRequest[] = [];\n\n // todo: check how many streams we're asking for and what resolution and introduce some limits (spark-377701)\n\n // map all the client media requests to wcme media requests\n Object.values(this.clientRequests).forEach((mr) => {\n wcmeMediaRequests.push(\n new MC.MediaRequest(\n mr.policyInfo.policy === 'active-speaker'\n ? MC.Policy.ActiveSpeaker\n : MC.Policy.ReceiverSelected,\n mr.policyInfo.policy === 'active-speaker'\n ? new MC.ActiveSpeakerInfo(\n mr.policyInfo.priority,\n mr.policyInfo.crossPriorityDuplication,\n mr.policyInfo.crossPolicyDuplication,\n mr.policyInfo.preferLiveVideo\n )\n : new MC.ReceiverSelectedInfo(mr.policyInfo.csi),\n mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),\n mr.codecInfo && [\n new MC.CodecInfo(\n 0x80,\n new MC.H264Codec(\n mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,\n mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,\n mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,\n mr.codecInfo.maxWidth,\n mr.codecInfo.maxHeight\n )\n ),\n ]\n )\n );\n });\n\n this.sendMediaRequestsCallback(wcmeMediaRequests);\n\n this.resetInactiveReceiveSlots();\n }\n\n public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {\n // eslint-disable-next-line no-plusplus\n const newId = `${this.counter++}`;\n\n this.clientRequests[newId] = mediaRequest;\n\n if (commit) {\n this.commit();\n }\n\n return newId;\n }\n\n public cancelRequest(requestId: MediaRequestId, commit = true) {\n delete this.clientRequests[requestId];\n\n if (commit) {\n this.commit();\n }\n }\n\n public commit() {\n return this.sendRequests();\n }\n\n public reset() {\n this.clientRequests = {};\n this.slotsActiveInLastMediaRequest = {};\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["CODEC_DEFAULTS","h264","maxFs","maxFps","maxMbps","MediaRequestManager","degradationPreferences","sendMediaRequestsCallback","counter","clientRequests","slotsActiveInLastMediaRequest","activeSlots","forEach","request","receiveSlots","slot","id","slotId","LoggerProxy","logger","info","resetSourceState","sendRequests","maxFsLimits","getMaxFs","totalMacroblocksRequested","mr","codecInfo","Math","min","i","length","maxMacroblocksLimit","warn","wcmeMediaRequests","getDegradedClientRequests","maxPayloadBitsPerSecond","push","WcmeMediaRequest","policyInfo","policy","Policy","ActiveSpeaker","ReceiverSelected","ActiveSpeakerInfo","priority","crossPriorityDuplication","crossPolicyDuplication","preferLiveVideo","ReceiverSelectedInfo","csi","map","receiveSlot","wcmeReceiveSlot","WcmeCodecInfo","H264Codec","maxWidth","maxHeight","resetInactiveReceiveSlots","mediaRequest","commit","newId","requestId"],"sources":["mediaRequestManager.ts"],"sourcesContent":["/* eslint-disable require-jsdoc */\nimport {\n MediaRequest as WcmeMediaRequest,\n Policy,\n ActiveSpeakerInfo,\n ReceiverSelectedInfo,\n CodecInfo as WcmeCodecInfo,\n H264Codec,\n} from '@webex/internal-media-core';\nimport {cloneDeep} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {ReceiveSlot, ReceiveSlotId} from './receiveSlot';\nimport {getMaxFs} from './remoteMedia';\n\nexport interface ActiveSpeakerPolicyInfo {\n policy: 'active-speaker';\n priority: number;\n crossPriorityDuplication: boolean;\n crossPolicyDuplication: boolean;\n preferLiveVideo: boolean;\n}\n\nexport interface ReceiverSelectedPolicyInfo {\n policy: 'receiver-selected';\n csi: number;\n}\n\nexport type PolicyInfo = ActiveSpeakerPolicyInfo | ReceiverSelectedPolicyInfo;\n\nexport interface H264CodecInfo {\n codec: 'h264';\n maxFs?: number;\n maxFps?: number;\n maxMbps?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport type CodecInfo = H264CodecInfo; // we'll add AV1 here in the future when it's available\n\nexport interface MediaRequest {\n policyInfo: PolicyInfo;\n receiveSlots: Array<ReceiveSlot>;\n codecInfo?: CodecInfo;\n}\n\nexport type MediaRequestId = string;\n\nconst CODEC_DEFAULTS = {\n h264: {\n maxFs: 8192,\n maxFps: 3000,\n maxMbps: 245760,\n },\n};\n\ntype DegradationPreferences = {\n maxMacroblocksLimit: number;\n};\n\ntype SendMediaRequestsCallback = (mediaRequests: WcmeMediaRequest[]) => void;\n\nexport class MediaRequestManager {\n private sendMediaRequestsCallback: SendMediaRequestsCallback;\n\n private counter: number;\n\n private clientRequests: {[key: MediaRequestId]: MediaRequest};\n\n private slotsActiveInLastMediaRequest: {[key: ReceiveSlotId]: ReceiveSlot};\n\n private degradationPreferences: DegradationPreferences;\n\n constructor(\n degradationPreferences: DegradationPreferences,\n sendMediaRequestsCallback: SendMediaRequestsCallback\n ) {\n this.sendMediaRequestsCallback = sendMediaRequestsCallback;\n this.counter = 0;\n this.clientRequests = {};\n this.slotsActiveInLastMediaRequest = {};\n this.degradationPreferences = degradationPreferences;\n }\n\n private resetInactiveReceiveSlots() {\n const activeSlots: {[key: ReceiveSlotId]: ReceiveSlot} = {};\n\n // create a map of all currently used slot ids\n Object.values(this.clientRequests).forEach((request) =>\n request.receiveSlots.forEach((slot) => {\n activeSlots[slot.id] = slot;\n })\n );\n\n // when we stop using some receive slots and they are not included in the new media request,\n // we will never get a 'no source' notification for them, so we reset their state,\n // so that the client doesn't try to display their video anymore\n for (const [slotId, slot] of Object.entries(this.slotsActiveInLastMediaRequest)) {\n if (!(slotId in activeSlots)) {\n LoggerProxy.logger.info(\n `multistream:mediaRequestManager --> resetting sourceState to \"no source\" for slot ${slot.id}`\n );\n slot.resetSourceState();\n }\n }\n\n this.slotsActiveInLastMediaRequest = activeSlots;\n }\n\n public setDegradationPreferences(degradationPreferences: DegradationPreferences) {\n this.degradationPreferences = degradationPreferences;\n this.sendRequests(); // re-send requests after preferences are set\n }\n\n private getDegradedClientRequests() {\n const clientRequests = cloneDeep(this.clientRequests);\n const maxFsLimits = [\n getMaxFs('best'),\n getMaxFs('large'),\n getMaxFs('medium'),\n getMaxFs('small'),\n getMaxFs('very small'),\n getMaxFs('thumbnail'),\n ];\n\n // reduce max-fs until total macroblocks is below limit\n for (let i = 0; i < maxFsLimits.length; i += 1) {\n let totalMacroblocksRequested = 0;\n Object.values(clientRequests).forEach((mr) => {\n if (mr.codecInfo) {\n mr.codecInfo.maxFs = Math.min(\n mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,\n maxFsLimits[i]\n );\n totalMacroblocksRequested += mr.codecInfo.maxFs * mr.receiveSlots.length;\n }\n });\n if (totalMacroblocksRequested <= this.degradationPreferences.maxMacroblocksLimit) {\n if (i !== 0) {\n LoggerProxy.logger.warn(\n `multistream:mediaRequestManager --> too many requests with high max-fs, frame size will be limited to ${maxFsLimits[i]}`\n );\n }\n break;\n } else if (i === maxFsLimits.length - 1) {\n LoggerProxy.logger.warn(\n `multistream:mediaRequestManager --> even with frame size limited to ${maxFsLimits[i]} you are still requesting too many streams, consider reducing the number of requests`\n );\n }\n }\n\n return clientRequests;\n }\n\n private sendRequests() {\n const wcmeMediaRequests: WcmeMediaRequest[] = [];\n\n const clientRequests = this.getDegradedClientRequests();\n const maxPayloadBitsPerSecond = 10 * 1000 * 1000;\n\n // map all the client media requests to wcme media requests\n Object.values(clientRequests).forEach((mr) => {\n wcmeMediaRequests.push(\n new WcmeMediaRequest(\n mr.policyInfo.policy === 'active-speaker'\n ? Policy.ActiveSpeaker\n : Policy.ReceiverSelected,\n mr.policyInfo.policy === 'active-speaker'\n ? new ActiveSpeakerInfo(\n mr.policyInfo.priority,\n mr.policyInfo.crossPriorityDuplication,\n mr.policyInfo.crossPolicyDuplication,\n mr.policyInfo.preferLiveVideo\n )\n : new ReceiverSelectedInfo(mr.policyInfo.csi),\n mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),\n maxPayloadBitsPerSecond,\n mr.codecInfo && [\n new WcmeCodecInfo(\n 0x80,\n new H264Codec(\n mr.codecInfo.maxFs,\n mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,\n mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,\n mr.codecInfo.maxWidth,\n mr.codecInfo.maxHeight\n )\n ),\n ]\n )\n );\n });\n\n this.sendMediaRequestsCallback(wcmeMediaRequests);\n\n this.resetInactiveReceiveSlots();\n }\n\n public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {\n // eslint-disable-next-line no-plusplus\n const newId = `${this.counter++}`;\n\n this.clientRequests[newId] = mediaRequest;\n\n if (commit) {\n this.commit();\n }\n\n return newId;\n }\n\n public cancelRequest(requestId: MediaRequestId, commit = true) {\n delete this.clientRequests[requestId];\n\n if (commit) {\n this.commit();\n }\n }\n\n public commit() {\n return this.sendRequests();\n }\n\n public reset() {\n this.clientRequests = {};\n this.slotsActiveInLastMediaRequest = {};\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,27 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
-
|
|
5
4
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
6
|
-
|
|
7
5
|
_Object$defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
10
|
-
|
|
11
8
|
exports.MultistreamMedia = void 0;
|
|
12
|
-
|
|
13
9
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
14
|
-
|
|
15
10
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
16
|
-
|
|
17
11
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
18
|
-
|
|
19
12
|
var _constants = require("../constants");
|
|
20
|
-
|
|
21
13
|
var _muteState = _interopRequireDefault(require("../meeting/muteState"));
|
|
22
|
-
|
|
23
14
|
/* eslint-disable import/prefer-default-export */
|
|
24
|
-
|
|
25
15
|
/**
|
|
26
16
|
* Class wrapping all the multistream specific APIs that need to be exposed at meeting level.
|
|
27
17
|
*
|
|
@@ -36,81 +26,85 @@ var MultistreamMedia = /*#__PURE__*/function () {
|
|
|
36
26
|
(0, _defineProperty2.default)(this, "meeting", void 0);
|
|
37
27
|
this.meeting = meeting;
|
|
38
28
|
}
|
|
29
|
+
|
|
30
|
+
// eslint-disable-next-line valid-jsdoc
|
|
39
31
|
/**
|
|
40
32
|
* throws if we don't have a media connection created
|
|
41
33
|
*/
|
|
42
|
-
|
|
43
|
-
|
|
44
34
|
(0, _createClass2.default)(MultistreamMedia, [{
|
|
45
35
|
key: "checkMediaConnection",
|
|
46
36
|
value: function checkMediaConnection() {
|
|
47
37
|
var _this$meeting, _this$meeting$mediaPr;
|
|
48
|
-
|
|
49
38
|
if ((_this$meeting = this.meeting) !== null && _this$meeting !== void 0 && (_this$meeting$mediaPr = _this$meeting.mediaProperties) !== null && _this$meeting$mediaPr !== void 0 && _this$meeting$mediaPr.webrtcMediaConnection) {
|
|
50
39
|
return;
|
|
51
40
|
}
|
|
52
|
-
|
|
53
41
|
throw new Error('Webrtc media connection is missing');
|
|
54
42
|
}
|
|
43
|
+
|
|
55
44
|
/**
|
|
56
45
|
* Publishes a local track in the meeting
|
|
57
46
|
*
|
|
58
47
|
* @param {MediaStreamTrack} track
|
|
59
48
|
* @returns {Promise}
|
|
60
49
|
*/
|
|
61
|
-
|
|
62
50
|
}, {
|
|
63
51
|
key: "publishTrack",
|
|
64
52
|
value: function publishTrack(track) {
|
|
65
53
|
this.checkMediaConnection();
|
|
54
|
+
|
|
66
55
|
/* todo: for now we don't support screen share (waiting for server to support bundling, see SPARK-377812)
|
|
67
56
|
for sharing:
|
|
68
57
|
we have to call meeting.stopFloorRequest() before unpublishing a track
|
|
69
58
|
we have to call meeting.share() after publishing a track
|
|
70
59
|
*/
|
|
60
|
+
|
|
71
61
|
// todo: depending on how muting is done with Local tracks, this code here might need to change...
|
|
72
62
|
|
|
73
63
|
if (track.kind === 'audio') {
|
|
64
|
+
// @ts-ignore
|
|
74
65
|
this.meeting.setLocalAudioTrack(track);
|
|
75
|
-
this.meeting.mediaProperties.mediaDirection.sendAudio = true;
|
|
66
|
+
this.meeting.mediaProperties.mediaDirection.sendAudio = true;
|
|
76
67
|
|
|
68
|
+
// audio state could be undefined if you have not sent audio before
|
|
77
69
|
this.meeting.audio = this.meeting.audio || (0, _muteState.default)(_constants.AUDIO, this.meeting, this.meeting.mediaProperties.mediaDirection);
|
|
78
70
|
} else if (track.kind === 'video') {
|
|
71
|
+
// @ts-ignore
|
|
79
72
|
this.meeting.setLocalVideoTrack(track);
|
|
80
|
-
this.meeting.mediaProperties.mediaDirection.sendVideo = true;
|
|
73
|
+
this.meeting.mediaProperties.mediaDirection.sendVideo = true;
|
|
81
74
|
|
|
75
|
+
// video state could be undefined if you have not sent video before
|
|
82
76
|
this.meeting.video = this.meeting.video || (0, _muteState.default)(_constants.VIDEO, this.meeting, this.meeting.mediaProperties.mediaDirection);
|
|
83
77
|
}
|
|
84
|
-
|
|
85
78
|
return this.meeting.mediaProperties.webrtcMediaConnection.publishTrack(track);
|
|
86
79
|
}
|
|
80
|
+
|
|
87
81
|
/**
|
|
88
82
|
* Unpublishes a local track in the meeting
|
|
89
83
|
*
|
|
90
84
|
* @param {MediaStreamTrack} track
|
|
91
85
|
* @returns {Promise}
|
|
92
86
|
*/
|
|
93
|
-
|
|
94
87
|
}, {
|
|
95
88
|
key: "unpublishTrack",
|
|
96
89
|
value: function unpublishTrack(track) {
|
|
97
90
|
// todo: see todos in publishTrack() - they all apply here too:
|
|
98
91
|
// screen sharing - SPARK-377812
|
|
99
92
|
// muting etc
|
|
93
|
+
|
|
100
94
|
if (track.kind === 'audio') {
|
|
95
|
+
// @ts-ignore
|
|
101
96
|
this.meeting.setLocalVideoTrack(null);
|
|
102
97
|
this.meeting.mediaProperties.mediaDirection.sendAudio = false;
|
|
103
98
|
} else if (track.kind === 'video') {
|
|
99
|
+
// @ts-ignore
|
|
104
100
|
this.meeting.setLocalAudioTrack(null);
|
|
105
101
|
this.meeting.mediaProperties.mediaDirection.sendVideo = false;
|
|
106
102
|
}
|
|
107
|
-
|
|
108
103
|
this.checkMediaConnection();
|
|
109
104
|
return this.meeting.mediaProperties.webrtcMediaConnection.unpublishTrack(track);
|
|
110
105
|
}
|
|
111
106
|
}]);
|
|
112
107
|
return MultistreamMedia;
|
|
113
108
|
}();
|
|
114
|
-
|
|
115
109
|
exports.MultistreamMedia = MultistreamMedia;
|
|
116
110
|
//# sourceMappingURL=multistreamMedia.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MultistreamMedia","meeting","mediaProperties","webrtcMediaConnection","Error","track","checkMediaConnection","kind","setLocalAudioTrack","mediaDirection","sendAudio","audio","createMuteState","AUDIO","setLocalVideoTrack","sendVideo","video","VIDEO","publishTrack","unpublishTrack"],"sources":["multistreamMedia.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\n\nimport {AUDIO, VIDEO} from '../constants';\nimport createMuteState from '../meeting/muteState';\nimport Meeting from '../meeting';\n\n/**\n * Class wrapping all the multistream specific APIs that need to be exposed at meeting level.\n *\n */\nexport class MultistreamMedia {\n private meeting: Meeting;\n\n /**\n * Constructor\n * @param {Meeting} meeting\n */\n constructor(meeting: Meeting) {\n this.meeting = meeting;\n }\n\n /**\n * throws if we don't have a media connection created\n */\n private checkMediaConnection() {\n if (this.meeting?.mediaProperties?.webrtcMediaConnection) {\n return;\n }\n throw new Error('Webrtc media connection is missing');\n }\n\n /**\n * Publishes a local track in the meeting\n *\n * @param {MediaStreamTrack} track\n * @returns {Promise}\n */\n publishTrack(track: MediaStreamTrack): Promise<void> {\n this.checkMediaConnection();\n\n /* todo: for now we don't support screen share (waiting for server to support bundling, see SPARK-377812)\n for sharing:\n we have to call meeting.stopFloorRequest() before unpublishing a track\n we have to call meeting.share() after publishing a track\n */\n\n // todo: depending on how muting is done with Local tracks, this code here might need to change...\n\n if (track.kind === 'audio') {\n this.meeting.setLocalAudioTrack(track);\n this.meeting.mediaProperties.mediaDirection.sendAudio = true;\n\n // audio state could be undefined if you have not sent audio before\n this.meeting.audio =\n this.meeting.audio ||\n createMuteState(AUDIO, this.meeting, this.meeting.mediaProperties.mediaDirection);\n } else if (track.kind === 'video') {\n this.meeting.setLocalVideoTrack(track);\n this.meeting.mediaProperties.mediaDirection.sendVideo = true;\n\n // video state could be undefined if you have not sent video before\n this.meeting.video =\n this.meeting.video ||\n createMuteState(VIDEO, this.meeting, this.meeting.mediaProperties.mediaDirection);\n }\n\n return this.meeting.mediaProperties.webrtcMediaConnection.publishTrack(track);\n }\n\n /**\n * Unpublishes a local track in the meeting\n *\n * @param {MediaStreamTrack} track\n * @returns {Promise}\n */\n unpublishTrack(track: MediaStreamTrack): Promise<void> {\n // todo: see todos in publishTrack() - they all apply here too:\n // screen sharing - SPARK-377812\n // muting etc\n\n if (track.kind === 'audio') {\n this.meeting.setLocalVideoTrack(null);\n this.meeting.mediaProperties.mediaDirection.sendAudio = false;\n } else if (track.kind === 'video') {\n this.meeting.setLocalAudioTrack(null);\n this.meeting.mediaProperties.mediaDirection.sendVideo = false;\n }\n this.checkMediaConnection();\n\n return this.meeting.mediaProperties.webrtcMediaConnection.unpublishTrack(track);\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"names":["MultistreamMedia","meeting","mediaProperties","webrtcMediaConnection","Error","track","checkMediaConnection","kind","setLocalAudioTrack","mediaDirection","sendAudio","audio","createMuteState","AUDIO","setLocalVideoTrack","sendVideo","video","VIDEO","publishTrack","unpublishTrack"],"sources":["multistreamMedia.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\n\nimport {AUDIO, VIDEO} from '../constants';\nimport createMuteState from '../meeting/muteState';\nimport Meeting from '../meeting';\n\n/**\n * Class wrapping all the multistream specific APIs that need to be exposed at meeting level.\n *\n */\nexport class MultistreamMedia {\n private meeting: Meeting;\n\n /**\n * Constructor\n * @param {Meeting} meeting\n */\n constructor(meeting: Meeting) {\n this.meeting = meeting;\n }\n\n // eslint-disable-next-line valid-jsdoc\n /**\n * throws if we don't have a media connection created\n */\n private checkMediaConnection() {\n if (this.meeting?.mediaProperties?.webrtcMediaConnection) {\n return;\n }\n throw new Error('Webrtc media connection is missing');\n }\n\n /**\n * Publishes a local track in the meeting\n *\n * @param {MediaStreamTrack} track\n * @returns {Promise}\n */\n publishTrack(track: MediaStreamTrack): Promise<void> {\n this.checkMediaConnection();\n\n /* todo: for now we don't support screen share (waiting for server to support bundling, see SPARK-377812)\n for sharing:\n we have to call meeting.stopFloorRequest() before unpublishing a track\n we have to call meeting.share() after publishing a track\n */\n\n // todo: depending on how muting is done with Local tracks, this code here might need to change...\n\n if (track.kind === 'audio') {\n // @ts-ignore\n this.meeting.setLocalAudioTrack(track);\n this.meeting.mediaProperties.mediaDirection.sendAudio = true;\n\n // audio state could be undefined if you have not sent audio before\n this.meeting.audio =\n this.meeting.audio ||\n createMuteState(AUDIO, this.meeting, this.meeting.mediaProperties.mediaDirection);\n } else if (track.kind === 'video') {\n // @ts-ignore\n this.meeting.setLocalVideoTrack(track);\n this.meeting.mediaProperties.mediaDirection.sendVideo = true;\n\n // video state could be undefined if you have not sent video before\n this.meeting.video =\n this.meeting.video ||\n createMuteState(VIDEO, this.meeting, this.meeting.mediaProperties.mediaDirection);\n }\n\n return this.meeting.mediaProperties.webrtcMediaConnection.publishTrack(track);\n }\n\n /**\n * Unpublishes a local track in the meeting\n *\n * @param {MediaStreamTrack} track\n * @returns {Promise}\n */\n unpublishTrack(track: MediaStreamTrack): Promise<void> {\n // todo: see todos in publishTrack() - they all apply here too:\n // screen sharing - SPARK-377812\n // muting etc\n\n if (track.kind === 'audio') {\n // @ts-ignore\n this.meeting.setLocalVideoTrack(null);\n this.meeting.mediaProperties.mediaDirection.sendAudio = false;\n } else if (track.kind === 'video') {\n // @ts-ignore\n this.meeting.setLocalAudioTrack(null);\n this.meeting.mediaProperties.mediaDirection.sendVideo = false;\n }\n this.checkMediaConnection();\n\n return this.meeting.mediaProperties.webrtcMediaConnection.unpublishTrack(track);\n }\n}\n"],"mappings":";;;;;;;;;;;AAEA;AACA;AAHA;AAMA;AACA;AACA;AACA;AAHA,IAIaA,gBAAgB;EAG3B;AACF;AACA;AACA;EACE,0BAAYC,OAAgB,EAAE;IAAA;IAAA;IAC5B,IAAI,CAACA,OAAO,GAAGA,OAAO;EACxB;;EAEA;EACA;AACF;AACA;EAFE;IAAA;IAAA,OAGA,gCAA+B;MAAA;MAC7B,qBAAI,IAAI,CAACA,OAAO,mEAAZ,cAAcC,eAAe,kDAA7B,sBAA+BC,qBAAqB,EAAE;QACxD;MACF;MACA,MAAM,IAAIC,KAAK,CAAC,oCAAoC,CAAC;IACvD;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,sBAAaC,KAAuB,EAAiB;MACnD,IAAI,CAACC,oBAAoB,EAAE;;MAE3B;AACJ;AACA;AACA;AACA;;MAEI;;MAEA,IAAID,KAAK,CAACE,IAAI,KAAK,OAAO,EAAE;QAC1B;QACA,IAAI,CAACN,OAAO,CAACO,kBAAkB,CAACH,KAAK,CAAC;QACtC,IAAI,CAACJ,OAAO,CAACC,eAAe,CAACO,cAAc,CAACC,SAAS,GAAG,IAAI;;QAE5D;QACA,IAAI,CAACT,OAAO,CAACU,KAAK,GAChB,IAAI,CAACV,OAAO,CAACU,KAAK,IAClB,IAAAC,kBAAe,EAACC,gBAAK,EAAE,IAAI,CAACZ,OAAO,EAAE,IAAI,CAACA,OAAO,CAACC,eAAe,CAACO,cAAc,CAAC;MACrF,CAAC,MAAM,IAAIJ,KAAK,CAACE,IAAI,KAAK,OAAO,EAAE;QACjC;QACA,IAAI,CAACN,OAAO,CAACa,kBAAkB,CAACT,KAAK,CAAC;QACtC,IAAI,CAACJ,OAAO,CAACC,eAAe,CAACO,cAAc,CAACM,SAAS,GAAG,IAAI;;QAE5D;QACA,IAAI,CAACd,OAAO,CAACe,KAAK,GAChB,IAAI,CAACf,OAAO,CAACe,KAAK,IAClB,IAAAJ,kBAAe,EAACK,gBAAK,EAAE,IAAI,CAAChB,OAAO,EAAE,IAAI,CAACA,OAAO,CAACC,eAAe,CAACO,cAAc,CAAC;MACrF;MAEA,OAAO,IAAI,CAACR,OAAO,CAACC,eAAe,CAACC,qBAAqB,CAACe,YAAY,CAACb,KAAK,CAAC;IAC/E;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,wBAAeA,KAAuB,EAAiB;MACrD;MACA;MACA;;MAEA,IAAIA,KAAK,CAACE,IAAI,KAAK,OAAO,EAAE;QAC1B;QACA,IAAI,CAACN,OAAO,CAACa,kBAAkB,CAAC,IAAI,CAAC;QACrC,IAAI,CAACb,OAAO,CAACC,eAAe,CAACO,cAAc,CAACC,SAAS,GAAG,KAAK;MAC/D,CAAC,MAAM,IAAIL,KAAK,CAACE,IAAI,KAAK,OAAO,EAAE;QACjC;QACA,IAAI,CAACN,OAAO,CAACO,kBAAkB,CAAC,IAAI,CAAC;QACrC,IAAI,CAACP,OAAO,CAACC,eAAe,CAACO,cAAc,CAACM,SAAS,GAAG,KAAK;MAC/D;MACA,IAAI,CAACT,oBAAoB,EAAE;MAE3B,OAAO,IAAI,CAACL,OAAO,CAACC,eAAe,CAACC,qBAAqB,CAACgB,cAAc,CAACd,KAAK,CAAC;IACjF;EAAC;EAAA;AAAA;AAAA"}
|