@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.11
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/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +7 -0
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +8 -0
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +8 -0
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +7 -0
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +7 -0
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +7 -0
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +7 -0
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +7 -0
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +5 -29
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +5 -2
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +3 -0
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.js +15 -74
- package/dist/constants.js.map +1 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +43 -5
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +4 -0
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +12 -3
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +71 -210
- package/dist/media/index.js.map +1 -1
- package/dist/media/internal-media-core-wrapper.js +22 -0
- package/dist/media/internal-media-core-wrapper.js.map +1 -0
- package/dist/media/properties.js +32 -25
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +0 -27
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.js +8 -1
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/index.js +1146 -602
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +6 -0
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +83 -24
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +5 -44
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +4 -1
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +5 -0
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +14 -2
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +3 -0
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +4 -1
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +136 -25
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +4 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +24 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +30 -7
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +2 -1
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +1 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +82 -1
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +19 -9
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +8 -0
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +133 -0
- package/dist/multistream/mediaRequestManager.js.map +1 -0
- package/dist/multistream/multistreamMedia.js +116 -0
- package/dist/multistream/multistreamMedia.js.map +1 -0
- package/dist/multistream/receiveSlot.js +209 -0
- package/dist/multistream/receiveSlot.js.map +1 -0
- package/dist/multistream/receiveSlotManager.js +195 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -0
- package/dist/multistream/remoteMedia.js +289 -0
- package/dist/multistream/remoteMedia.js.map +1 -0
- package/dist/multistream/remoteMediaGroup.js +243 -0
- package/dist/multistream/remoteMediaGroup.js.map +1 -0
- package/dist/multistream/remoteMediaManager.js +1113 -0
- package/dist/multistream/remoteMediaManager.js.map +1 -0
- package/dist/networkQualityMonitor/index.js +10 -2
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +11 -0
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -1
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +17 -7
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +1 -0
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/reactions.js +111 -0
- package/dist/reactions/reactions.js.map +1 -0
- package/dist/reactions/reactions.type.js +40 -0
- package/dist/reactions/reactions.type.js.map +1 -0
- package/dist/reconnection-manager/index.js +130 -132
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.js +58 -231
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +7 -116
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +20 -6
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +2 -0
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +58 -37
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +9 -3
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +10 -3
- package/dist/transcription/index.js.map +1 -1
- package/package.json +21 -20
- package/src/common/{browser-detection.js → browser-detection.ts} +1 -1
- package/src/common/collection.ts +6 -6
- package/src/common/{config.js → config.ts} +1 -1
- package/src/common/errors/{captcha-error.js → captcha-error.ts} +5 -1
- package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +6 -1
- package/src/common/errors/{join-meeting.js → join-meeting.ts} +6 -1
- package/src/common/errors/{media.js → media.ts} +5 -1
- package/src/common/errors/parameter.ts +3 -2
- package/src/common/errors/{password-error.js → password-error.ts} +5 -1
- package/src/common/errors/{permission.js → permission.ts} +5 -1
- package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
- package/src/common/errors/{reconnection.js → reconnection.ts} +5 -1
- package/src/common/errors/{stats.js → stats.ts} +5 -1
- package/src/common/errors/{webex-errors.js → webex-errors.ts} +1 -20
- package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +3 -1
- package/src/common/events/{events-scope.js → events-scope.ts} +1 -1
- package/src/common/events/{events.js → events.ts} +0 -0
- package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +1 -2
- package/src/common/events/{util.js → util.ts} +1 -1
- package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
- package/src/common/logs/{logger-proxy.js → logger-proxy.ts} +1 -1
- package/src/common/logs/{request.js → request.ts} +12 -2
- package/src/common/queue.ts +1 -2
- package/src/{config.js → config.ts} +2 -0
- package/src/constants.ts +139 -179
- package/src/locus-info/{controlsUtils.js → controlsUtils.ts} +4 -4
- package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
- package/src/locus-info/{fullState.js → fullState.ts} +1 -1
- package/src/locus-info/{hostUtils.js → hostUtils.ts} +5 -5
- package/src/locus-info/{index.js → index.ts} +67 -32
- package/src/locus-info/{infoUtils.js → infoUtils.ts} +7 -4
- package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +13 -13
- package/src/locus-info/{parser.js → parser.ts} +22 -12
- package/src/locus-info/{selfUtils.js → selfUtils.ts} +17 -19
- package/src/media/{index.js → index.ts} +130 -205
- package/src/media/internal-media-core-wrapper.ts +9 -0
- package/src/media/{properties.js → properties.ts} +35 -29
- package/src/media/util.ts +16 -0
- package/src/mediaQualityMetrics/{config.js → config.ts} +1 -1
- package/src/meeting/{effectsState.js → effectsState.ts} +12 -6
- package/src/meeting/{index.js → index.ts} +993 -474
- package/src/meeting/{muteState.js → muteState.ts} +16 -11
- package/src/meeting/{request.js → request.ts} +148 -36
- package/src/meeting/{state.js → state.ts} +6 -6
- package/src/meeting/{util.js → util.ts} +9 -51
- package/src/meeting-info/{collection.js → collection.ts} +4 -1
- package/src/meeting-info/{index.js → index.ts} +10 -6
- package/src/meeting-info/{meeting-info-v2.js → meeting-info-v2.ts} +28 -10
- package/src/meeting-info/{request.js → request.ts} +6 -2
- package/src/meeting-info/{util.js → util.ts} +6 -5
- package/src/meeting-info/{utilv2.js → utilv2.ts} +8 -7
- package/src/meetings/{collection.js → collection.ts} +5 -2
- package/src/meetings/{index.js → index.ts} +118 -22
- package/src/meetings/{request.js → request.ts} +6 -1
- package/src/meetings/{util.js → util.ts} +28 -5
- package/src/member/{index.js → index.ts} +46 -15
- package/src/member/{util.js → util.ts} +17 -16
- package/src/members/{collection.js → collection.ts} +2 -1
- package/src/members/{index.js → index.ts} +94 -26
- package/src/members/{request.js → request.ts} +16 -5
- package/src/members/{util.js → util.ts} +7 -7
- package/src/metrics/{config.js → config.ts} +0 -2
- package/src/metrics/{constants.js → constants.ts} +0 -0
- package/src/metrics/{index.js → index.ts} +27 -8
- package/src/multistream/mediaRequestManager.ts +166 -0
- package/src/multistream/multistreamMedia.ts +92 -0
- package/src/multistream/receiveSlot.ts +141 -0
- package/src/multistream/receiveSlotManager.ts +142 -0
- package/src/multistream/remoteMedia.ts +228 -0
- package/src/multistream/remoteMediaGroup.ts +224 -0
- package/src/multistream/remoteMediaManager.ts +911 -0
- package/src/networkQualityMonitor/{index.js → index.ts} +18 -3
- package/src/personal-meeting-room/{index.js → index.ts} +17 -4
- package/src/personal-meeting-room/{request.js → request.ts} +3 -1
- package/src/personal-meeting-room/{util.js → util.ts} +1 -1
- package/src/reachability/{index.js → index.ts} +28 -17
- package/src/reachability/request.ts +4 -2
- package/src/reactions/reactions.ts +104 -0
- package/src/reactions/reactions.type.ts +36 -0
- package/src/reconnection-manager/{index.js → index.ts} +81 -65
- package/src/roap/index.ts +229 -0
- package/src/roap/{request.js → request.ts} +15 -74
- package/src/roap/turnDiscovery.ts +26 -11
- package/src/statsAnalyzer/{global.js → global.ts} +2 -0
- package/src/statsAnalyzer/{index.js → index.ts} +66 -61
- package/src/statsAnalyzer/{mqaUtil.js → mqaUtil.ts} +6 -1
- package/src/transcription/{index.js → index.ts} +16 -11
- package/test/integration/spec/journey.js +1 -1
- package/test/integration/spec/space-meeting.js +1 -2
- package/test/unit/spec/locus-info/infoUtils.js +17 -1
- package/test/unit/spec/media/index.ts +207 -0
- package/test/unit/spec/media/properties.ts +73 -82
- package/test/unit/spec/meeting/effectsState.js +1 -3
- package/test/unit/spec/meeting/index.js +672 -245
- package/test/unit/spec/meeting/muteState.js +7 -0
- package/test/unit/spec/meeting/request.js +25 -1
- package/test/unit/spec/meeting/utils.js +63 -2
- package/test/unit/spec/meetings/index.js +0 -4
- package/test/unit/spec/members/index.js +164 -2
- package/test/unit/spec/multistream/mediaRequestManager.ts +515 -0
- package/test/unit/spec/multistream/receiveSlot.ts +104 -0
- package/test/unit/spec/multistream/receiveSlotManager.ts +173 -0
- package/test/unit/spec/multistream/remoteMedia.ts +225 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +1309 -0
- package/test/unit/spec/reconnection-manager/index.js +68 -2
- package/test/unit/spec/roap/index.ts +63 -35
- package/test/unit/spec/stats-analyzer/index.js +19 -22
- package/dist/peer-connection-manager/index.js +0 -794
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/peer-connection-manager/util.js +0 -124
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/dist/roap/collection.js +0 -73
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.js +0 -337
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/state.js +0 -164
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/util.js +0 -102
- package/dist/roap/util.js.map +0 -1
- package/src/media/util.js +0 -38
- package/src/peer-connection-manager/index.js +0 -723
- package/src/peer-connection-manager/util.ts +0 -117
- package/src/roap/collection.js +0 -63
- package/src/roap/handler.js +0 -252
- package/src/roap/index.js +0 -380
- package/src/roap/state.js +0 -149
- package/src/roap/util.js +0 -93
- package/test/unit/spec/peerconnection-manager/index.js +0 -188
- package/test/unit/spec/peerconnection-manager/utils.js +0 -48
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
- package/test/unit/spec/roap/util.js +0 -30
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AllEqualLayout","screenShareVideo","size","activeSpeakerVideoPaneGroups","id","numPanes","priority","SingleLayout","OnePlusFiveLayout","TwoMainPlusSixSmallLayout","RemoteScreenShareWithSmallThumbnailsLayout","Stage2x2With6ThumbnailsLayout","memberVideoPanes","csi","undefined","DefaultConfiguration","audio","numOfActiveSpeakerStreams","video","preferLiveVideo","initialLayoutId","layouts","AllEqual","OnePlusFive","Single","Stage","ScreenShareView","screenShare","Event","RemoteMediaManager","receiveSlotManager","mediaRequestManagers","config","started","media","activeSpeakerGroups","memberPanes","checkConfigValidity","slots","screenShareAudio","unused","activeSpeaker","receiverSelected","receiveSlotAllocations","LoggerProxy","logger","log","Error","forEach","layout","groupIds","paneIds","groupPriorites","group","pane","createAudioMedia","preallocateVideoReceiveSlots","setLayout","invalidateCurrentRemoteMedia","commit","slot","releaseSlot","length","push","releaseUnusedVideoSlots","currentLayout","currentLayoutId","activeSpeakerCount","reduce","sum","paneGroup","receiverSelectedCount","maxNumVideoPanesRequired","maxValue","Math","max","getRequiredNumVideoSlotsForLayout","allocateSlot","MC","MediaType","VideoMain","layoutId","updateVideoReceiveSlots","updateVideoRemoteMediaObjects","emitVideoLayoutChangedEvent","i","AudioMain","RemoteMediaGroup","emit","file","function","AudioCreated","requiredCsis","memberVideoPane","isCsiNeededByCurrentLayout","notNeededReceiverSelectedSlots","paneIndex","freeSlot","pop","memberPane","existingSlot","find","isExistingSlotAlreadyAllocated","includes","requiredNumSlots","totalNumSlots","numSlotsToCreate","trimReceiverSelectedSlots","allocateSlotsToVideoPaneGroups","groupId","paneGroupInCurrentLayout","groupInLayout","mediaGroup","resolution","warn","paneId","paneInCurrentLayout","paneInLayout","remoteMedia","RemoteMedia","sendMediaRequest","options","stop","remoteMediaGroup","VideoLayoutChanged","activeSpeakerVideoPanes","cancelMediaRequest","newPane","receiveSlot","reject","resolve","getUnderlyingReceiveSlot","index","indexOf","splice","pin","unpin","isPinned","EventsScope"],"sources":["remoteMediaManager.ts"],"sourcesContent":["import {cloneDeep, remove} from 'lodash';\nimport {EventMap} from 'typed-emitter';\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\n\nimport {RemoteMedia, RemoteVideoResolution} from './remoteMedia';\nimport {ReceiveSlot, CSI} from './receiveSlot';\nimport {ReceiveSlotManager} from './receiveSlotManager';\nimport {RemoteMediaGroup} from './remoteMediaGroup';\nimport {MediaRequestManager} from './mediaRequestManager';\n\nexport type PaneSize = RemoteVideoResolution;\nexport type LayoutId = string;\nexport type PaneId = string;\nexport type PaneGroupId = string;\n\nexport interface ActiveSpeakerVideoPaneGroup {\n id: PaneGroupId;\n numPanes: number; // maximum number of panes in the group (actual number may be lower, if there are not enough participants in the meeting)\n size: PaneSize; // preferred size for all panes in the group\n priority: number; // 0-255 (255 = highest priority), each group must have a different priority from all other groups\n}\n\nexport interface MemberVideoPane {\n id: PaneId;\n size: PaneSize;\n csi?: CSI;\n}\n\nexport interface VideoLayout {\n screenShareVideo: {\n size: PaneSize | null; // null if you don't want to receive any screen share video\n };\n activeSpeakerVideoPaneGroups?: ActiveSpeakerVideoPaneGroup[]; // list of active speaker video pane groups\n memberVideoPanes?: MemberVideoPane[]; // list of video panes for specific members, CSI values can be changed later via setVideoPaneCsi()\n}\n\nexport interface Configuration {\n audio: {\n numOfActiveSpeakerStreams: number; // number of audio streams we want to receive\n };\n video: {\n preferLiveVideo: boolean; // applies to all pane groups with active speaker policy\n initialLayoutId: LayoutId;\n\n layouts: {[key: LayoutId]: VideoLayout}; // a map of all available layouts, a layout can be set via setLayout() method\n };\n screenShare: {\n audio: boolean; // whether we ever want to receive screen share audio at all\n video: boolean; // whether we ever want to receive screen share video at all\n };\n}\n\n/* Predefined layouts: */\n\n// An \"all equal\" grid, with size up to 3 x 3 = 9:\nconst AllEqualLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'main',\n numPanes: 9,\n size: 'best',\n priority: 255,\n },\n ],\n};\n\n// A layout with just a single remote active speaker video pane:\nconst SingleLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'main',\n numPanes: 1,\n size: 'best',\n priority: 255,\n },\n ],\n};\n\n// A layout with 1 big pane for the highest priority active speaker and 5 small panes for other active speakers:\nconst OnePlusFiveLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'mainBigOne',\n numPanes: 1,\n size: 'large',\n priority: 255,\n },\n {\n id: 'secondarySetOfSmallPanes',\n numPanes: 5,\n size: 'very small',\n priority: 254,\n },\n ],\n};\n\n// A layout with 2 big panes for 2 main active speakers and a strip of 6 small panes for other active speakers:\nconst TwoMainPlusSixSmallLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'mainGroupWith2BigPanes',\n numPanes: 2,\n size: 'large',\n priority: 255,\n },\n {\n id: 'secondaryGroupOfSmallPanes',\n numPanes: 6,\n size: 'small',\n priority: 254,\n },\n ],\n};\n\n// A strip of 8 small video panes (thumbnails) displayed at the top of a remote screenshare:\nconst RemoteScreenShareWithSmallThumbnailsLayout: VideoLayout = {\n screenShareVideo: {size: 'best'},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'thumbnails',\n numPanes: 8,\n size: 'thumbnail',\n priority: 255,\n },\n ],\n};\n\n// A staged layout with 4 pre-selected meeting participants in the main 2x2 grid and 6 small panes for other active speakers at the top:\nconst Stage2x2With6ThumbnailsLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'thumbnails',\n numPanes: 6,\n size: 'thumbnail',\n priority: 255,\n },\n ],\n memberVideoPanes: [\n {id: 'stage-1', size: 'medium', csi: undefined},\n {id: 'stage-2', size: 'medium', csi: undefined},\n {id: 'stage-3', size: 'medium', csi: undefined},\n {id: 'stage-4', size: 'medium', csi: undefined},\n ],\n};\n\n/**\n * Default configuration:\n * - uses 3 audio streams\n * - prefers active speakers with live video (e.g. are not audio only or video muted) over active speakers without live video\n * - has a few layouts defined, including 1 that contains remote screen share (ScreenShareView)\n */\nexport const DefaultConfiguration: Configuration = {\n audio: {\n numOfActiveSpeakerStreams: 3,\n },\n video: {\n preferLiveVideo: true,\n initialLayoutId: 'AllEqual',\n\n layouts: {\n AllEqual: AllEqualLayout,\n OnePlusFive: OnePlusFiveLayout,\n Single: SingleLayout,\n Stage: Stage2x2With6ThumbnailsLayout,\n ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout,\n },\n },\n screenShare: {\n audio: true,\n video: true,\n },\n};\n\nexport enum Event {\n // events for audio streams\n AudioCreated = 'AudioCreated',\n ScreenShareAudioCreated = 'ScreenShareCreated',\n\n // events for video streams\n VideoLayoutChanged = 'VideoLayoutChanged',\n}\n\nexport interface VideoLayoutChangedEventData {\n layoutId: LayoutId;\n activeSpeakerVideoPanes: {\n [key: PaneGroupId]: RemoteMediaGroup;\n };\n memberVideoPanes: {[key: PaneId]: RemoteMedia};\n screenShareVideo?: RemoteMedia;\n}\nexport interface Events extends EventMap {\n // audio\n [Event.AudioCreated]: (audio: RemoteMediaGroup) => void;\n [Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMedia) => void;\n\n // video\n [Event.VideoLayoutChanged]: (data: VideoLayoutChangedEventData) => void;\n}\n\n/**\n * A helper class that manages all remote audio/video streams in order to achieve a predefined set of layouts.\n * It also creates a fixed number of audio streams and these don't change during the meeting.\n *\n * Things that RemoteMediaManager does:\n * - owns the receive slots (creates them when needed, and re-uses them when switching layouts)\n * - constructs appropriate RemoteMedia and RemoteMediaGroup objects and sends appropriate mediaRequests\n */\nexport class RemoteMediaManager extends EventsScope {\n private config: Configuration;\n\n private started: boolean;\n\n private receiveSlotManager: ReceiveSlotManager;\n\n private mediaRequestManagers: {\n audio: MediaRequestManager;\n video: MediaRequestManager;\n };\n\n private currentLayout?: VideoLayout;\n\n private slots: {\n audio: ReceiveSlot[];\n screenShareAudio?: ReceiveSlot;\n screenShareVideo?: ReceiveSlot;\n video: {\n unused: ReceiveSlot[];\n activeSpeaker: ReceiveSlot[];\n receiverSelected: ReceiveSlot[];\n };\n };\n\n private media: {\n audio?: RemoteMediaGroup;\n video: {\n activeSpeakerGroups: {\n [key: PaneGroupId]: RemoteMediaGroup;\n };\n memberPanes: {[key: PaneId]: RemoteMedia};\n };\n };\n\n private receiveSlotAllocations: {\n activeSpeaker: {[key: PaneGroupId]: {slots: ReceiveSlot[]}};\n receiverSelected: {[key: PaneId]: ReceiveSlot};\n };\n\n private currentLayoutId?: LayoutId;\n\n /**\n * Constructor\n *\n * @param {ReceiveSlotManager} receiveSlotManager\n * @param {{audio: MediaRequestManager, video: mediaRequestManagers}} mediaRequestManagers\n * @param {Configuration} config Configuration describing what video layouts to use during the meeting\n */\n constructor(\n receiveSlotManager: ReceiveSlotManager,\n mediaRequestManagers: {\n audio: MediaRequestManager;\n video: MediaRequestManager;\n },\n config: Configuration = DefaultConfiguration\n ) {\n super();\n this.started = false;\n this.config = config;\n this.receiveSlotManager = receiveSlotManager;\n this.mediaRequestManagers = mediaRequestManagers;\n this.media = {\n audio: undefined,\n video: {\n activeSpeakerGroups: {},\n memberPanes: {},\n },\n };\n\n this.checkConfigValidity();\n\n this.slots = {\n audio: [],\n screenShareAudio: undefined,\n screenShareVideo: undefined,\n video: {\n unused: [],\n activeSpeaker: [],\n receiverSelected: [],\n },\n };\n\n this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};\n\n LoggerProxy.logger.log(\n `RemoteMediaManager#constructor --> RemoteMediaManager created with config: ${JSON.stringify(\n this.config\n )}`\n );\n }\n\n /**\n * Checks if configuration is valid, throws an error if it's not\n */\n private checkConfigValidity() {\n if (!(this.config.video.initialLayoutId in this.config.video.layouts)) {\n throw new Error(\n `invalid config: initialLayoutId \"${this.config.video.initialLayoutId}\" doesn't match any of the layouts`\n );\n }\n\n // check if each layout is valid\n Object.values(this.config.video.layouts).forEach((layout) => {\n const groupIds = {};\n const paneIds = {};\n const groupPriorites = {};\n\n layout.activeSpeakerVideoPaneGroups?.forEach((group) => {\n if (groupIds[group.id]) {\n throw new Error(\n `invalid config: duplicate active speaker video pane group id: ${group.id}`\n );\n }\n groupIds[group.id] = true;\n\n if (groupPriorites[group.priority]) {\n throw new Error(\n `invalid config: multiple active speaker video pane groups have same priority: ${group.priority}`\n );\n }\n groupPriorites[group.priority] = true;\n });\n\n layout.memberVideoPanes?.forEach((pane) => {\n if (paneIds[pane.id]) {\n throw new Error(`invalid config: duplicate member video pane id: ${pane.id}`);\n }\n paneIds[pane.id] = true;\n });\n });\n }\n\n /**\n * Starts the RemoteMediaManager.\n *\n * @returns {Promise}\n */\n public async start() {\n if (this.started) {\n throw new Error('start() failure: already started');\n }\n this.started = true;\n\n await this.createAudioMedia();\n\n // todo: create screen share audio remote media (SPARK-377812)\n // todo: create screen share video receive slot (SPARK-377812)\n\n await this.preallocateVideoReceiveSlots();\n\n await this.setLayout(this.config.video.initialLayoutId);\n }\n\n /**\n * Releases all the used resources (like allocated receive slots). This function needs\n * to be called when we leave the meeting, etc.\n */\n public stop() {\n // invalidate all remoteMedia objects\n this.invalidateCurrentRemoteMedia({audio: true, video: true, commit: true});\n\n // release all audio receive slots\n this.slots.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));\n this.slots.audio.length = 0;\n\n // todo: screenshare slots... (SPARK-377812)\n\n this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};\n\n this.slots.video.unused.push(...this.slots.video.activeSpeaker);\n this.slots.video.activeSpeaker.length = 0;\n\n this.slots.video.unused.push(...this.slots.video.receiverSelected);\n this.slots.video.receiverSelected.length = 0;\n\n this.releaseUnusedVideoSlots();\n\n this.currentLayout = undefined;\n this.currentLayoutId = undefined;\n this.started = false;\n }\n\n /**\n * Returns the total number of main video panes required for a given layout\n *\n * @param {VideoLayout} layout\n * @returns {number}\n */\n private getRequiredNumVideoSlotsForLayout(layout?: VideoLayout) {\n if (!layout) {\n return 0;\n }\n\n const activeSpeakerCount =\n layout.activeSpeakerVideoPaneGroups?.reduce(\n (sum, paneGroup) => sum + paneGroup.numPanes,\n 0\n ) || 0;\n\n const receiverSelectedCount = layout.memberVideoPanes?.length || 0;\n\n return activeSpeakerCount + receiverSelectedCount;\n }\n\n /**\n * Allocates the maximum number of panes that any of the configured layouts will require.\n * We do this at the beginning, because it's more efficient (much faster) then allocating receive slots\n * later, after the SDP exchange was done.\n */\n private async preallocateVideoReceiveSlots() {\n const maxNumVideoPanesRequired = Object.values(this.config.video.layouts).reduce(\n (maxValue, layout) => Math.max(maxValue, this.getRequiredNumVideoSlotsForLayout(layout)),\n 0\n );\n\n while (this.slots.video.unused.length < maxNumVideoPanesRequired) {\n // eslint-disable-next-line no-await-in-loop\n this.slots.video.unused.push(\n await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)\n );\n }\n }\n\n /**\n * Changes the layout (triggers Event.VideoLayoutChanged)\n *\n * @param {LayoutId} layoutId new layout id\n * @returns {Promise}\n */\n public async setLayout(layoutId: LayoutId) {\n if (!(layoutId in this.config.video.layouts)) {\n throw new Error(\n `invalid layoutId: \"${layoutId}\" doesn't match any of the configured layouts`\n );\n }\n if (!this.started) {\n throw new Error('setLayout() called before start()');\n }\n this.currentLayoutId = layoutId;\n this.currentLayout = cloneDeep(this.config.video.layouts[this.currentLayoutId]);\n\n await this.updateVideoReceiveSlots();\n this.updateVideoRemoteMediaObjects();\n this.emitVideoLayoutChangedEvent();\n }\n\n /**\n * Returns the currently selected layout id\n *\n * @returns {LayoutId}\n */\n public getLayoutId(): LayoutId | undefined {\n return this.currentLayoutId;\n }\n\n /**\n * Creates the audio slots\n */\n private async createAudioMedia() {\n // create the audio receive slots\n for (let i = 0; i < this.config.audio.numOfActiveSpeakerStreams; i += 1) {\n // eslint-disable-next-line no-await-in-loop\n const slot = await this.receiveSlotManager.allocateSlot(MC.MediaType.AudioMain);\n\n this.slots.audio.push(slot);\n }\n\n // create a remote media group\n this.media.audio = new RemoteMediaGroup(\n this.mediaRequestManagers.audio,\n this.slots.audio,\n 255,\n true\n );\n\n this.emit(\n {file: 'multistream/remoteMediaManager', function: 'createAudioMedia'},\n Event.AudioCreated,\n this.media.audio\n );\n }\n\n /**\n * Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,\n * the rest are all moved to the \"unused\" list\n */\n private trimReceiverSelectedSlots() {\n const requiredCsis = {};\n\n // fill requiredCsis with all the CSIs that the given layout requires\n this.currentLayout?.memberVideoPanes?.forEach((memberVideoPane) => {\n if (memberVideoPane.csi !== undefined) {\n requiredCsis[memberVideoPane.csi] = true;\n }\n });\n\n const isCsiNeededByCurrentLayout = (csi?: CSI): boolean => {\n if (csi === undefined) {\n return false;\n }\n\n return !!requiredCsis[csi];\n };\n\n // keep receiverSelected slots that match our new requiredCsis, move the rest of receiverSelected slots to unused\n const notNeededReceiverSelectedSlots = remove(\n this.slots.video.receiverSelected,\n (slot) => isCsiNeededByCurrentLayout(slot.csi) === false\n );\n\n this.slots.video.unused.push(...notNeededReceiverSelectedSlots);\n }\n\n /**\n * Releases all the \"unused\" video slots.\n */\n private releaseUnusedVideoSlots() {\n this.slots.video.unused.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));\n this.slots.video.unused.length = 0;\n }\n\n /**\n * Allocates receive slots to all video panes in the current selected layout\n */\n private allocateSlotsToVideoPaneGroups() {\n this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};\n\n this.currentLayout?.activeSpeakerVideoPaneGroups?.forEach((group) => {\n this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};\n\n for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {\n // allocate a slot from the \"unused\" list\n const freeSlot = this.slots.video.unused.pop();\n\n if (freeSlot) {\n this.slots.video.activeSpeaker.push(freeSlot);\n this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);\n }\n }\n });\n\n this.currentLayout?.memberVideoPanes?.forEach((memberPane) => {\n // check if there is existing slot for this csi\n const existingSlot = this.slots.video.receiverSelected.find(\n (slot) => slot.csi === memberPane.csi\n );\n\n const isExistingSlotAlreadyAllocated = Object.values(\n this.receiveSlotAllocations.receiverSelected\n ).includes(existingSlot);\n\n if (memberPane.csi !== undefined && existingSlot && !isExistingSlotAlreadyAllocated) {\n // found it, so use it\n this.receiveSlotAllocations.receiverSelected[memberPane.id] = existingSlot;\n } else {\n // allocate a slot from the \"unused\" list\n const freeSlot = this.slots.video.unused.pop();\n\n if (freeSlot) {\n this.slots.video.receiverSelected.push(freeSlot);\n this.receiveSlotAllocations.receiverSelected[memberPane.id] = freeSlot;\n }\n }\n });\n }\n\n /**\n * Makes sure we have the right number of receive slots created for the current layout\n * and allocates them to the right video panes / pane groups\n *\n * @returns {Promise}\n */\n private async updateVideoReceiveSlots() {\n const requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);\n const totalNumSlots =\n this.slots.video.unused.length +\n this.slots.video.activeSpeaker.length +\n this.slots.video.receiverSelected.length;\n\n // ensure we have enough total slots for current layout\n if (totalNumSlots < requiredNumSlots) {\n let numSlotsToCreate = requiredNumSlots - totalNumSlots;\n\n while (numSlotsToCreate > 0) {\n // eslint-disable-next-line no-await-in-loop\n this.slots.video.unused.push(\n await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)\n );\n numSlotsToCreate -= 1;\n }\n }\n\n // move all no longer needed receiver-selected slots to \"unused\"\n this.trimReceiverSelectedSlots();\n\n // move all active speaker slots to \"unused\"\n this.slots.video.unused.push(...this.slots.video.activeSpeaker);\n this.slots.video.activeSpeaker.length = 0;\n\n // allocate the slots to the right panes / pane groups\n this.allocateSlotsToVideoPaneGroups();\n\n LoggerProxy.logger.log(\n `RemoteMediaManager#updateVideoReceiveSlots --> receive slots updated: unused=${this.slots.video.unused.length}, activeSpeaker=${this.slots.video.activeSpeaker.length}, receiverSelected=${this.slots.video.receiverSelected.length}`\n );\n\n // If this is the initial layout, there may be some \"unused\" slots left because of the preallocation\n // done in this.preallocateVideoReceiveSlots(), so release them now\n this.releaseUnusedVideoSlots();\n }\n\n /**\n * Creates new RemoteMedia and RemoteMediaGroup objects for the current layout\n * and sends the media requests for all of them.\n */\n private updateVideoRemoteMediaObjects() {\n // invalidate all the previous remote media objects and cancel their media requests\n this.invalidateCurrentRemoteMedia({audio: false, video: true, commit: false});\n\n // create new remoteMediaGroup objects\n this.media.video.activeSpeakerGroups = {};\n this.media.video.memberPanes = {};\n\n for (const [groupId, group] of Object.entries(this.receiveSlotAllocations.activeSpeaker)) {\n const paneGroupInCurrentLayout = this.currentLayout?.activeSpeakerVideoPaneGroups?.find(\n (groupInLayout) => groupInLayout.id === groupId\n );\n\n if (paneGroupInCurrentLayout) {\n const mediaGroup = new RemoteMediaGroup(\n this.mediaRequestManagers.video,\n group.slots,\n paneGroupInCurrentLayout.priority,\n false,\n {\n preferLiveVideo: this.config.video.preferLiveVideo,\n resolution: paneGroupInCurrentLayout.size,\n }\n );\n\n this.media.video.activeSpeakerGroups[groupId] = mediaGroup;\n } else {\n // this should never happen, because this.receiveSlotAllocations are created based on current layout configuration\n LoggerProxy.logger.warn(\n `a group id ${groupId} from this.receiveSlotAllocations.activeSpeaker cannot be found in the current layout configuration`\n );\n }\n }\n\n // create new remoteMedia objects\n for (const [paneId, slot] of Object.entries(this.receiveSlotAllocations.receiverSelected)) {\n const paneInCurrentLayout = this.currentLayout?.memberVideoPanes?.find(\n (paneInLayout) => paneInLayout.id === paneId\n );\n\n if (paneInCurrentLayout) {\n const remoteMedia = new RemoteMedia(slot, this.mediaRequestManagers.video, {\n resolution: paneInCurrentLayout.size,\n });\n\n if (paneInCurrentLayout.csi) {\n remoteMedia.sendMediaRequest(paneInCurrentLayout.csi, false);\n }\n\n this.media.video.memberPanes[paneId] = remoteMedia;\n } else {\n // this should never happen, because this.receiveSlotAllocations are created based on current layout configuration\n LoggerProxy.logger.warn(\n `a pane id ${paneId} from this.receiveSlotAllocations.receiverSelected cannot be found in the current layout configuration`\n );\n }\n }\n // todo: screenshare (SPARK-377812)\n\n this.mediaRequestManagers.video.commit();\n }\n\n /**\n * Invalidates all remote media objects belonging to currently selected layout\n */\n private invalidateCurrentRemoteMedia(options: {audio: boolean; video: boolean; commit: boolean}) {\n const {audio, video, commit} = options;\n\n if (audio && this.media.audio) {\n this.media.audio.stop(commit);\n }\n if (video) {\n Object.values(this.media.video.activeSpeakerGroups).forEach((remoteMediaGroup) => {\n remoteMediaGroup.stop(false);\n });\n Object.values(this.media.video.memberPanes).forEach((remoteMedia) => {\n remoteMedia.stop(false);\n });\n if (commit) {\n this.mediaRequestManagers.video.commit();\n }\n }\n }\n\n /** emits Event.VideoLayoutChanged */\n private emitVideoLayoutChangedEvent() {\n // todo: at this point the receive slots might still be showing a participant from previous layout, we should\n // wait for our media requests to be fullfilled, but there is no API for that right now (we could wait for source updates\n // but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)\n // for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing\n\n this.emit(\n {\n file: 'multistream/remoteMediaManager',\n function: 'emitVideoLayoutChangedEvent',\n },\n Event.VideoLayoutChanged,\n {\n layoutId: this.currentLayoutId,\n activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,\n memberVideoPanes: this.media.video.memberPanes,\n screenShareVideo: undefined, // todo: screen share (SPARK-377812)\n }\n );\n }\n\n /**\n * Sets a new CSI on a given remote media object\n *\n * @param {RemoteMedia} remoteMedia remote Media object to modify\n * @param {CSI} csi new CSI value, can be null if we want to stop receiving media\n */\n public setRemoteVideoCsi(remoteMedia: RemoteMedia, csi: CSI | null) {\n if (!Object.values(this.media.video.memberPanes).includes(remoteMedia)) {\n throw new Error('remoteMedia not found');\n }\n\n if (csi) {\n remoteMedia.sendMediaRequest(csi, true);\n } else {\n remoteMedia.cancelMediaRequest(true);\n }\n }\n\n /**\n * Adds a new member video pane to the currently selected layout.\n *\n * Changes to the layout are lost after a layout change.\n *\n * @param {MemberVideoPane} newPane\n * @returns {Promise<RemoteMedia>}\n */\n public async addMemberVideoPane(newPane: MemberVideoPane): Promise<RemoteMedia> {\n if (!this.currentLayout) {\n throw new Error('There is no current layout selected, call start() first');\n }\n\n if (!this.currentLayout?.memberVideoPanes) {\n this.currentLayout.memberVideoPanes = [];\n }\n\n if (newPane.id in this.currentLayout.memberVideoPanes) {\n throw new Error(\n `duplicate pane id ${newPane.id} - this pane already exists in current layout's memberVideoPanes`\n );\n }\n\n this.currentLayout.memberVideoPanes.push(newPane);\n\n const receiveSlot = await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain);\n\n this.slots.video.receiverSelected.push(receiveSlot);\n\n const remoteMedia = new RemoteMedia(receiveSlot, this.mediaRequestManagers.video, {\n resolution: newPane.size,\n });\n\n if (newPane.csi) {\n remoteMedia.sendMediaRequest(newPane.csi, true);\n }\n\n this.media.video.memberPanes[newPane.id] = remoteMedia;\n\n return remoteMedia;\n }\n\n /**\n * Removes a member video pane from the currently selected layout.\n *\n * Changes to the layout are lost after a layout change.\n *\n * @param {PaneId} paneId pane id of the pane to remove\n * @returns {Promise<void>}\n */\n public removeMemberVideoPane(paneId: PaneId): Promise<void> {\n if (!this.currentLayout) {\n return Promise.reject(new Error('There is no current layout selected, call start() first'));\n }\n\n if (!this.currentLayout.memberVideoPanes?.find((pane) => pane.id === paneId)) {\n // pane id doesn't exist, so nothing to do\n LoggerProxy.logger.log(\n `RemoteMediaManager#removeMemberVideoPane --> removeMemberVideoPane() called for a non-existent paneId: ${paneId} (pane not found in currentLayout.memberVideoPanes)`\n );\n\n return Promise.resolve();\n }\n\n if (!this.media.video.memberPanes[paneId]) {\n // pane id doesn't exist, so nothing to do\n LoggerProxy.logger.log(\n `RemoteMediaManager#removeMemberVideoPane --> removeMemberVideoPane() called for a non-existent paneId: ${paneId} (pane not found in this.media.video.memberPanes)`\n );\n\n return Promise.resolve();\n }\n\n const remoteMedia = this.media.video.memberPanes[paneId];\n\n const receiveSlot = remoteMedia.getUnderlyingReceiveSlot();\n\n if (receiveSlot) {\n this.receiveSlotManager.releaseSlot(receiveSlot);\n\n const index = this.slots.video.receiverSelected.indexOf(receiveSlot);\n\n if (index >= 0) {\n this.slots.video.receiverSelected.splice(index, 1);\n }\n }\n remoteMedia.stop();\n\n delete this.media.video.memberPanes[paneId];\n delete this.currentLayout.memberVideoPanes?.[paneId];\n\n return Promise.resolve();\n }\n\n /**\n * Pins an active speaker remote media object to the given CSI value. From that moment\n * onwards the remote media will only play audio/video from that specific CSI until\n * unpinActiveSpeakerVideoPane() is called or current layout is changed.\n *\n * @param {RemoteMedia} remoteMedia remote media object reference\n * @param {CSI} csi CSI value to pin to, if undefined, then current CSI value is used\n */\n public pinActiveSpeakerVideoPane(remoteMedia: RemoteMedia, csi?: CSI): void {\n const remoteMediaGroup = Object.values(this.media.video.activeSpeakerGroups).find((group) =>\n group.includes(remoteMedia, 'unpinned')\n );\n\n if (!remoteMediaGroup) {\n throw new Error(\n 'remoteMedia not found among the unpinned remote media from any active speaker group'\n );\n }\n\n remoteMediaGroup.pin(remoteMedia, csi);\n }\n\n /**\n * Unpins a remote media object from the fixed CSI value it was pinned to.\n *\n * @param {RemoteMedia} remoteMedia remote media object reference\n */\n public unpinActiveSpeakerVideoPane(remoteMedia: RemoteMedia) {\n const remoteMediaGroup = Object.values(this.media.video.activeSpeakerGroups).find((group) =>\n group.includes(remoteMedia, 'pinned')\n );\n\n if (!remoteMediaGroup) {\n throw new Error(\n 'remoteMedia not found among the pinned remote media from any active speaker group'\n );\n }\n\n remoteMediaGroup.unpin(remoteMedia);\n }\n\n /**\n * Returns true if a given remote media object belongs to an active speaker group and has been pinned.\n * Throws an error if the remote media object doesn't belong to any active speaker remote media group.\n *\n * @param {RemoteMedia} remoteMedia remote media object\n * @returns {boolean}\n */\n public isPinned(remoteMedia: RemoteMedia) {\n const remoteMediaGroup = Object.values(this.media.video.activeSpeakerGroups).find((group) =>\n group.includes(remoteMedia)\n );\n\n if (!remoteMediaGroup) {\n throw new Error(\n 'remoteMedia not found among any remote media (pinned or unpinned) from any active speaker group'\n );\n }\n\n return remoteMediaGroup.isPinned(remoteMedia);\n }\n}\n"],"mappings":"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"}
|
|
@@ -14,18 +14,20 @@ exports.default = void 0;
|
|
|
14
14
|
|
|
15
15
|
var _freeze = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/freeze"));
|
|
16
16
|
|
|
17
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
18
|
-
|
|
19
17
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
20
18
|
|
|
21
19
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
22
20
|
|
|
21
|
+
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
|
|
22
|
+
|
|
23
23
|
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
|
|
24
24
|
|
|
25
25
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
|
|
26
26
|
|
|
27
27
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
|
|
28
28
|
|
|
29
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
30
|
+
|
|
29
31
|
var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
|
|
30
32
|
|
|
31
33
|
var _constants = require("../constants");
|
|
@@ -73,6 +75,12 @@ var NetworkQualityMonitor = /*#__PURE__*/function (_EventsScope) {
|
|
|
73
75
|
|
|
74
76
|
(0, _classCallCheck2.default)(this, NetworkQualityMonitor);
|
|
75
77
|
_this = _super.call(this);
|
|
78
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "config", void 0);
|
|
79
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "frequencyTypes", void 0);
|
|
80
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "indicatorTypes", void 0);
|
|
81
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaType", void 0);
|
|
82
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "networkQualityScore", void 0);
|
|
83
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "networkQualityStatus", void 0);
|
|
76
84
|
_this.config = config;
|
|
77
85
|
_this.indicatorTypes = (0, _freeze.default)({
|
|
78
86
|
PACKETLOSS: 'packetLoss',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NetworkQualityMonitor","config","indicatorTypes","PACKETLOSS","LATENCY","JITTER","frequencyTypes","UPLINK","DOWNLINK","networkQualityScore","networkQualityStatus","STATS","VIDEO_CORRELATE","AUDIO_CORRELATE","SHARE_CORRELATE","mediaType","emit","file","function","EVENT_TRIGGERS","NETWORK_QUALITY","emitNetworkQuality","remoteRtpResults","statsAnalyzerCurrentStats","roundTripTimeInMilliseconds","roundTripTime","jitterInMilliseconds","jitter","currentPacketLossRatio","send","determinePacketLoss","videoPacketLossRatioThreshold","determineLatency","rttThreshold","deterMineJitter","jitterThreshold","determineIfUndefined","value","acceptable","updateNetworkQualityStatus","EventsScope"],"sources":["index.js"],"sourcesContent":["import EventsScope from '../common/events/events-scope';\nimport {EVENT_TRIGGERS, STATS} from '../constants';\n\n\n/**\n * Meeting - network quality event\n * Emitted on each interval of retrieving stats Analyzer data\n * @event network:quality\n * @type {Object}\n * @property {string} mediaType {video|audio}\n * @property {number} networkQualityScore - value determined in determineUplinkNetworkQuality\n * @memberof NetworkQualityMonitor\n */\n/**\n * NetworkQualityMonitor class that will emit events based on detected quality\n *\n * @class NetworkQualityMonitor\n * @extends {EventsScope}\n */\nexport default class NetworkQualityMonitor extends EventsScope {\n /**\n * Creates a new instance of NetworkQualityMonitor\n * @constructor\n * @public\n * @param {Object} config\n * @property {Object} indicatorTypes - network properties used to evaluate network quality used as constants\n * @property {Object} frequencyTypes - frequency properties used as constants {uplink|send} {downlink|receive}\n * @property {number} networkQualityScore - 0|1 1 is acceptable 0 is bad/unknown\n * @property {Object} networkQualityStatus - hash object based on indicatorTypes and frequencyTypes\n * @property {string} mediaType - audio|video\n */\n constructor(config) {\n super();\n this.config = config;\n this.indicatorTypes = Object.freeze({\n PACKETLOSS: 'packetLoss',\n LATENCY: 'latency',\n JITTER: 'jitter'\n });\n this.frequencyTypes = Object.freeze({\n UPLINK: 'uplink',\n DOWNLINK: 'downlink'\n });\n this.networkQualityScore = 1;\n this.networkQualityStatus = {\n [this.frequencyTypes.UPLINK]: {\n [STATS.VIDEO_CORRELATE]: {},\n [STATS.AUDIO_CORRELATE]: {},\n [STATS.SHARE_CORRELATE]: {}\n }\n };\n this.mediaType = null;\n }\n\n /**\n * emits NETWORK_QUALITY event on meeting with payload of media type and uplinkNetworkQuality score\n *\n * @memberof NetworkQualityMonitor\n * @returns {void}\n */\n emitNetworkQuality() {\n this.emit(\n {\n file: 'networkQualityMonitor',\n function: 'emitNetworkQuality'\n },\n EVENT_TRIGGERS.NETWORK_QUALITY,\n {\n mediaType: this.mediaType,\n networkQualityScore: this.networkQualityScore\n }\n );\n }\n\n /**\n * invokes emitNetworkQuality method resets values back to default\n * @returns {void}\n * @memberof NetworkQualityMonitor\n */\n updateNetworkQualityStatus() {\n this.emitNetworkQuality();\n\n // reset values\n this.networkQualityScore = 1;\n this.mediaType = null;\n }\n\n\n /**\n * filter data to determine uplink network quality, invoked on same interval as stats analyzer remote-inbout-rtp\n * @param {Object} configObj\n * @param {string} configObj.mediaType {audio|video}\n * @param {RTCStats} configObj.remoteRtpResults RTC stats remote obj\n * @param {Object} configObj.statsAnalyzerCurrentStats statsResults\n * @returns {void}\n * @public\n * @memberof NetworkQualityMonitor\n */\n determineUplinkNetworkQuality({mediaType, remoteRtpResults, statsAnalyzerCurrentStats}) {\n const roundTripTimeInMilliseconds = remoteRtpResults.roundTripTime * 1000;\n const jitterInMilliseconds = remoteRtpResults.jitter * 1000;\n const {currentPacketLossRatio} = statsAnalyzerCurrentStats[mediaType].send;\n\n this.mediaType = mediaType;\n\n const {JITTER, PACKETLOSS, LATENCY} = this.indicatorTypes;\n const {UPLINK} = this.frequencyTypes;\n\n /**\n * determines if packetLoss ratio is over threshold set in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const determinePacketLoss = () => {\n if (currentPacketLossRatio >\n this.config.videoPacketLossRatioThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * determines if round trip time value is over threshold set in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const determineLatency = () => {\n if (roundTripTimeInMilliseconds > this.config.rttThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * determines if jitter value is over threshold in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const deterMineJitter = () => {\n if (jitterInMilliseconds > this.config.jitterThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * returns null if val is specifically undefined\n * @param {(number|undefined)} value\n * @returns {(number|null)}\n */\n const determineIfUndefined = (value) => (typeof value === 'undefined' ? null : value);\n\n /**\n * Values for some browsers specifically Safari will be undefined we explicitly set to null\n * https://bugs.webkit.org/show_bug.cgi?id=206645\n * https://bugs.webkit.org/show_bug.cgi?id=212668\n */\n // PACKET LOSS\n this.networkQualityStatus[UPLINK][mediaType][PACKETLOSS] = {\n acceptable: determinePacketLoss(),\n value: determineIfUndefined(currentPacketLossRatio)\n };\n\n\n // LATENCY measured in Round trip time\n this.networkQualityStatus[UPLINK][mediaType][LATENCY] = {\n acceptable: determineLatency(),\n value: determineIfUndefined(remoteRtpResults.roundTripTime)\n };\n\n // JITTER\n this.networkQualityStatus[UPLINK][mediaType][JITTER] = {\n acceptable: deterMineJitter(),\n value: determineIfUndefined(remoteRtpResults.jitter)\n };\n\n this.updateNetworkQualityStatus();\n }\n\n /**\n * Get the current status of network quaility object - networkQualityStatus\n * @returns {Object}\n * @public\n */\n get networkQualityStats() {\n const {UPLINK} = this.frequencyTypes;\n\n return this.networkQualityStatus[UPLINK];\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;IACqBA,qB;;;;;EACnB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,+BAAYC,MAAZ,EAAoB;IAAA;;IAAA;;IAAA;IAClB;IACA,MAAKA,MAAL,GAAcA,MAAd;IACA,MAAKC,cAAL,GAAsB,qBAAc;MAClCC,UAAU,EAAE,YADsB;MAElCC,OAAO,EAAE,SAFyB;MAGlCC,MAAM,EAAE;IAH0B,CAAd,CAAtB;IAKA,MAAKC,cAAL,GAAsB,qBAAc;MAClCC,MAAM,EAAE,QAD0B;MAElCC,QAAQ,EAAE;IAFwB,CAAd,CAAtB;IAIA,MAAKC,mBAAL,GAA2B,CAA3B;IACA,MAAKC,oBAAL,qCACG,MAAKJ,cAAL,CAAoBC,MADvB,oFAEKI,gBAAA,CAAMC,eAFX,EAE6B,EAF7B,wDAGKD,gBAAA,CAAME,eAHX,EAG6B,EAH7B,wDAIKF,gBAAA,CAAMG,eAJX,EAI6B,EAJ7B;IAOA,MAAKC,SAAL,GAAiB,IAAjB;IApBkB;EAqBnB;EAED;AACF;AACA;AACA;AACA;AACA;;;;;WACE,8BAAqB;MACnB,KAAKC,IAAL,CACE;QACEC,IAAI,EAAE,uBADR;QAEEC,QAAQ,EAAE;MAFZ,CADF,EAKEC,yBAAA,CAAeC,eALjB,EAME;QACEL,SAAS,EAAE,KAAKA,SADlB;QAEEN,mBAAmB,EAAE,KAAKA;MAF5B,CANF;IAWD;IAED;AACF;AACA;AACA;AACA;;;;WACE,sCAA6B;MAC3B,KAAKY,kBAAL,GAD2B,CAG3B;;MACA,KAAKZ,mBAAL,GAA2B,CAA3B;MACA,KAAKM,SAAL,GAAiB,IAAjB;IACD;IAGD;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,6CAAwF;MAAA;;MAAA,IAAzDA,SAAyD,QAAzDA,SAAyD;MAAA,IAA9CO,gBAA8C,QAA9CA,gBAA8C;MAAA,IAA5BC,yBAA4B,QAA5BA,yBAA4B;MACtF,IAAMC,2BAA2B,GAAGF,gBAAgB,CAACG,aAAjB,GAAiC,IAArE;MACA,IAAMC,oBAAoB,GAAGJ,gBAAgB,CAACK,MAAjB,GAA0B,IAAvD;MACA,IAAOC,sBAAP,GAAiCL,yBAAyB,CAACR,SAAD,CAAzB,CAAqCc,IAAtE,CAAOD,sBAAP;MAEA,KAAKb,SAAL,GAAiBA,SAAjB;MAEA,2BAAsC,KAAKb,cAA3C;MAAA,IAAOG,MAAP,wBAAOA,MAAP;MAAA,IAAeF,UAAf,wBAAeA,UAAf;MAAA,IAA2BC,OAA3B,wBAA2BA,OAA3B;MACA,IAAOG,MAAP,GAAiB,KAAKD,cAAtB,CAAOC,MAAP;MAEA;AACJ;AACA;AACA;AACA;;MACI,IAAMuB,mBAAmB,GAAG,SAAtBA,mBAAsB,GAAM;QAChC,IAAIF,sBAAsB,GACxB,MAAI,CAAC3B,MAAL,CAAY8B,6BADd,EAC6C;UAC3C,MAAI,CAACtB,mBAAL,GAA2B,CAA3B;UAEA,OAAO,KAAP;QACD;;QAED,OAAO,IAAP;MACD,CATD;MAWA;AACJ;AACA;AACA;AACA;;;MACI,IAAMuB,gBAAgB,GAAG,SAAnBA,gBAAmB,GAAM;QAC7B,IAAIR,2BAA2B,GAAG,MAAI,CAACvB,MAAL,CAAYgC,YAA9C,EAA4D;UAC1D,MAAI,CAACxB,mBAAL,GAA2B,CAA3B;UAEA,OAAO,KAAP;QACD;;QAED,OAAO,IAAP;MACD,CARD;MAUA;AACJ;AACA;AACA;AACA;;;MACI,IAAMyB,eAAe,GAAG,SAAlBA,eAAkB,GAAM;QAC5B,IAAIR,oBAAoB,GAAG,MAAI,CAACzB,MAAL,CAAYkC,eAAvC,EAAwD;UACtD,MAAI,CAAC1B,mBAAL,GAA2B,CAA3B;UAEA,OAAO,KAAP;QACD;;QAED,OAAO,IAAP;MACD,CARD;MAUA;AACJ;AACA;AACA;AACA;;;MACI,IAAM2B,oBAAoB,GAAG,SAAvBA,oBAAuB,CAACC,KAAD;QAAA,OAAY,OAAOA,KAAP,KAAiB,WAAjB,GAA+B,IAA/B,GAAsCA,KAAlD;MAAA,CAA7B;MAEA;AACJ;AACA;AACA;AACA;MACI;;;MACA,KAAK3B,oBAAL,CAA0BH,MAA1B,EAAkCQ,SAAlC,EAA6CZ,UAA7C,IAA2D;QACzDmC,UAAU,EAAER,mBAAmB,EAD0B;QAEzDO,KAAK,EAAED,oBAAoB,CAACR,sBAAD;MAF8B,CAA3D,CArEsF,CA2EtF;;MACA,KAAKlB,oBAAL,CAA0BH,MAA1B,EAAkCQ,SAAlC,EAA6CX,OAA7C,IAAwD;QACtDkC,UAAU,EAAEN,gBAAgB,EAD0B;QAEtDK,KAAK,EAAED,oBAAoB,CAACd,gBAAgB,CAACG,aAAlB;MAF2B,CAAxD,CA5EsF,CAiFtF;;MACA,KAAKf,oBAAL,CAA0BH,MAA1B,EAAkCQ,SAAlC,EAA6CV,MAA7C,IAAuD;QACrDiC,UAAU,EAAEJ,eAAe,EAD0B;QAErDG,KAAK,EAAED,oBAAoB,CAACd,gBAAgB,CAACK,MAAlB;MAF0B,CAAvD;MAKA,KAAKY,0BAAL;IACD;IAED;AACF;AACA;AACA;AACA;;;;SACE,eAA0B;MACxB,IAAOhC,MAAP,GAAiB,KAAKD,cAAtB,CAAOC,MAAP;MAEA,OAAO,KAAKG,oBAAL,CAA0BH,MAA1B,CAAP;IACD;;;EAlLgDiC,oB"}
|
|
1
|
+
{"version":3,"names":["NetworkQualityMonitor","config","indicatorTypes","PACKETLOSS","LATENCY","JITTER","frequencyTypes","UPLINK","DOWNLINK","networkQualityScore","networkQualityStatus","STATS","VIDEO_CORRELATE","AUDIO_CORRELATE","SHARE_CORRELATE","mediaType","emit","file","function","EVENT_TRIGGERS","NETWORK_QUALITY","emitNetworkQuality","remoteRtpResults","statsAnalyzerCurrentStats","roundTripTimeInMilliseconds","roundTripTime","jitterInMilliseconds","jitter","currentPacketLossRatio","send","determinePacketLoss","videoPacketLossRatioThreshold","determineLatency","rttThreshold","deterMineJitter","jitterThreshold","determineIfUndefined","value","acceptable","updateNetworkQualityStatus","EventsScope"],"sources":["index.ts"],"sourcesContent":["import EventsScope from '../common/events/events-scope';\nimport {EVENT_TRIGGERS, STATS} from '../constants';\n\n\n/**\n * Meeting - network quality event\n * Emitted on each interval of retrieving stats Analyzer data\n * @event network:quality\n * @type {Object}\n * @property {string} mediaType {video|audio}\n * @property {number} networkQualityScore - value determined in determineUplinkNetworkQuality\n * @memberof NetworkQualityMonitor\n */\n/**\n * NetworkQualityMonitor class that will emit events based on detected quality\n *\n * @class NetworkQualityMonitor\n * @extends {EventsScope}\n */\nexport default class NetworkQualityMonitor extends EventsScope {\n config: any;\n frequencyTypes: any;\n indicatorTypes: any;\n mediaType: any;\n networkQualityScore: any;\n networkQualityStatus: any;\n\n /**\n * Creates a new instance of NetworkQualityMonitor\n * @constructor\n * @public\n * @param {Object} config\n * @property {Object} indicatorTypes - network properties used to evaluate network quality used as constants\n * @property {Object} frequencyTypes - frequency properties used as constants {uplink|send} {downlink|receive}\n * @property {number} networkQualityScore - 0|1 1 is acceptable 0 is bad/unknown\n * @property {Object} networkQualityStatus - hash object based on indicatorTypes and frequencyTypes\n * @property {string} mediaType - audio|video\n */\n constructor(config: any) {\n super();\n this.config = config;\n this.indicatorTypes = Object.freeze({\n PACKETLOSS: 'packetLoss',\n LATENCY: 'latency',\n JITTER: 'jitter'\n });\n this.frequencyTypes = Object.freeze({\n UPLINK: 'uplink',\n DOWNLINK: 'downlink'\n });\n this.networkQualityScore = 1;\n this.networkQualityStatus = {\n [this.frequencyTypes.UPLINK]: {\n [STATS.VIDEO_CORRELATE]: {},\n [STATS.AUDIO_CORRELATE]: {},\n [STATS.SHARE_CORRELATE]: {}\n }\n };\n this.mediaType = null;\n }\n\n /**\n * emits NETWORK_QUALITY event on meeting with payload of media type and uplinkNetworkQuality score\n *\n * @memberof NetworkQualityMonitor\n * @returns {void}\n */\n emitNetworkQuality() {\n this.emit(\n {\n file: 'networkQualityMonitor',\n function: 'emitNetworkQuality'\n },\n EVENT_TRIGGERS.NETWORK_QUALITY,\n {\n mediaType: this.mediaType,\n networkQualityScore: this.networkQualityScore\n }\n );\n }\n\n /**\n * invokes emitNetworkQuality method resets values back to default\n * @returns {void}\n * @memberof NetworkQualityMonitor\n */\n updateNetworkQualityStatus() {\n this.emitNetworkQuality();\n\n // reset values\n this.networkQualityScore = 1;\n this.mediaType = null;\n }\n\n\n /**\n * filter data to determine uplink network quality, invoked on same interval as stats analyzer remote-inbout-rtp\n * @param {Object} configObj\n * @param {string} configObj.mediaType {audio|video}\n * @param {RTCStats} configObj.remoteRtpResults RTC stats remote obj\n * @param {Object} configObj.statsAnalyzerCurrentStats statsResults\n * @returns {void}\n * @public\n * @memberof NetworkQualityMonitor\n */\n public determineUplinkNetworkQuality({\n mediaType,\n remoteRtpResults,\n statsAnalyzerCurrentStats,\n }: {\n mediaType: string;\n remoteRtpResults: any;\n statsAnalyzerCurrentStats: object;\n }) {\n const roundTripTimeInMilliseconds = remoteRtpResults.roundTripTime * 1000;\n const jitterInMilliseconds = remoteRtpResults.jitter * 1000;\n const {currentPacketLossRatio} = statsAnalyzerCurrentStats[mediaType].send;\n\n this.mediaType = mediaType;\n\n const {JITTER, PACKETLOSS, LATENCY} = this.indicatorTypes;\n const {UPLINK} = this.frequencyTypes;\n\n /**\n * determines if packetLoss ratio is over threshold set in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const determinePacketLoss = () => {\n if (currentPacketLossRatio >\n this.config.videoPacketLossRatioThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * determines if round trip time value is over threshold set in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const determineLatency = () => {\n if (roundTripTimeInMilliseconds > this.config.rttThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * determines if jitter value is over threshold in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const deterMineJitter = () => {\n if (jitterInMilliseconds > this.config.jitterThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * returns null if val is specifically undefined\n * @param {(number|undefined)} value\n * @returns {(number|null)}\n */\n const determineIfUndefined = (value: number | undefined) => (typeof value === 'undefined' ? null : value);\n\n /**\n * Values for some browsers specifically Safari will be undefined we explicitly set to null\n * https://bugs.webkit.org/show_bug.cgi?id=206645\n * https://bugs.webkit.org/show_bug.cgi?id=212668\n */\n // PACKET LOSS\n this.networkQualityStatus[UPLINK][mediaType][PACKETLOSS] = {\n acceptable: determinePacketLoss(),\n value: determineIfUndefined(currentPacketLossRatio)\n };\n\n\n // LATENCY measured in Round trip time\n this.networkQualityStatus[UPLINK][mediaType][LATENCY] = {\n acceptable: determineLatency(),\n value: determineIfUndefined(remoteRtpResults.roundTripTime)\n };\n\n // JITTER\n this.networkQualityStatus[UPLINK][mediaType][JITTER] = {\n acceptable: deterMineJitter(),\n value: determineIfUndefined(remoteRtpResults.jitter)\n };\n\n this.updateNetworkQualityStatus();\n }\n\n /**\n * Get the current status of network quaility object - networkQualityStatus\n * @returns {Object}\n * @public\n */\n get networkQualityStats() {\n const {UPLINK} = this.frequencyTypes;\n\n return this.networkQualityStatus[UPLINK];\n }\n}\n"],"mappings":"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"}
|
|
@@ -66,6 +66,15 @@ var PersonalMeetingRoom = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
66
66
|
* @memberof PersonalMeetingRoom
|
|
67
67
|
*/
|
|
68
68
|
|
|
69
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "link", void 0);
|
|
70
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "meetingInfo", void 0);
|
|
71
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "name", void 0);
|
|
72
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "personalMeetingRoomRequest", void 0);
|
|
73
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "pmr", void 0);
|
|
74
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "sipUri", void 0);
|
|
75
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "userId", void 0);
|
|
76
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "meetingLink", void 0);
|
|
77
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "number", void 0);
|
|
69
78
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "namespace", _constants.MEETINGS);
|
|
70
79
|
_this.pmr = null;
|
|
71
80
|
/**
|
|
@@ -120,6 +129,7 @@ var PersonalMeetingRoom = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
120
129
|
* @private
|
|
121
130
|
* @memberof PersonalMeetingRoom
|
|
122
131
|
*/
|
|
132
|
+
// @ts-ignore
|
|
123
133
|
|
|
124
134
|
_this.personalMeetingRoomRequest = new _request.default({}, options);
|
|
125
135
|
return _this;
|
|
@@ -142,6 +152,7 @@ var PersonalMeetingRoom = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
142
152
|
|
|
143
153
|
var preferred = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
144
154
|
var options = {
|
|
155
|
+
// @ts-ignore
|
|
145
156
|
userId: this.webex.internal.device.userId,
|
|
146
157
|
passcode: pin,
|
|
147
158
|
meetingAddress: link,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["PersonalMeetingRoom","attrs","options","MEETINGS","pmr","sipUri","link","userId","name","meetingInfo","personalMeetingRoomRequest","PersonalMeetingRoomRequest","pin","preferred","webex","internal","device","passcode","meetingAddress","claimPmr","then","body","set","reject","ParameterError","sipMeetingUri","meetingLink","webExMeetingLink","owner","meetingName","number","meetingNumber","type","_PERSONAL_ROOM_","fetchMeetingInfo","isPmr","TypeError","StatelessWebexPlugin"],"sources":["index.
|
|
1
|
+
{"version":3,"names":["PersonalMeetingRoom","attrs","options","MEETINGS","pmr","sipUri","link","userId","name","meetingInfo","personalMeetingRoomRequest","PersonalMeetingRoomRequest","pin","preferred","webex","internal","device","passcode","meetingAddress","claimPmr","then","body","set","reject","ParameterError","sipMeetingUri","meetingLink","webExMeetingLink","owner","meetingName","number","meetingNumber","type","_PERSONAL_ROOM_","fetchMeetingInfo","isPmr","TypeError","StatelessWebexPlugin"],"sources":["index.ts"],"sourcesContent":["// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport {MEETINGS, _PERSONAL_ROOM_} from '../constants';\nimport ParameterError from '../common/errors/parameter';\n\nimport PersonalMeetingRoomRequest from './request';\n\n\n/**\n * @class PersonalMeetingRoom\n */\nexport default class PersonalMeetingRoom extends StatelessWebexPlugin {\n link: any;\n meetingInfo: any;\n name: any;\n personalMeetingRoomRequest: any;\n pmr: any;\n sipUri: any;\n userId: any;\n meetingLink: any;\n number: any;\n\n namespace = MEETINGS;\n\n /**\n *\n * @param {Object} attrs\n * @param {Object} options\n */\n constructor(attrs: any, options: any) {\n super({}, options);\n /**\n * The pmr server object\n * @instance\n * @type {Object}\n * @public\n * @memberof PersonalMeetingRoom\n */\n this.pmr = null;\n /**\n * The pmr sip Uri\n * @instance\n * @type {String}\n * @public\n * @memberof PersonalMeetingRoom\n */\n this.sipUri = null;\n /**\n * The pmr link\n * @instance\n * @type {String}\n * @public\n * @memberof PersonalMeetingRoom\n */\n this.link = null;\n /**\n * The pmr server object\n * @instance\n * @type {Object}\n * @public\n * @memberof PersonalMeetingRoom\n */\n this.userId = null;\n /**\n * The pmr name\n * @instance\n * @type {String}\n * @public\n * @memberof PersonalMeetingRoom\n */\n this.name = null;\n /**\n * The meeting info request server interface\n * @instance\n * @type {MeetingInfo}\n * @private\n * @memberof PersonalMeetingRoom\n */\n this.meetingInfo = attrs.meetingInfo;\n /**\n * The pmr server request interface\n * @instance\n * @type {Object}\n * @private\n * @memberof PersonalMeetingRoom\n */\n // @ts-ignore\n this.personalMeetingRoomRequest = new PersonalMeetingRoomRequest({}, options);\n }\n\n /**\n * claims a pmr and updates the cached PMR values\n * @param {String} link\n * @param {String} pin\n * @param {Boolean} [preferred] defaults to true to set this claimed PMR as the preferred\n * @returns {Promise}\n * @public\n * @memberof PersonalMeetingRoom\n */\n public claim(link: string, pin: string, preferred: boolean = true) {\n const options = {\n // @ts-ignore\n userId: this.webex.internal.device.userId,\n passcode: pin,\n meetingAddress: link,\n preferred\n };\n\n return this.personalMeetingRoomRequest.claimPmr(options).then((pmr) => {\n if (pmr && pmr.body) {\n this.set(pmr.body);\n }\n else {\n return Promise.reject(new ParameterError('No PMR body provided. PMR values not updated.'));\n }\n\n return pmr.body;\n });\n }\n\n /**\n * @param {Object} body the response body from meeting info request\n * @returns {undefined}\n * @private\n * @memberof PersonalMeetingRoom\n */\n private set(body: any) {\n this.pmr = body;\n this.sipUri = body.sipMeetingUri;\n this.meetingLink = body.webExMeetingLink || body.meetingLink;\n this.userId = body.owner;\n this.name = body.meetingName;\n this.number = body.meetingNumber;\n }\n\n /**\n * TODO: implement TTL for syncing and caching so to not request again and again\n * @param {Object} options\n * @returns {Promise}\n * @public\n * @memberof PersonalMeetingRoom\n */\n public get() {\n const options = {\n type: _PERSONAL_ROOM_\n\n };\n\n return this.meetingInfo.fetchMeetingInfo(options).then((pmr) => {\n if (pmr && pmr.body && pmr.body.isPmr) {\n this.set(pmr.body);\n }\n else {\n return Promise.reject(new TypeError('The PMR requested is NOT a PMR. PMR values not set.'));\n }\n\n return pmr.body;\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -88,7 +88,8 @@ var PersonalMeetingRoomRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
88
88
|
return _promise.default.reject(new _parameter.default('The PMR link provided was of an invalid format'));
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
var request = _util.default.getClaimedRequestParams(validLink, validPin, options);
|
|
91
|
+
var request = _util.default.getClaimedRequestParams(validLink, validPin, options); // @ts-ignore
|
|
92
|
+
|
|
92
93
|
|
|
93
94
|
return this.request(request);
|
|
94
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["PersonalMeetingRoomRequest","MEETINGS","options","userId","passcode","meetingAddress","preferred","ParameterError","validPin","PersonalMeetingRoomUtil","getClaimPmrPin","reject","validLink","getClaimPmrLink","request","getClaimedRequestParams","StatelessWebexPlugin"],"sources":["request.
|
|
1
|
+
{"version":3,"names":["PersonalMeetingRoomRequest","MEETINGS","options","userId","passcode","meetingAddress","preferred","ParameterError","validPin","PersonalMeetingRoomUtil","getClaimPmrPin","reject","validLink","getClaimPmrLink","request","getClaimedRequestParams","StatelessWebexPlugin"],"sources":["request.ts"],"sourcesContent":["// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport {MEETINGS} from '../constants';\nimport ParameterError from '../common/errors/parameter';\n\nimport PersonalMeetingRoomUtil from './util';\n\n\n/**\n * @class MeetingInfoRequest\n */\nexport default class PersonalMeetingRoomRequest extends StatelessWebexPlugin {\n namespace = MEETINGS;\n\n /**\n *\n * @param {Object} options with format of {userId, passcode, meetingAddress, preferred}\n * @returns {Promise} returns a promise that resolves/rejects the result of the request\n * @memberof PersonalMeetingRoomRequest\n */\n claimPmr(options: any) {\n if (!options || !options.userId || !options.passcode || !options.meetingAddress || !options.preferred) {\n throw new ParameterError('Claiming a PMR should be done with userId, passcode, preferred, and meetingAddress in options.');\n }\n const validPin = PersonalMeetingRoomUtil.getClaimPmrPin(options.passcode);\n\n if (!validPin) {\n return Promise.reject(new ParameterError('The host pin provided was of an invalid format'));\n }\n const validLink = PersonalMeetingRoomUtil.getClaimPmrLink(options.meetingAddress);\n\n if (!validLink) {\n return Promise.reject(new ParameterError('The PMR link provided was of an invalid format'));\n }\n const request = PersonalMeetingRoomUtil.getClaimedRequestParams(validLink, validPin, options);\n\n // @ts-ignore\n return this.request(request);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;AAEA;;AACA;;AAEA;;;;;;AAGA;AACA;AACA;IACqBA,0B;;;;;;;;;;;;;;;4FACPC,mB;;;;;;;IAEZ;AACF;AACA;AACA;AACA;AACA;IACE,kBAASC,OAAT,EAAuB;MACrB,IAAI,CAACA,OAAD,IAAY,CAACA,OAAO,CAACC,MAArB,IAA+B,CAACD,OAAO,CAACE,QAAxC,IAAoD,CAACF,OAAO,CAACG,cAA7D,IAA+E,CAACH,OAAO,CAACI,SAA5F,EAAuG;QACrG,MAAM,IAAIC,kBAAJ,CAAmB,gGAAnB,CAAN;MACD;;MACD,IAAMC,QAAQ,GAAGC,aAAA,CAAwBC,cAAxB,CAAuCR,OAAO,CAACE,QAA/C,CAAjB;;MAEA,IAAI,CAACI,QAAL,EAAe;QACb,OAAO,iBAAQG,MAAR,CAAe,IAAIJ,kBAAJ,CAAmB,gDAAnB,CAAf,CAAP;MACD;;MACD,IAAMK,SAAS,GAAGH,aAAA,CAAwBI,eAAxB,CAAwCX,OAAO,CAACG,cAAhD,CAAlB;;MAEA,IAAI,CAACO,SAAL,EAAgB;QACd,OAAO,iBAAQD,MAAR,CAAe,IAAIJ,kBAAJ,CAAmB,gDAAnB,CAAf,CAAP;MACD;;MACD,IAAMO,OAAO,GAAGL,aAAA,CAAwBM,uBAAxB,CAAgDH,SAAhD,EAA2DJ,QAA3D,EAAqEN,OAArE,CAAhB,CAdqB,CAgBrB;;;MACA,OAAO,KAAKY,OAAL,CAAaA,OAAb,CAAP;IACD;;;EA3BqDE,+B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["PersonalMeetingRoomUtil","getClaimPmrLink","pmrLink","validator","VALID_PMR_ADDRESS","test","match","VALID_PMR_LINK","WEBEX_DOT_COM","getClaimPmrPin","hostPin","VALID_PIN","getClaimedRequestParams","link","pin","options","method","HTTP_VERBS","POST","api","HECATE","resource","CMR_MEETINGS","CLAIM","body","userId","passcode","preferred","meetingAddress"],"sources":["util.
|
|
1
|
+
{"version":3,"names":["PersonalMeetingRoomUtil","getClaimPmrLink","pmrLink","validator","VALID_PMR_ADDRESS","test","match","VALID_PMR_LINK","WEBEX_DOT_COM","getClaimPmrPin","hostPin","VALID_PIN","getClaimedRequestParams","link","pin","options","method","HTTP_VERBS","POST","api","HECATE","resource","CMR_MEETINGS","CLAIM","body","userId","passcode","preferred","meetingAddress"],"sources":["util.ts"],"sourcesContent":["import {\n HTTP_VERBS,\n VALID_PIN,\n VALID_PMR_ADDRESS,\n VALID_PMR_LINK,\n CMR_MEETINGS,\n CLAIM,\n HECATE,\n WEBEX_DOT_COM\n} from '../constants';\n\nconst PersonalMeetingRoomUtil: any = {};\n\nPersonalMeetingRoomUtil.getClaimPmrLink = (pmrLink) => {\n let validator = VALID_PMR_ADDRESS.test(pmrLink);\n\n if (validator) {\n return pmrLink;\n }\n validator = pmrLink.match(VALID_PMR_LINK);\n if (validator) {\n // userId + '@' + site + '.webex.com'\n return `${validator[4]}@${validator[2]}.${WEBEX_DOT_COM}`;\n }\n\n return null;\n};\n\nPersonalMeetingRoomUtil.getClaimPmrPin = (hostPin) => {\n if (VALID_PIN.test(hostPin)) {\n return hostPin;\n }\n\n return null;\n};\n\nPersonalMeetingRoomUtil.getClaimedRequestParams = (link, pin, options) => ({\n method: HTTP_VERBS.POST,\n api: HECATE,\n resource: `/${CMR_MEETINGS}/${CLAIM}`,\n body: {\n userId: options.userId,\n passcode: pin,\n preferred: options.preferred,\n meetingAddress: link\n }\n});\n\nexport default PersonalMeetingRoomUtil;\n"],"mappings":";;;;;;;;;;AAAA;;AAWA,IAAMA,uBAA4B,GAAG,EAArC;;AAEAA,uBAAuB,CAACC,eAAxB,GAA0C,UAACC,OAAD,EAAa;EACrD,IAAIC,SAAS,GAAGC,4BAAA,CAAkBC,IAAlB,CAAuBH,OAAvB,CAAhB;;EAEA,IAAIC,SAAJ,EAAe;IACb,OAAOD,OAAP;EACD;;EACDC,SAAS,GAAGD,OAAO,CAACI,KAAR,CAAcC,yBAAd,CAAZ;;EACA,IAAIJ,SAAJ,EAAe;IACb;IACA,iBAAUA,SAAS,CAAC,CAAD,CAAnB,cAA0BA,SAAS,CAAC,CAAD,CAAnC,cAA0CK,wBAA1C;EACD;;EAED,OAAO,IAAP;AACD,CAbD;;AAeAR,uBAAuB,CAACS,cAAxB,GAAyC,UAACC,OAAD,EAAa;EACpD,IAAIC,oBAAA,CAAUN,IAAV,CAAeK,OAAf,CAAJ,EAA6B;IAC3B,OAAOA,OAAP;EACD;;EAED,OAAO,IAAP;AACD,CAND;;AAQAV,uBAAuB,CAACY,uBAAxB,GAAkD,UAACC,IAAD,EAAOC,GAAP,EAAYC,OAAZ;EAAA,OAAyB;IACzEC,MAAM,EAAEC,qBAAA,CAAWC,IADsD;IAEzEC,GAAG,EAAEC,iBAFoE;IAGzEC,QAAQ,aAAMC,uBAAN,cAAsBC,gBAAtB,CAHiE;IAIzEC,IAAI,EAAE;MACJC,MAAM,EAAEV,OAAO,CAACU,MADZ;MAEJC,QAAQ,EAAEZ,GAFN;MAGJa,SAAS,EAAEZ,OAAO,CAACY,SAHf;MAIJC,cAAc,EAAEf;IAJZ;EAJmE,CAAzB;AAAA,CAAlD;;eAYeb,uB"}
|
|
@@ -22,8 +22,6 @@ var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/objec
|
|
|
22
22
|
|
|
23
23
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
24
24
|
|
|
25
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
26
|
-
|
|
27
25
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
|
|
28
26
|
|
|
29
27
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
|
|
@@ -32,6 +30,8 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/he
|
|
|
32
30
|
|
|
33
31
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
34
32
|
|
|
33
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
34
|
+
|
|
35
35
|
var _uniq2 = _interopRequireDefault(require("lodash/uniq"));
|
|
36
36
|
|
|
37
37
|
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
|
@@ -55,6 +55,9 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
55
55
|
*/
|
|
56
56
|
function Reachability(webex) {
|
|
57
57
|
(0, _classCallCheck2.default)(this, Reachability);
|
|
58
|
+
(0, _defineProperty2.default)(this, "webex", void 0);
|
|
59
|
+
(0, _defineProperty2.default)(this, "reachabilityRequest", void 0);
|
|
60
|
+
(0, _defineProperty2.default)(this, "clusterLatencyResults", void 0);
|
|
58
61
|
this.webex = webex;
|
|
59
62
|
/**
|
|
60
63
|
* internal request object for the server
|
|
@@ -218,7 +221,8 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
218
221
|
config = cluster.config;
|
|
219
222
|
|
|
220
223
|
try {
|
|
221
|
-
var peerConnection = new window.RTCPeerConnection(config);
|
|
224
|
+
var peerConnection = new window.RTCPeerConnection(config); // @ts-ignore
|
|
225
|
+
|
|
222
226
|
peerConnection.key = key;
|
|
223
227
|
return peerConnection;
|
|
224
228
|
} catch (peerConnectionError) {
|
|
@@ -276,6 +280,7 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
276
280
|
|
|
277
281
|
case 5:
|
|
278
282
|
description = _context2.sent;
|
|
283
|
+
// @ts-ignore
|
|
279
284
|
peerConnection.begin = (0, _now.default)();
|
|
280
285
|
peerConnection.setLocalDescription(description);
|
|
281
286
|
return _context2.abrupt("return", _this.iceGatheringState(peerConnection, cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT).catch(function (iceGatheringStateError) {
|
|
@@ -340,7 +345,8 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
340
345
|
var COMPLETE = _constants.ICE_GATHERING_STATE.COMPLETE;
|
|
341
346
|
|
|
342
347
|
if (peerConnection.iceConnectionState === COMPLETE) {
|
|
343
|
-
var elapsed = _this2.getElapsedTime(peerConnection);
|
|
348
|
+
var elapsed = _this2.getElapsedTime(peerConnection); // @ts-ignore
|
|
349
|
+
|
|
344
350
|
|
|
345
351
|
_loggerProxy.default.logger.log("Reachability:index#onIceGatheringStateChange --> Successfully pinged ".concat(peerConnection.key, ":"), elapsed);
|
|
346
352
|
|
|
@@ -366,7 +372,8 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
366
372
|
var SERVER_REFLEXIVE = 'srflx';
|
|
367
373
|
|
|
368
374
|
if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {
|
|
369
|
-
var elapsed = _this3.getElapsedTime(peerConnection);
|
|
375
|
+
var elapsed = _this3.getElapsedTime(peerConnection); // @ts-ignore
|
|
376
|
+
|
|
370
377
|
|
|
371
378
|
_loggerProxy.default.logger.log("Reachability:index#onIceCandidate --> Successfully pinged ".concat(peerConnection.key, ":"), elapsed);
|
|
372
379
|
|
|
@@ -404,6 +411,7 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
404
411
|
set: function set(target, property, value) {
|
|
405
412
|
// only intercept elapsed property
|
|
406
413
|
if (property === ELAPSED) {
|
|
414
|
+
// @ts-ignore
|
|
407
415
|
resolve({
|
|
408
416
|
clusterId: peerConnection.key,
|
|
409
417
|
elapsed: value
|
|
@@ -531,7 +539,8 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
531
539
|
|
|
532
540
|
var REACHABLE = 'reachable';
|
|
533
541
|
var UNREACHABLE = 'unreachable';
|
|
534
|
-
var CLOSED = _constants.CONNECTION_STATE.CLOSED;
|
|
542
|
+
var CLOSED = _constants.CONNECTION_STATE.CLOSED; // @ts-ignore
|
|
543
|
+
|
|
535
544
|
var key = peerConnection.key;
|
|
536
545
|
var resultKey = elapsed === null ? UNREACHABLE : REACHABLE;
|
|
537
546
|
var intialState = (_intialState = {}, (0, _defineProperty2.default)(_intialState, REACHABLE, 0), (0, _defineProperty2.default)(_intialState, UNREACHABLE, 0), _intialState);
|
|
@@ -547,7 +556,8 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
547
556
|
// an event other than onIceCandidate
|
|
548
557
|
|
|
549
558
|
peerConnection.onicecandidate = null;
|
|
550
|
-
peerConnection.close();
|
|
559
|
+
peerConnection.close(); // @ts-ignore
|
|
560
|
+
|
|
551
561
|
peerConnection.elapsed = elapsed;
|
|
552
562
|
}
|
|
553
563
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","Reachability","webex","reachabilityRequest","ReachabilityRequest","clusterLatencyResults","setup","window","localStorage","removeItem","REACHABILITY","LoggerProxy","logger","error","getClusters","clusters","performReachabilityCheck","results","setItem","log","reachable","reachabilityData","getItem","reachabilityResults","JSON","parse","some","result","udp","tcp","e","cluster","iceServers","map","url","username","credential","urls","iceCandidatePoolSize","iceTransportPolicy","key","config","peerConnection","RTCPeerConnection","peerConnectionError","startTime","begin","clusterList","buildPeerConnectionConfig","createPeerConnection","createOffer","offerToReceiveAudio","description","setLocalDescription","iceGatheringState","isVideoMesh","catch","iceGatheringStateError","all","then","parseIceResultsToReachabilityResults","reachabilityLatencyResults","logUnreachableClusters","unreachableList","forEach","unreachable","push","onicegatheringstatechange","COMPLETE","ICE_GATHERING_STATE","iceConnectionState","elapsed","getElapsedTime","setLatencyAndClose","onicecandidate","SERVER_REFLEXIVE","candidate","String","type","toLowerCase","timeout","ELAPSED","resolve","peerConnectionProxy","Proxy","get","target","property","targetMember","bind","set","value","clusterId","Reflect","handleIceGatheringStateChange","handleOnIceCandidate","setTimeout","CLOSED","CONNECTION_STATE","connectionState","list","getUnreachablClusters","iceResults","reachabilityMap","latencyResult","latencyInMilliseconds","toString","length","getLocalSDPForClusters","localSDPData","REACHABLE","UNREACHABLE","resultKey","intialState","close"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\n/* globals window */\nimport _ from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ICE_GATHERING_STATE,\n CONNECTION_STATE,\n REACHABILITY\n} from '../constants';\n\nimport ReachabilityRequest from './request';\n\nconst DEFAULT_TIMEOUT = 3000;\nconst VIDEO_MESH_TIMEOUT = 1000;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex) {\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n /**\n * internal object of clusters latency results\n * @instance\n * @type {object}\n * @private\n * @memberof Reachability\n */\n this.clusterLatencyResults = {};\n }\n\n\n /**\n * fetches reachability data\n * @returns {Object} reachability data\n * @public\n * @async\n * @memberof Reachability\n */\n async gatherReachability() {\n this.setup();\n\n // Remove stored reachability results to ensure no stale data\n if (window?.localStorage?.removeItem) {\n window.localStorage.removeItem(REACHABILITY.localStorage);\n }\n else {\n LoggerProxy.logger.error('Reachability:index#gatherReachability --> Error in accessing LocalStorage.');\n\n return {};\n }\n\n // Fetch clusters and measure latency\n try {\n const clusters = await this.reachabilityRequest.getClusters();\n\n // Perform Reachability Check\n const results = await this.performReachabilityCheck(clusters);\n\n window.localStorage.setItem(REACHABILITY.localStorage, JSON.stringify(results));\n\n LoggerProxy.logger.log('Reachability:index#gatherReachability --> Reachability checks completed');\n\n return results;\n }\n catch (getClusterError) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`);\n\n return {};\n }\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n isAnyClusterReachable() {\n let reachable = false;\n const reachabilityData = window.localStorage.getItem(REACHABILITY.localStorage);\n\n if (reachabilityData) {\n try {\n const reachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some((result) => result.udp?.reachable === 'true' || result.tcp?.reachable === 'true');\n }\n catch (e) {\n LoggerProxy.logger.error(`Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`);\n }\n }\n\n return reachable;\n }\n\n\n /**\n * Generate peerConnection config settings\n * @param {object} cluster\n * @returns {object} peerConnectionConfig\n * @private\n * @memberof Reachability\n */\n buildPeerConnectionConfig(cluster) {\n const iceServers = _.uniq([\n ...cluster.udp,\n ...cluster.tcp\n ]).map((url) => ({\n username: '',\n credential: '',\n urls: [url]\n }));\n\n return {\n iceServers: [\n ...iceServers\n ],\n iceCandidatePoolSize: '0',\n iceTransportPolicy: 'all'\n };\n }\n\n\n /**\n * Creates an RTCPeerConnection\n * @param {object} cluster\n * @returns {RTCPeerConnection} peerConnection\n * @private\n * @memberof Reachability\n */\n createPeerConnection(cluster) {\n const {key, config} = cluster;\n\n try {\n const peerConnection = new window.RTCPeerConnection(config);\n\n peerConnection.key = key;\n\n return peerConnection;\n }\n catch (peerConnectionError) {\n LoggerProxy.logger.log(`Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`);\n\n return null;\n }\n }\n\n\n /**\n * Gets total elapsed time\n * @param {RTCPeerConnection} peerConnection\n * @returns {Number} Milliseconds\n * @private\n * @memberof Reachability\n */\n getElapsedTime(peerConnection) {\n const startTime = peerConnection.begin;\n\n delete peerConnection.begin;\n\n return Date.now() - startTime;\n }\n\n\n /**\n * creates offer and generates localSDP\n * @param {object} clusterList cluster List\n * @returns {Promise} Reachability latency results\n * @private\n * @memberof Reachability\n */\n getLocalSDPForClusters(clusterList) {\n let clusters = [...Object.keys(clusterList)];\n\n clusters = clusters.map(async (key) => {\n const cluster = clusterList[key];\n const config = this.buildPeerConnectionConfig(cluster);\n const peerConnection = this.createPeerConnection({key, config});\n const description = await peerConnection.createOffer({offerToReceiveAudio: true});\n\n peerConnection.begin = Date.now();\n peerConnection.setLocalDescription(description);\n\n return this.iceGatheringState(peerConnection, cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT)\n .catch((iceGatheringStateError) => {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`);\n });\n });\n\n return Promise.all(clusters)\n .then(this.parseIceResultsToReachabilityResults)\n .then((reachabilityLatencyResults) => {\n this.logUnreachableClusters();\n\n // return results\n return reachabilityLatencyResults;\n });\n }\n\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n getUnreachablClusters() {\n const unreachableList = [];\n const clusters = this.clusterLatencyResults;\n\n Object.keys(clusters).forEach((key) => {\n const cluster = clusters[key];\n\n if (cluster.unreachable && !cluster.reachable) {\n unreachableList.push(key);\n }\n });\n\n return unreachableList;\n }\n\n\n /**\n * Attach an event handler for the icegatheringstatechange\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n handleIceGatheringStateChange(peerConnection) {\n peerConnection.onicegatheringstatechange = () => {\n const {COMPLETE} = ICE_GATHERING_STATE;\n\n if (peerConnection.iceConnectionState === COMPLETE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(`Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n\n /**\n * Attach an event handler for the icecandidate\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n handleOnIceCandidate(peerConnection) {\n peerConnection.onicecandidate = (e) => {\n const SERVER_REFLEXIVE = 'srflx';\n\n if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n /**\n * An event handler on an RTCPeerConnection when the state of the ICE\n * candidate gathering process changes. Used to measure connection\n * speed.\n * @private\n * @param {RTCPeerConnection} peerConnection\n * @param {number} timeout\n * @returns {Promise}\n */\n iceGatheringState(peerConnection, timeout) {\n const ELAPSED = 'elapsed';\n\n return new Promise((resolve) => {\n const peerConnectionProxy = new window.Proxy(peerConnection, {\n get(target, property) {\n const targetMember = target[property];\n\n if (typeof (targetMember) === 'function') {\n return targetMember.bind(target);\n }\n\n return targetMember;\n },\n set: (target, property, value) => {\n // only intercept elapsed property\n if (property === ELAPSED) {\n resolve({clusterId: peerConnection.key, elapsed: value});\n\n return true;\n }\n\n // pass thru\n return window.Reflect.set(target, property, value);\n }\n });\n\n // Using peerConnection proxy so handle functions below\n // won't be coupled to our promise implementation\n this.handleIceGatheringStateChange(peerConnectionProxy);\n this.handleOnIceCandidate(peerConnectionProxy);\n\n // Set maximum timeout\n window.setTimeout(() => {\n const {CLOSED} = CONNECTION_STATE;\n\n // Close any open peerConnections\n if (peerConnectionProxy.connectionState !== CLOSED) {\n this.setLatencyAndClose(peerConnectionProxy, null);\n }\n }, timeout);\n });\n }\n\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n logUnreachableClusters() {\n const list = this.getUnreachablClusters();\n\n list.forEach((cluster) => {\n LoggerProxy.logger.log(`Reachability:index#logUnreachableClusters --> No ice candidate for ${cluster}.`);\n });\n }\n\n\n /**\n * Calculates time to establish connection\n * @param {array} iceResults iceResults\n * @returns {object} reachabilityMap\n * @private\n * @memberof Reachability\n */\n parseIceResultsToReachabilityResults(iceResults) {\n const reachabilityMap = {};\n\n iceResults.forEach(({clusterId, elapsed}) => {\n let latencyResult;\n\n if (elapsed === null) {\n latencyResult = {reachable: 'false'};\n }\n else {\n latencyResult = {\n reachable: 'true',\n latencyInMilliseconds: (elapsed).toString()\n };\n }\n\n reachabilityMap[clusterId] = {\n udp: latencyResult,\n tcp: latencyResult\n };\n });\n\n return reachabilityMap;\n }\n\n\n /**\n * fetches reachability data\n * @param {object} clusterList\n * @returns {Promise<localSDPData>} reachability check results\n * @private\n * @memberof Reachability\n */\n performReachabilityCheck(clusterList) {\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve({});\n }\n\n return new Promise((resolve) => {\n this.getLocalSDPForClusters(clusterList)\n .then((localSDPData) => {\n if (!localSDPData || !Object.keys(localSDPData).length) {\n // TODO: handle the error condition properly and try retry\n LoggerProxy.logger.log('Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning');\n resolve({});\n }\n else {\n resolve(localSDPData);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`);\n resolve({});\n });\n });\n }\n\n\n /**\n * Records latency and closes the peerConnection\n * @param {RTCPeerConnection} peerConnection\n * @param {number} elapsed Latency in milliseconds\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n setLatencyAndClose(peerConnection, elapsed) {\n const REACHABLE = 'reachable';\n const UNREACHABLE = 'unreachable';\n const {CLOSED} = CONNECTION_STATE;\n const {key} = peerConnection;\n const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;\n const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};\n\n if (peerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(`Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`);\n\n return;\n }\n\n this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;\n this.clusterLatencyResults[key][resultKey] += 1;\n\n // Set to null in case this fired from\n // an event other than onIceCandidate\n peerConnection.onicecandidate = null;\n peerConnection.close();\n peerConnection.elapsed = elapsed;\n }\n\n\n /**\n * utility function\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n setup() {\n this.clusterLatencyResults = {};\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","Reachability","webex","reachabilityRequest","ReachabilityRequest","clusterLatencyResults","setup","window","localStorage","removeItem","REACHABILITY","LoggerProxy","logger","error","getClusters","clusters","performReachabilityCheck","results","setItem","log","reachable","reachabilityData","getItem","reachabilityResults","JSON","parse","some","result","udp","tcp","e","cluster","iceServers","map","url","username","credential","urls","iceCandidatePoolSize","iceTransportPolicy","key","config","peerConnection","RTCPeerConnection","peerConnectionError","startTime","begin","clusterList","buildPeerConnectionConfig","createPeerConnection","createOffer","offerToReceiveAudio","description","setLocalDescription","iceGatheringState","isVideoMesh","catch","iceGatheringStateError","all","then","parseIceResultsToReachabilityResults","reachabilityLatencyResults","logUnreachableClusters","unreachableList","forEach","unreachable","push","onicegatheringstatechange","COMPLETE","ICE_GATHERING_STATE","iceConnectionState","elapsed","getElapsedTime","setLatencyAndClose","onicecandidate","SERVER_REFLEXIVE","candidate","String","type","toLowerCase","timeout","ELAPSED","resolve","peerConnectionProxy","Proxy","get","target","property","targetMember","bind","set","value","clusterId","Reflect","handleIceGatheringStateChange","handleOnIceCandidate","setTimeout","CLOSED","CONNECTION_STATE","connectionState","list","getUnreachablClusters","iceResults","reachabilityMap","latencyResult","latencyInMilliseconds","toString","length","getLocalSDPForClusters","localSDPData","REACHABLE","UNREACHABLE","resultKey","intialState","close"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\n/* globals window */\nimport _ from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ICE_GATHERING_STATE,\n CONNECTION_STATE,\n REACHABILITY\n} from '../constants';\n\nimport ReachabilityRequest from './request';\n\nconst DEFAULT_TIMEOUT = 3000;\nconst VIDEO_MESH_TIMEOUT = 1000;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n webex: object;\n reachabilityRequest: any;\n clusterLatencyResults: any;\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n /**\n * internal object of clusters latency results\n * @instance\n * @type {object}\n * @private\n * @memberof Reachability\n */\n this.clusterLatencyResults = {};\n }\n\n\n /**\n * fetches reachability data\n * @returns {Object} reachability data\n * @public\n * @async\n * @memberof Reachability\n */\n public async gatherReachability() {\n this.setup();\n\n // Remove stored reachability results to ensure no stale data\n if (window?.localStorage?.removeItem) {\n window.localStorage.removeItem(REACHABILITY.localStorage);\n }\n else {\n LoggerProxy.logger.error('Reachability:index#gatherReachability --> Error in accessing LocalStorage.');\n\n return {};\n }\n\n // Fetch clusters and measure latency\n try {\n const clusters = await this.reachabilityRequest.getClusters();\n\n // Perform Reachability Check\n const results = await this.performReachabilityCheck(clusters);\n\n window.localStorage.setItem(REACHABILITY.localStorage, JSON.stringify(results));\n\n LoggerProxy.logger.log('Reachability:index#gatherReachability --> Reachability checks completed');\n\n return results;\n }\n catch (getClusterError) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`);\n\n return {};\n }\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n isAnyClusterReachable() {\n let reachable = false;\n const reachabilityData = window.localStorage.getItem(REACHABILITY.localStorage);\n\n if (reachabilityData) {\n try {\n const reachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some((result: any) => result.udp?.reachable === 'true' || result.tcp?.reachable === 'true');\n }\n catch (e) {\n LoggerProxy.logger.error(`Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`);\n }\n }\n\n return reachable;\n }\n\n\n /**\n * Generate peerConnection config settings\n * @param {object} cluster\n * @returns {object} peerConnectionConfig\n * @private\n * @memberof Reachability\n */\n private buildPeerConnectionConfig(cluster: any) {\n const iceServers = _.uniq([\n ...cluster.udp,\n ...cluster.tcp\n ]).map((url) => ({\n username: '',\n credential: '',\n urls: [url]\n }));\n\n return {\n iceServers: [\n ...iceServers\n ],\n iceCandidatePoolSize: '0',\n iceTransportPolicy: 'all'\n };\n }\n\n\n /**\n * Creates an RTCPeerConnection\n * @param {object} cluster\n * @returns {RTCPeerConnection} peerConnection\n * @private\n * @memberof Reachability\n */\n private createPeerConnection(cluster: any) {\n const {key, config} = cluster;\n\n try {\n const peerConnection = new window.RTCPeerConnection(config);\n\n // @ts-ignore\n peerConnection.key = key;\n\n return peerConnection;\n }\n catch (peerConnectionError) {\n LoggerProxy.logger.log(`Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`);\n\n return null;\n }\n }\n\n\n /**\n * Gets total elapsed time\n * @param {RTCPeerConnection} peerConnection\n * @returns {Number} Milliseconds\n * @private\n * @memberof Reachability\n */\n private getElapsedTime(peerConnection: any) {\n const startTime = peerConnection.begin;\n\n delete peerConnection.begin;\n\n return Date.now() - startTime;\n }\n\n\n /**\n * creates offer and generates localSDP\n * @param {object} clusterList cluster List\n * @returns {Promise} Reachability latency results\n * @private\n * @memberof Reachability\n */\n private getLocalSDPForClusters(clusterList: object) {\n let clusters: any[] = [...Object.keys(clusterList)];\n\n clusters = clusters.map(async (key) => {\n const cluster = clusterList[key];\n const config = this.buildPeerConnectionConfig(cluster);\n const peerConnection = this.createPeerConnection({key, config});\n const description = await peerConnection.createOffer({offerToReceiveAudio: true});\n\n // @ts-ignore\n peerConnection.begin = Date.now();\n peerConnection.setLocalDescription(description);\n\n return this.iceGatheringState(peerConnection, cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT)\n .catch((iceGatheringStateError) => {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`);\n });\n });\n\n return Promise.all(clusters)\n .then(this.parseIceResultsToReachabilityResults)\n .then((reachabilityLatencyResults) => {\n this.logUnreachableClusters();\n\n // return results\n return reachabilityLatencyResults;\n });\n }\n\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachablClusters() {\n const unreachableList = [];\n const clusters = this.clusterLatencyResults;\n\n Object.keys(clusters).forEach((key) => {\n const cluster = clusters[key];\n\n if (cluster.unreachable && !cluster.reachable) {\n unreachableList.push(key);\n }\n });\n\n return unreachableList;\n }\n\n\n /**\n * Attach an event handler for the icegatheringstatechange\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private handleIceGatheringStateChange(peerConnection: RTCPeerConnection) {\n peerConnection.onicegatheringstatechange = () => {\n const {COMPLETE} = ICE_GATHERING_STATE;\n\n if (peerConnection.iceConnectionState === COMPLETE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n // @ts-ignore\n LoggerProxy.logger.log(`Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n\n /**\n * Attach an event handler for the icecandidate\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private handleOnIceCandidate(peerConnection: RTCPeerConnection) {\n peerConnection.onicecandidate = (e) => {\n const SERVER_REFLEXIVE = 'srflx';\n\n if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n // @ts-ignore\n LoggerProxy.logger.log(`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n /**\n * An event handler on an RTCPeerConnection when the state of the ICE\n * candidate gathering process changes. Used to measure connection\n * speed.\n * @private\n * @param {RTCPeerConnection} peerConnection\n * @param {number} timeout\n * @returns {Promise}\n */\n private iceGatheringState(peerConnection: RTCPeerConnection, timeout: number) {\n const ELAPSED = 'elapsed';\n\n return new Promise((resolve) => {\n const peerConnectionProxy = new window.Proxy(peerConnection, {\n get(target, property) {\n const targetMember = target[property];\n\n if (typeof (targetMember) === 'function') {\n return targetMember.bind(target);\n }\n\n return targetMember;\n },\n set: (target, property, value) => {\n // only intercept elapsed property\n if (property === ELAPSED) {\n // @ts-ignore\n resolve({clusterId: peerConnection.key, elapsed: value});\n\n return true;\n }\n\n // pass thru\n return window.Reflect.set(target, property, value);\n }\n });\n\n // Using peerConnection proxy so handle functions below\n // won't be coupled to our promise implementation\n this.handleIceGatheringStateChange(peerConnectionProxy);\n this.handleOnIceCandidate(peerConnectionProxy);\n\n // Set maximum timeout\n window.setTimeout(() => {\n const {CLOSED} = CONNECTION_STATE;\n\n // Close any open peerConnections\n if (peerConnectionProxy.connectionState !== CLOSED) {\n this.setLatencyAndClose(peerConnectionProxy, null);\n }\n }, timeout);\n });\n }\n\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachablClusters();\n\n list.forEach((cluster) => {\n LoggerProxy.logger.log(`Reachability:index#logUnreachableClusters --> No ice candidate for ${cluster}.`);\n });\n }\n\n\n /**\n * Calculates time to establish connection\n * @param {array} iceResults iceResults\n * @returns {object} reachabilityMap\n * @private\n * @memberof Reachability\n */\n private parseIceResultsToReachabilityResults(iceResults: Array<any>) {\n const reachabilityMap = {};\n\n iceResults.forEach(({clusterId, elapsed}) => {\n let latencyResult;\n\n if (elapsed === null) {\n latencyResult = {reachable: 'false'};\n }\n else {\n latencyResult = {\n reachable: 'true',\n latencyInMilliseconds: (elapsed).toString()\n };\n }\n\n reachabilityMap[clusterId] = {\n udp: latencyResult,\n tcp: latencyResult\n };\n });\n\n return reachabilityMap;\n }\n\n\n /**\n * fetches reachability data\n * @param {object} clusterList\n * @returns {Promise<localSDPData>} reachability check results\n * @private\n * @memberof Reachability\n */\n private performReachabilityCheck(clusterList: object) {\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve({});\n }\n\n return new Promise((resolve) => {\n this.getLocalSDPForClusters(clusterList)\n .then((localSDPData) => {\n if (!localSDPData || !Object.keys(localSDPData).length) {\n // TODO: handle the error condition properly and try retry\n LoggerProxy.logger.log('Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning');\n resolve({});\n }\n else {\n resolve(localSDPData);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`);\n resolve({});\n });\n });\n }\n\n\n /**\n * Records latency and closes the peerConnection\n * @param {RTCPeerConnection} peerConnection\n * @param {number} elapsed Latency in milliseconds\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private setLatencyAndClose(peerConnection: RTCPeerConnection, elapsed: number) {\n const REACHABLE = 'reachable';\n const UNREACHABLE = 'unreachable';\n const {CLOSED} = CONNECTION_STATE;\n // @ts-ignore\n const {key} = peerConnection;\n const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;\n const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};\n\n if (peerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(`Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`);\n\n return;\n }\n\n this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;\n this.clusterLatencyResults[key][resultKey] += 1;\n\n // Set to null in case this fired from\n // an event other than onIceCandidate\n peerConnection.onicecandidate = null;\n peerConnection.close();\n // @ts-ignore\n peerConnection.elapsed = elapsed;\n }\n\n\n /**\n * utility function\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private setup() {\n this.clusterLatencyResults = {};\n }\n}\n"],"mappings":"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"}
|
|
@@ -37,6 +37,7 @@ function ReachabilityRequest(webex) {
|
|
|
37
37
|
var _this = this;
|
|
38
38
|
|
|
39
39
|
(0, _classCallCheck2.default)(this, ReachabilityRequest);
|
|
40
|
+
(0, _defineProperty2.default)(this, "webex", void 0);
|
|
40
41
|
(0, _defineProperty2.default)(this, "getClusters", function () {
|
|
41
42
|
return _this.webex.request({
|
|
42
43
|
method: _constants.HTTP_VERBS.GET,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ReachabilityRequest","webex","request","method","HTTP_VERBS","GET","shouldRefreshAccessToken","api","API","CALLIOPEDISCOVERY","resource","RESOURCE","CLUSTERS","then","res","clusters","body","forEach","key","isVideoMesh","clusterClasses","hybridMedia","includes","LoggerProxy","logger","log","localSDPList","POST","REACHABILITY","offers"],"sources":["request.ts"],"sourcesContent":["import LoggerProxy from '../common/logs/logger-proxy';\nimport {\n HTTP_VERBS,\n RESOURCE,\n API\n} from '../constants';\n\nexport interface ClusterNode {\n isVideoMesh: boolean;\n udp: Array<string>;\n tcp: Array<string>;\n xtls: Array<string>;\n}\n\nexport type ClusterList = {\n [key:string]: ClusterNode;\n}\n\n/**\n * @class ReachabilityRequest\n */\nclass ReachabilityRequest {\n /**\n * Creates an instance of ReachabilityRequest.\n * @param {object} webex\n * @memberof ReachabilityRequest\n */\n constructor(webex) {\n this.webex = webex;\n }\n\n /**\n * gets the cluster information\n *\n * @param {boolean} includeVideoMesh whether to include the video mesh clusters in the result or not\n * @returns {Promise}\n */\n getClusters = (): Promise<ClusterList> => this.webex.request({\n method: HTTP_VERBS.GET,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.CLUSTERS\n })\n .then((res) => {\n const {clusters} = res.body;\n\n Object.keys(clusters).forEach((key) => {\n clusters[key].isVideoMesh = res.body.clusterClasses?.hybridMedia?.includes(key);\n });\n\n LoggerProxy.logger.log(`Reachability:request#getClusters --> get clusters successful:${JSON.stringify(clusters)}`);\n\n return clusters;\n });\n\n /**\n * gets remote SDP For Clusters\n * @param {Object} localSDPList localSDPs for the cluster\n * @returns {Object}\n */\n remoteSDPForClusters = (localSDPList) => this.webex.request({\n method: HTTP_VERBS.POST,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.REACHABILITY,\n body: {offers: localSDPList}\n })\n .then((res) => {\n LoggerProxy.logger.log('Reachability:request#remoteSDPForClusters --> Remote SDPs got succcessfully');\n\n return res.body;\n });\n}\n\nexport default ReachabilityRequest;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAiBA;AACA;AACA;IACMA,mB;
|
|
1
|
+
{"version":3,"names":["ReachabilityRequest","webex","request","method","HTTP_VERBS","GET","shouldRefreshAccessToken","api","API","CALLIOPEDISCOVERY","resource","RESOURCE","CLUSTERS","then","res","clusters","body","forEach","key","isVideoMesh","clusterClasses","hybridMedia","includes","LoggerProxy","logger","log","localSDPList","POST","REACHABILITY","offers"],"sources":["request.ts"],"sourcesContent":["import LoggerProxy from '../common/logs/logger-proxy';\nimport {\n HTTP_VERBS,\n RESOURCE,\n API\n} from '../constants';\n\nexport interface ClusterNode {\n isVideoMesh: boolean;\n udp: Array<string>;\n tcp: Array<string>;\n xtls: Array<string>;\n}\n\nexport type ClusterList = {\n [key:string]: ClusterNode;\n}\n\n/**\n * @class ReachabilityRequest\n */\nclass ReachabilityRequest {\n webex: any;\n\n /**\n * Creates an instance of ReachabilityRequest.\n * @param {object} webex\n * @memberof ReachabilityRequest\n */\n constructor(webex: object) {\n this.webex = webex;\n }\n\n /**\n * gets the cluster information\n *\n * @param {boolean} includeVideoMesh whether to include the video mesh clusters in the result or not\n * @returns {Promise}\n */\n getClusters = (): Promise<ClusterList> => this.webex.request({\n method: HTTP_VERBS.GET,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.CLUSTERS\n })\n .then((res) => {\n const {clusters} = res.body;\n\n Object.keys(clusters).forEach((key) => {\n clusters[key].isVideoMesh = res.body.clusterClasses?.hybridMedia?.includes(key);\n });\n\n LoggerProxy.logger.log(`Reachability:request#getClusters --> get clusters successful:${JSON.stringify(clusters)}`);\n\n return clusters;\n });\n\n /**\n * gets remote SDP For Clusters\n * @param {Object} localSDPList localSDPs for the cluster\n * @returns {Object}\n */\n remoteSDPForClusters = (localSDPList: object) => this.webex.request({\n method: HTTP_VERBS.POST,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.REACHABILITY,\n body: {offers: localSDPList}\n })\n .then((res) => {\n LoggerProxy.logger.log('Reachability:request#remoteSDPForClusters --> Remote SDPs got succcessfully');\n\n return res.body;\n });\n}\n\nexport default ReachabilityRequest;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAiBA;AACA;AACA;IACMA,mB;AAGJ;AACF;AACA;AACA;AACA;AACE,6BAAYC,KAAZ,EAA2B;EAAA;;EAAA;EAAA;EAAA,mDAUb;IAAA,OAA4B,KAAI,CAACA,KAAL,CAAWC,OAAX,CAAmB;MAC3DC,MAAM,EAAEC,qBAAA,CAAWC,GADwC;MAE3DC,wBAAwB,EAAE,KAFiC;MAG3DC,GAAG,EAAEC,cAAA,CAAIC,iBAHkD;MAI3DC,QAAQ,EAAEC,mBAAA,CAASC;IAJwC,CAAnB,EAMvCC,IANuC,CAMlC,UAACC,GAAD,EAAS;MACb,IAAOC,QAAP,GAAmBD,GAAG,CAACE,IAAvB,CAAOD,QAAP;MAEA,mBAAYA,QAAZ,EAAsBE,OAAtB,CAA8B,UAACC,GAAD,EAAS;QAAA;;QACrCH,QAAQ,CAACG,GAAD,CAAR,CAAcC,WAAd,4BAA4BL,GAAG,CAACE,IAAJ,CAASI,cAArC,oFAA4B,sBAAyBC,WAArD,2DAA4B,uBAAsCC,QAAtC,CAA+CJ,GAA/C,CAA5B;MACD,CAFD;;MAIAK,oBAAA,CAAYC,MAAZ,CAAmBC,GAAnB,wEAAuF,wBAAeV,QAAf,CAAvF;;MAEA,OAAOA,QAAP;IACD,CAhBuC,CAA5B;EAAA,CAVa;EAAA,4DAiCJ,UAACW,YAAD;IAAA,OAA0B,KAAI,CAACzB,KAAL,CAAWC,OAAX,CAAmB;MAClEC,MAAM,EAAEC,qBAAA,CAAWuB,IAD+C;MAElErB,wBAAwB,EAAE,KAFwC;MAGlEC,GAAG,EAAEC,cAAA,CAAIC,iBAHyD;MAIlEC,QAAQ,EAAEC,mBAAA,CAASiB,YAJ+C;MAKlEZ,IAAI,EAAE;QAACa,MAAM,EAAEH;MAAT;IAL4D,CAAnB,EAO9Cb,IAP8C,CAOzC,UAACC,GAAD,EAAS;MACbS,oBAAA,CAAYC,MAAZ,CAAmBC,GAAnB,CAAuB,6EAAvB;;MAEA,OAAOX,GAAG,CAACE,IAAX;IACD,CAX8C,CAA1B;EAAA,CAjCI;EACzB,KAAKf,KAAL,GAAaA,KAAb;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;eAsCeD,mB"}
|