@epicgames-ps/lib-pixelstreamingfrontend-ue5.5 0.1.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +1 -1
- package/.prettierrc.json +1 -0
- package/dist/commonjs/AFK/AFKController.js +110 -0
- package/dist/commonjs/AFK/AFKController.js.map +1 -0
- package/dist/commonjs/Config/Config.js +560 -0
- package/dist/commonjs/Config/Config.js.map +1 -0
- package/dist/commonjs/Config/SettingBase.js +99 -0
- package/dist/commonjs/Config/SettingBase.js.map +1 -0
- package/dist/commonjs/Config/SettingFlag.js +50 -0
- package/dist/commonjs/Config/SettingFlag.js.map +1 -0
- package/dist/commonjs/Config/SettingNumber.js +84 -0
- package/dist/commonjs/Config/SettingNumber.js.map +1 -0
- package/dist/commonjs/Config/SettingOption.js +85 -0
- package/dist/commonjs/Config/SettingOption.js.map +1 -0
- package/dist/commonjs/Config/SettingText.js +43 -0
- package/dist/commonjs/Config/SettingText.js.map +1 -0
- package/dist/commonjs/DataChannel/DataChannelController.js +107 -0
- package/dist/commonjs/DataChannel/DataChannelController.js.map +1 -0
- package/dist/commonjs/DataChannel/DataChannelLatencyTestController.js +95 -0
- package/dist/commonjs/DataChannel/DataChannelLatencyTestController.js.map +1 -0
- package/dist/commonjs/DataChannel/DataChannelLatencyTestResults.js +19 -0
- package/dist/commonjs/DataChannel/DataChannelLatencyTestResults.js.map +1 -0
- package/dist/commonjs/DataChannel/DataChannelSender.js +44 -0
- package/dist/commonjs/DataChannel/DataChannelSender.js.map +1 -0
- package/dist/commonjs/DataChannel/InitialSettings.js +42 -0
- package/dist/commonjs/DataChannel/InitialSettings.js.map +1 -0
- package/dist/commonjs/DataChannel/LatencyTestResults.js +61 -0
- package/dist/commonjs/DataChannel/LatencyTestResults.js.map +1 -0
- package/dist/commonjs/FreezeFrame/FreezeFrame.js +94 -0
- package/dist/commonjs/FreezeFrame/FreezeFrame.js.map +1 -0
- package/dist/commonjs/FreezeFrame/FreezeFrameController.js +96 -0
- package/dist/commonjs/FreezeFrame/FreezeFrameController.js.map +1 -0
- package/dist/commonjs/Inputs/GamepadController.js +189 -0
- package/dist/commonjs/Inputs/GamepadController.js.map +1 -0
- package/dist/commonjs/Inputs/GamepadTypes.js +22 -0
- package/dist/commonjs/Inputs/GamepadTypes.js.map +1 -0
- package/dist/commonjs/Inputs/IInputController.js +3 -0
- package/dist/commonjs/Inputs/IInputController.js.map +1 -0
- package/dist/commonjs/Inputs/InputClassesFactory.js +97 -0
- package/dist/commonjs/Inputs/InputClassesFactory.js.map +1 -0
- package/dist/commonjs/Inputs/KeyCodes.js +113 -0
- package/dist/commonjs/Inputs/KeyCodes.js.map +1 -0
- package/dist/commonjs/Inputs/KeyboardController.js +138 -0
- package/dist/commonjs/Inputs/KeyboardController.js.map +1 -0
- package/dist/commonjs/Inputs/MouseButtons.js +29 -0
- package/dist/commonjs/Inputs/MouseButtons.js.map +1 -0
- package/dist/commonjs/Inputs/MouseController.js +98 -0
- package/dist/commonjs/Inputs/MouseController.js.map +1 -0
- package/dist/commonjs/Inputs/MouseControllerHovering.js +94 -0
- package/dist/commonjs/Inputs/MouseControllerHovering.js.map +1 -0
- package/dist/commonjs/Inputs/MouseControllerLocked.js +154 -0
- package/dist/commonjs/Inputs/MouseControllerLocked.js.map +1 -0
- package/dist/commonjs/Inputs/SpecialKeyCodes.js +20 -0
- package/dist/commonjs/Inputs/SpecialKeyCodes.js.map +1 -0
- package/dist/commonjs/Inputs/TouchController.js +124 -0
- package/dist/commonjs/Inputs/TouchController.js.map +1 -0
- package/dist/commonjs/Inputs/TouchControllerFake.js +92 -0
- package/dist/commonjs/Inputs/TouchControllerFake.js.map +1 -0
- package/dist/commonjs/Inputs/XRGamepadController.js +125 -0
- package/dist/commonjs/Inputs/XRGamepadController.js.map +1 -0
- package/dist/commonjs/PeerConnectionController/AggregatedStats.js +253 -0
- package/dist/commonjs/PeerConnectionController/AggregatedStats.js.map +1 -0
- package/dist/commonjs/PeerConnectionController/CandidatePairStats.js +11 -0
- package/dist/commonjs/PeerConnectionController/CandidatePairStats.js.map +1 -0
- package/dist/commonjs/PeerConnectionController/CandidateStat.js +11 -0
- package/dist/commonjs/PeerConnectionController/CandidateStat.js.map +1 -0
- package/dist/commonjs/PeerConnectionController/CodecStats.js +11 -0
- package/dist/commonjs/PeerConnectionController/CodecStats.js.map +1 -0
- package/dist/commonjs/PeerConnectionController/DataChannelStats.js +11 -0
- package/dist/commonjs/PeerConnectionController/DataChannelStats.js.map +1 -0
- package/dist/commonjs/PeerConnectionController/InboundRTPStats.js +23 -0
- package/dist/commonjs/PeerConnectionController/InboundRTPStats.js.map +1 -0
- package/dist/commonjs/PeerConnectionController/InboundTrackStats.js +11 -0
- package/dist/commonjs/PeerConnectionController/InboundTrackStats.js.map +1 -0
- package/dist/commonjs/PeerConnectionController/OutBoundRTPStats.js +17 -0
- package/dist/commonjs/PeerConnectionController/OutBoundRTPStats.js.map +1 -0
- package/dist/commonjs/PeerConnectionController/PeerConnectionController.js +585 -0
- package/dist/commonjs/PeerConnectionController/PeerConnectionController.js.map +1 -0
- package/dist/commonjs/PeerConnectionController/SessionStats.js +11 -0
- package/dist/commonjs/PeerConnectionController/SessionStats.js.map +1 -0
- package/dist/commonjs/PeerConnectionController/StreamStats.js +11 -0
- package/dist/commonjs/PeerConnectionController/StreamStats.js.map +1 -0
- package/dist/commonjs/PixelStreaming/PixelStreaming.js +608 -0
- package/dist/commonjs/PixelStreaming/PixelStreaming.js.map +1 -0
- package/dist/commonjs/UI/OnScreenKeyboard.js +83 -0
- package/dist/commonjs/UI/OnScreenKeyboard.js.map +1 -0
- package/dist/commonjs/UeInstanceMessage/ResponseController.js +39 -0
- package/dist/commonjs/UeInstanceMessage/ResponseController.js.map +1 -0
- package/dist/commonjs/UeInstanceMessage/SendMessageController.js +121 -0
- package/dist/commonjs/UeInstanceMessage/SendMessageController.js.map +1 -0
- package/dist/commonjs/UeInstanceMessage/StreamMessageController.js +211 -0
- package/dist/commonjs/UeInstanceMessage/StreamMessageController.js.map +1 -0
- package/dist/commonjs/UeInstanceMessage/ToStreamerMessagesController.js +50 -0
- package/dist/commonjs/UeInstanceMessage/ToStreamerMessagesController.js.map +1 -0
- package/dist/commonjs/Util/EventEmitter.js +387 -0
- package/dist/commonjs/Util/EventEmitter.js.map +1 -0
- package/dist/commonjs/Util/FileUtil.js +109 -0
- package/dist/commonjs/Util/FileUtil.js.map +1 -0
- package/dist/commonjs/Util/IURLSearchParams.js +26 -0
- package/dist/commonjs/Util/IURLSearchParams.js.map +1 -0
- package/dist/commonjs/Util/InputCoordTranslator.js +50 -0
- package/dist/commonjs/Util/InputCoordTranslator.js.map +1 -0
- package/dist/commonjs/Util/RTCUtils.js +41 -0
- package/dist/commonjs/Util/RTCUtils.js.map +1 -0
- package/dist/commonjs/VideoPlayer/StreamController.js +68 -0
- package/dist/commonjs/VideoPlayer/StreamController.js.map +1 -0
- package/dist/commonjs/VideoPlayer/VideoPlayer.js +178 -0
- package/dist/commonjs/VideoPlayer/VideoPlayer.js.map +1 -0
- package/dist/commonjs/WebRtcPlayer/WebRtcPlayerController.js +1224 -0
- package/dist/commonjs/WebRtcPlayer/WebRtcPlayerController.js.map +1 -0
- package/dist/commonjs/WebXR/WebXRController.js +361 -0
- package/dist/commonjs/WebXR/WebXRController.js.map +1 -0
- package/dist/commonjs/pixelstreamingfrontend.js +71 -0
- package/dist/commonjs/pixelstreamingfrontend.js.map +1 -0
- package/dist/esm/AFK/AFKController.js +106 -0
- package/dist/esm/AFK/AFKController.js.map +1 -0
- package/dist/esm/Config/Config.js +552 -0
- package/dist/esm/Config/Config.js.map +1 -0
- package/dist/esm/Config/SettingBase.js +95 -0
- package/dist/esm/Config/SettingBase.js.map +1 -0
- package/dist/esm/Config/SettingFlag.js +46 -0
- package/dist/esm/Config/SettingFlag.js.map +1 -0
- package/dist/esm/Config/SettingNumber.js +80 -0
- package/dist/esm/Config/SettingNumber.js.map +1 -0
- package/dist/esm/Config/SettingOption.js +81 -0
- package/dist/esm/Config/SettingOption.js.map +1 -0
- package/dist/esm/Config/SettingText.js +39 -0
- package/dist/esm/Config/SettingText.js.map +1 -0
- package/dist/esm/DataChannel/DataChannelController.js +103 -0
- package/dist/esm/DataChannel/DataChannelController.js.map +1 -0
- package/dist/esm/DataChannel/DataChannelLatencyTestController.js +91 -0
- package/dist/esm/DataChannel/DataChannelLatencyTestController.js.map +1 -0
- package/dist/esm/DataChannel/DataChannelLatencyTestResults.js +15 -0
- package/dist/esm/DataChannel/DataChannelLatencyTestResults.js.map +1 -0
- package/dist/esm/DataChannel/DataChannelSender.js +40 -0
- package/dist/esm/DataChannel/DataChannelSender.js.map +1 -0
- package/dist/esm/DataChannel/InitialSettings.js +35 -0
- package/dist/esm/DataChannel/InitialSettings.js.map +1 -0
- package/dist/esm/DataChannel/LatencyTestResults.js +57 -0
- package/dist/esm/DataChannel/LatencyTestResults.js.map +1 -0
- package/dist/esm/FreezeFrame/FreezeFrame.js +90 -0
- package/dist/esm/FreezeFrame/FreezeFrame.js.map +1 -0
- package/dist/esm/FreezeFrame/FreezeFrameController.js +92 -0
- package/dist/esm/FreezeFrame/FreezeFrameController.js.map +1 -0
- package/dist/esm/Inputs/GamepadController.js +185 -0
- package/dist/esm/Inputs/GamepadController.js.map +1 -0
- package/dist/esm/Inputs/GamepadTypes.js +18 -0
- package/dist/esm/Inputs/GamepadTypes.js.map +1 -0
- package/dist/esm/Inputs/IInputController.js +2 -0
- package/dist/esm/Inputs/IInputController.js.map +1 -0
- package/dist/esm/Inputs/InputClassesFactory.js +92 -0
- package/dist/esm/Inputs/InputClassesFactory.js.map +1 -0
- package/dist/esm/Inputs/KeyCodes.js +110 -0
- package/dist/esm/Inputs/KeyCodes.js.map +1 -0
- package/dist/esm/Inputs/KeyboardController.js +134 -0
- package/dist/esm/Inputs/KeyboardController.js.map +1 -0
- package/dist/esm/Inputs/MouseButtons.js +24 -0
- package/dist/esm/Inputs/MouseButtons.js.map +1 -0
- package/dist/esm/Inputs/MouseController.js +94 -0
- package/dist/esm/Inputs/MouseController.js.map +1 -0
- package/dist/esm/Inputs/MouseControllerHovering.js +90 -0
- package/dist/esm/Inputs/MouseControllerHovering.js.map +1 -0
- package/dist/esm/Inputs/MouseControllerLocked.js +150 -0
- package/dist/esm/Inputs/MouseControllerLocked.js.map +1 -0
- package/dist/esm/Inputs/SpecialKeyCodes.js +16 -0
- package/dist/esm/Inputs/SpecialKeyCodes.js.map +1 -0
- package/dist/esm/Inputs/TouchController.js +120 -0
- package/dist/esm/Inputs/TouchController.js.map +1 -0
- package/dist/esm/Inputs/TouchControllerFake.js +88 -0
- package/dist/esm/Inputs/TouchControllerFake.js.map +1 -0
- package/dist/esm/Inputs/XRGamepadController.js +121 -0
- package/dist/esm/Inputs/XRGamepadController.js.map +1 -0
- package/dist/esm/PeerConnectionController/AggregatedStats.js +249 -0
- package/dist/esm/PeerConnectionController/AggregatedStats.js.map +1 -0
- package/dist/esm/PeerConnectionController/CandidatePairStats.js +7 -0
- package/dist/esm/PeerConnectionController/CandidatePairStats.js.map +1 -0
- package/dist/esm/PeerConnectionController/CandidateStat.js +7 -0
- package/dist/esm/PeerConnectionController/CandidateStat.js.map +1 -0
- package/dist/esm/PeerConnectionController/CodecStats.js +7 -0
- package/dist/esm/PeerConnectionController/CodecStats.js.map +1 -0
- package/dist/esm/PeerConnectionController/DataChannelStats.js +7 -0
- package/dist/esm/PeerConnectionController/DataChannelStats.js.map +1 -0
- package/dist/esm/PeerConnectionController/InboundRTPStats.js +17 -0
- package/dist/esm/PeerConnectionController/InboundRTPStats.js.map +1 -0
- package/dist/esm/PeerConnectionController/InboundTrackStats.js +7 -0
- package/dist/esm/PeerConnectionController/InboundTrackStats.js.map +1 -0
- package/dist/esm/PeerConnectionController/OutBoundRTPStats.js +12 -0
- package/dist/esm/PeerConnectionController/OutBoundRTPStats.js.map +1 -0
- package/dist/esm/PeerConnectionController/PeerConnectionController.js +581 -0
- package/dist/esm/PeerConnectionController/PeerConnectionController.js.map +1 -0
- package/dist/esm/PeerConnectionController/SessionStats.js +7 -0
- package/dist/esm/PeerConnectionController/SessionStats.js.map +1 -0
- package/dist/esm/PeerConnectionController/StreamStats.js +7 -0
- package/dist/esm/PeerConnectionController/StreamStats.js.map +1 -0
- package/dist/esm/PixelStreaming/PixelStreaming.js +604 -0
- package/dist/esm/PixelStreaming/PixelStreaming.js.map +1 -0
- package/dist/esm/UI/OnScreenKeyboard.js +79 -0
- package/dist/esm/UI/OnScreenKeyboard.js.map +1 -0
- package/dist/esm/UeInstanceMessage/ResponseController.js +35 -0
- package/dist/esm/UeInstanceMessage/ResponseController.js.map +1 -0
- package/dist/esm/UeInstanceMessage/SendMessageController.js +117 -0
- package/dist/esm/UeInstanceMessage/SendMessageController.js.map +1 -0
- package/dist/esm/UeInstanceMessage/StreamMessageController.js +206 -0
- package/dist/esm/UeInstanceMessage/StreamMessageController.js.map +1 -0
- package/dist/esm/UeInstanceMessage/ToStreamerMessagesController.js +46 -0
- package/dist/esm/UeInstanceMessage/ToStreamerMessagesController.js.map +1 -0
- package/dist/esm/Util/EventEmitter.js +346 -0
- package/dist/esm/Util/EventEmitter.js.map +1 -0
- package/dist/esm/Util/FileUtil.js +104 -0
- package/dist/esm/Util/FileUtil.js.map +1 -0
- package/dist/esm/Util/IURLSearchParams.js +22 -0
- package/dist/esm/Util/IURLSearchParams.js.map +1 -0
- package/dist/esm/Util/InputCoordTranslator.js +46 -0
- package/dist/esm/Util/InputCoordTranslator.js.map +1 -0
- package/dist/esm/Util/RTCUtils.js +37 -0
- package/dist/esm/Util/RTCUtils.js.map +1 -0
- package/dist/esm/VideoPlayer/StreamController.js +64 -0
- package/dist/esm/VideoPlayer/StreamController.js.map +1 -0
- package/dist/esm/VideoPlayer/VideoPlayer.js +174 -0
- package/dist/esm/VideoPlayer/VideoPlayer.js.map +1 -0
- package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js +1220 -0
- package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js.map +1 -0
- package/dist/esm/WebXR/WebXRController.js +357 -0
- package/dist/esm/WebXR/WebXRController.js.map +1 -0
- package/dist/esm/pixelstreamingfrontend.js +25 -0
- package/dist/esm/pixelstreamingfrontend.js.map +1 -0
- package/{types → dist/types}/AFK/AFKController.d.ts +38 -39
- package/{types → dist/types}/Config/Config.d.ts +220 -219
- package/{types → dist/types}/Config/SettingBase.d.ts +43 -30
- package/{types → dist/types}/Config/SettingFlag.d.ts +24 -33
- package/{types → dist/types}/Config/SettingNumber.d.ts +41 -45
- package/{types → dist/types}/Config/SettingOption.d.ts +41 -43
- package/{types → dist/types}/Config/SettingText.d.ts +21 -29
- package/{types → dist/types}/DataChannel/DataChannelController.d.ts +59 -59
- package/{types → dist/types}/DataChannel/DataChannelLatencyTestController.d.ts +25 -26
- package/{types → dist/types}/DataChannel/DataChannelLatencyTestResults.d.ts +46 -46
- package/{types → dist/types}/DataChannel/DataChannelSender.d.ts +21 -21
- package/{types → dist/types}/DataChannel/InitialSettings.d.ts +44 -44
- package/{types → dist/types}/DataChannel/LatencyTestResults.d.ts +31 -31
- package/{types → dist/types}/FreezeFrame/FreezeFrame.d.ts +36 -36
- package/{types → dist/types}/FreezeFrame/FreezeFrameController.d.ts +37 -37
- package/dist/types/Inputs/GamepadController.d.ts +61 -0
- package/dist/types/Inputs/GamepadTypes.d.ts +15 -0
- package/dist/types/Inputs/IInputController.d.ts +16 -0
- package/{types → dist/types}/Inputs/InputClassesFactory.d.ts +53 -54
- package/dist/types/Inputs/KeyCodes.d.ts +5 -0
- package/dist/types/Inputs/KeyboardController.d.ts +34 -0
- package/{types → dist/types}/Inputs/MouseButtons.d.ts +22 -22
- package/dist/types/Inputs/MouseController.d.ts +40 -0
- package/dist/types/Inputs/MouseControllerHovering.d.ts +26 -0
- package/dist/types/Inputs/MouseControllerLocked.d.ts +31 -0
- package/{types → dist/types}/Inputs/SpecialKeyCodes.d.ts +14 -14
- package/dist/types/Inputs/TouchController.d.ts +28 -0
- package/dist/types/Inputs/TouchControllerFake.d.ts +29 -0
- package/{types → dist/types}/Inputs/XRGamepadController.d.ts +15 -22
- package/{types → dist/types}/PeerConnectionController/AggregatedStats.d.ts +82 -84
- package/{types → dist/types}/PeerConnectionController/CandidatePairStats.d.ts +22 -22
- package/{types → dist/types}/PeerConnectionController/CandidateStat.d.ts +13 -13
- package/{types → dist/types}/PeerConnectionController/CodecStats.d.ts +14 -14
- package/{types → dist/types}/PeerConnectionController/DataChannelStats.d.ts +15 -15
- package/{types → dist/types}/PeerConnectionController/InboundRTPStats.d.ts +141 -141
- package/{types → dist/types}/PeerConnectionController/InboundTrackStats.d.ts +32 -32
- package/{types → dist/types}/PeerConnectionController/OutBoundRTPStats.d.ts +23 -23
- package/{types → dist/types}/PeerConnectionController/PeerConnectionController.d.ts +143 -140
- package/{types → dist/types}/PeerConnectionController/SessionStats.d.ts +8 -8
- package/{types → dist/types}/PeerConnectionController/StreamStats.d.ts +9 -9
- package/{types → dist/types}/PixelStreaming/PixelStreaming.d.ts +271 -259
- package/{types → dist/types}/UI/OnScreenKeyboard.d.ts +30 -30
- package/{types → dist/types}/UeInstanceMessage/ResponseController.d.ts +19 -19
- package/{types → dist/types}/UeInstanceMessage/SendMessageController.d.ts +18 -18
- package/{types → dist/types}/UeInstanceMessage/StreamMessageController.d.ts +29 -29
- package/{types → dist/types}/UeInstanceMessage/ToStreamerMessagesController.d.ts +32 -32
- package/{types → dist/types}/Util/EventEmitter.d.ts +429 -429
- package/{types → dist/types}/Util/FileUtil.d.ts +32 -32
- package/dist/types/Util/IURLSearchParams.d.ts +9 -0
- package/dist/types/Util/InputCoordTranslator.d.ts +29 -0
- package/{types → dist/types}/Util/RTCUtils.d.ts +8 -8
- package/{types → dist/types}/VideoPlayer/StreamController.d.ts +22 -24
- package/{types → dist/types}/VideoPlayer/VideoPlayer.d.ts +78 -78
- package/{types → dist/types}/WebRtcPlayer/WebRtcPlayerController.d.ts +379 -377
- package/{types → dist/types}/WebXR/WebXRController.d.ts +42 -42
- package/{types → dist/types}/pixelstreamingfrontend.d.ts +23 -22
- package/package.json +14 -17
- package/readme.md +9 -1
- package/src/AFK/AFKController.ts +10 -32
- package/src/Config/Config.ts +232 -205
- package/src/Config/SettingBase.ts +61 -2
- package/src/Config/SettingFlag.ts +10 -48
- package/src/Config/SettingNumber.ts +23 -33
- package/src/Config/SettingOption.ts +41 -56
- package/src/Config/SettingText.ts +9 -37
- package/src/DataChannel/DataChannelController.ts +6 -26
- package/src/DataChannel/DataChannelLatencyTestController.ts +43 -38
- package/src/DataChannel/DataChannelLatencyTestResults.ts +8 -10
- package/src/DataChannel/DataChannelSender.ts +5 -15
- package/src/DataChannel/LatencyTestResults.ts +5 -15
- package/src/FreezeFrame/FreezeFrame.ts +7 -19
- package/src/FreezeFrame/FreezeFrameController.ts +3 -14
- package/src/Inputs/GamepadController.ts +123 -221
- package/src/Inputs/GamepadTypes.ts +23 -0
- package/src/Inputs/IInputController.ts +17 -0
- package/src/Inputs/InputClassesFactory.ts +38 -45
- package/src/Inputs/KeyCodes.ts +114 -0
- package/src/Inputs/KeyboardController.ts +49 -232
- package/src/Inputs/MouseController.ts +71 -297
- package/src/Inputs/MouseControllerHovering.ts +118 -0
- package/src/Inputs/MouseControllerLocked.ts +194 -0
- package/src/Inputs/TouchController.ts +49 -105
- package/src/Inputs/TouchControllerFake.ts +132 -0
- package/src/Inputs/XRGamepadController.ts +35 -44
- package/src/PeerConnectionController/AggregatedStats.ts +46 -75
- package/src/PeerConnectionController/CandidatePairStats.ts +1 -1
- package/src/PeerConnectionController/CandidateStat.ts +1 -1
- package/src/PeerConnectionController/PeerConnectionController.ts +214 -170
- package/src/PixelStreaming/PixelStreaming.ts +174 -226
- package/src/UI/OnScreenKeyboard.ts +14 -9
- package/src/UeInstanceMessage/ResponseController.ts +6 -15
- package/src/UeInstanceMessage/SendMessageController.ts +16 -18
- package/src/UeInstanceMessage/StreamMessageController.ts +3 -12
- package/src/UeInstanceMessage/ToStreamerMessagesController.ts +3 -9
- package/src/Util/EventEmitter.ts +17 -22
- package/src/Util/FileUtil.ts +11 -34
- package/src/Util/IURLSearchParams.ts +25 -0
- package/src/Util/InputCoordTranslator.ts +73 -0
- package/src/Util/RTCUtils.ts +23 -15
- package/src/VideoPlayer/StreamController.ts +6 -23
- package/src/VideoPlayer/VideoPlayer.ts +9 -30
- package/src/WebRtcPlayer/WebRtcPlayerController.ts +328 -690
- package/src/WebXR/WebXRController.ts +82 -94
- package/src/pixelstreamingfrontend.ts +8 -6
- package/tsconfig.cjs.json +9 -0
- package/tsconfig.esm.json +7 -0
- package/tsconfig.json +4 -6
- package/dist/lib-pixelstreamingfrontend.esm.js +0 -1
- package/dist/lib-pixelstreamingfrontend.js +0 -1
- package/src/Inputs/FakeTouchController.ts +0 -199
- package/src/Inputs/HoveringMouseEvents.ts +0 -192
- package/src/Inputs/IMouseEvents.ts +0 -64
- package/src/Inputs/ITouchController.ts +0 -29
- package/src/Inputs/LockedMouseEvents.ts +0 -287
- package/src/Util/CoordinateConverter.ts +0 -290
- package/src/Util/EventListenerTracker.ts +0 -29
- package/types/Inputs/FakeTouchController.d.ts +0 -61
- package/types/Inputs/GamepadController.d.ts +0 -85
- package/types/Inputs/GamepadTypes.d.ts +0 -8
- package/types/Inputs/HoveringMouseEvents.d.ts +0 -56
- package/types/Inputs/IMouseEvents.d.ts +0 -53
- package/types/Inputs/ITouchController.d.ts +0 -24
- package/types/Inputs/KeyboardController.d.ts +0 -62
- package/types/Inputs/LockedMouseEvents.d.ts +0 -80
- package/types/Inputs/MouseController.d.ts +0 -75
- package/types/Inputs/TouchController.d.ts +0 -53
- package/types/Util/CoordinateConverter.d.ts +0 -100
- package/types/Util/EventListenerTracker.d.ts +0 -14
- package/webpack.common.js +0 -35
- package/webpack.dev.js +0 -35
- package/webpack.prod.js +0 -36
|
@@ -14,7 +14,6 @@ import { FreezeFrameController } from '../FreezeFrame/FreezeFrameController';
|
|
|
14
14
|
import { AFKController } from '../AFK/AFKController';
|
|
15
15
|
import { DataChannelController } from '../DataChannel/DataChannelController';
|
|
16
16
|
import { PeerConnectionController } from '../PeerConnectionController/PeerConnectionController';
|
|
17
|
-
import { KeyboardController } from '../Inputs/KeyboardController';
|
|
18
17
|
import { AggregatedStats } from '../PeerConnectionController/AggregatedStats';
|
|
19
18
|
import {
|
|
20
19
|
Config,
|
|
@@ -24,29 +23,18 @@ import {
|
|
|
24
23
|
OptionParameters,
|
|
25
24
|
NumericParameters
|
|
26
25
|
} from '../Config/Config';
|
|
27
|
-
import {
|
|
28
|
-
InitialSettings,
|
|
29
|
-
} from '../DataChannel/InitialSettings';
|
|
26
|
+
import { InitialSettings } from '../DataChannel/InitialSettings';
|
|
30
27
|
import { LatencyTestResults } from '../DataChannel/LatencyTestResults';
|
|
31
28
|
import { FileTemplate, FileUtil } from '../Util/FileUtil';
|
|
32
29
|
import { InputClassesFactory } from '../Inputs/InputClassesFactory';
|
|
33
30
|
import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
|
|
34
|
-
import {
|
|
35
|
-
StreamMessageController,
|
|
36
|
-
MessageDirection
|
|
37
|
-
} from '../UeInstanceMessage/StreamMessageController';
|
|
31
|
+
import { StreamMessageController, MessageDirection } from '../UeInstanceMessage/StreamMessageController';
|
|
38
32
|
import { ResponseController } from '../UeInstanceMessage/ResponseController';
|
|
39
33
|
import { SendMessageController } from '../UeInstanceMessage/SendMessageController';
|
|
40
34
|
import { ToStreamerMessagesController } from '../UeInstanceMessage/ToStreamerMessagesController';
|
|
41
|
-
import { MouseController } from '../Inputs/MouseController';
|
|
42
|
-
import { GamePadController } from '../Inputs/GamepadController';
|
|
43
35
|
import { DataChannelSender } from '../DataChannel/DataChannelSender';
|
|
44
|
-
import {
|
|
45
|
-
CoordinateConverter,
|
|
46
|
-
UnquantizedDenormalizedUnsignedCoord
|
|
47
|
-
} from '../Util/CoordinateConverter';
|
|
36
|
+
import { InputCoordTranslator, UntranslatedCoordUnsigned } from '../Util/InputCoordTranslator';
|
|
48
37
|
import { PixelStreaming } from '../PixelStreaming/PixelStreaming';
|
|
49
|
-
import { ITouchController } from '../Inputs/ITouchController';
|
|
50
38
|
import {
|
|
51
39
|
DataChannelCloseEvent,
|
|
52
40
|
DataChannelErrorEvent,
|
|
@@ -62,7 +50,11 @@ import {
|
|
|
62
50
|
import {
|
|
63
51
|
DataChannelLatencyTestRequest,
|
|
64
52
|
DataChannelLatencyTestResponse
|
|
65
|
-
} from
|
|
53
|
+
} from '../DataChannel/DataChannelLatencyTestResults';
|
|
54
|
+
import { IURLSearchParams } from '../Util/IURLSearchParams';
|
|
55
|
+
import { IInputController } from '../Inputs/IInputController';
|
|
56
|
+
import { GamepadController } from '../Inputs/GamepadController';
|
|
57
|
+
|
|
66
58
|
/**
|
|
67
59
|
* Entry point for the WebRTC Player
|
|
68
60
|
*/
|
|
@@ -85,17 +77,16 @@ export class WebRtcPlayerController {
|
|
|
85
77
|
freezeFrameController: FreezeFrameController;
|
|
86
78
|
shouldShowPlayOverlay = true;
|
|
87
79
|
afkController: AFKController;
|
|
88
|
-
videoElementParentClientRect: DOMRect;
|
|
89
80
|
latencyStartTime: number;
|
|
90
81
|
pixelStreaming: PixelStreaming;
|
|
91
82
|
streamMessageController: StreamMessageController;
|
|
92
83
|
sendMessageController: SendMessageController;
|
|
93
84
|
toStreamerMessagesController: ToStreamerMessagesController;
|
|
94
|
-
keyboardController:
|
|
95
|
-
mouseController:
|
|
96
|
-
touchController:
|
|
97
|
-
gamePadController:
|
|
98
|
-
coordinateConverter:
|
|
85
|
+
keyboardController: IInputController;
|
|
86
|
+
mouseController: IInputController;
|
|
87
|
+
touchController: IInputController;
|
|
88
|
+
gamePadController: GamepadController;
|
|
89
|
+
coordinateConverter: InputCoordTranslator;
|
|
99
90
|
isUsingSFU: boolean;
|
|
100
91
|
isQualityController: boolean;
|
|
101
92
|
statsTimerHandle: number;
|
|
@@ -104,9 +95,10 @@ export class WebRtcPlayerController {
|
|
|
104
95
|
peerConfig: RTCConfiguration;
|
|
105
96
|
videoAvgQp: number;
|
|
106
97
|
locallyClosed: boolean;
|
|
107
|
-
|
|
108
|
-
|
|
98
|
+
enableAutoReconnect: boolean;
|
|
99
|
+
forceReconnect: boolean;
|
|
109
100
|
reconnectAttempt: number;
|
|
101
|
+
isReconnecting: boolean;
|
|
110
102
|
disconnectMessage: string;
|
|
111
103
|
subscribedStream: string;
|
|
112
104
|
signallingUrlBuilder: () => string;
|
|
@@ -135,33 +127,22 @@ export class WebRtcPlayerController {
|
|
|
135
127
|
this.onAfkTriggered.bind(this)
|
|
136
128
|
);
|
|
137
129
|
this.afkController.onAFKTimedOutCallback = () => {
|
|
138
|
-
this.closeSignalingServer('You have been disconnected due to inactivity');
|
|
130
|
+
this.closeSignalingServer('You have been disconnected due to inactivity.', false);
|
|
139
131
|
};
|
|
140
132
|
|
|
141
|
-
this.freezeFrameController = new FreezeFrameController(
|
|
142
|
-
this.pixelStreaming.videoElementParent
|
|
143
|
-
);
|
|
133
|
+
this.freezeFrameController = new FreezeFrameController(this.pixelStreaming.videoElementParent);
|
|
144
134
|
|
|
145
|
-
this.videoPlayer = new VideoPlayer(
|
|
146
|
-
|
|
147
|
-
this.config
|
|
148
|
-
);
|
|
149
|
-
this.videoPlayer.onVideoInitialized = () =>
|
|
150
|
-
this.handleVideoInitialized();
|
|
135
|
+
this.videoPlayer = new VideoPlayer(this.pixelStreaming.videoElementParent, this.config);
|
|
136
|
+
this.videoPlayer.onVideoInitialized = () => this.handleVideoInitialized();
|
|
151
137
|
|
|
152
138
|
// When in match viewport resolution mode, when the browser viewport is resized we send a resize command back to UE.
|
|
153
|
-
this.videoPlayer.onMatchViewportResolutionCallback = (
|
|
154
|
-
width: number,
|
|
155
|
-
height: number
|
|
156
|
-
) => {
|
|
139
|
+
this.videoPlayer.onMatchViewportResolutionCallback = (width: number, height: number) => {
|
|
157
140
|
const descriptor = {
|
|
158
141
|
'Resolution.Width': width,
|
|
159
142
|
'Resolution.Height': height
|
|
160
143
|
};
|
|
161
144
|
|
|
162
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
163
|
-
'Command'
|
|
164
|
-
)([JSON.stringify(descriptor)]);
|
|
145
|
+
this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify(descriptor)]);
|
|
165
146
|
};
|
|
166
147
|
|
|
167
148
|
// Every time video player is resized in browser we need to reinitialize the mouse coordinate conversion and freeze frame sizing logic.
|
|
@@ -171,17 +152,13 @@ export class WebRtcPlayerController {
|
|
|
171
152
|
|
|
172
153
|
this.streamController = new StreamController(this.videoPlayer);
|
|
173
154
|
|
|
174
|
-
this.coordinateConverter = new
|
|
155
|
+
this.coordinateConverter = new InputCoordTranslator();
|
|
175
156
|
|
|
176
157
|
this.sendrecvDataChannelController = new DataChannelController();
|
|
177
158
|
this.recvDataChannelController = new DataChannelController();
|
|
178
|
-
this.registerDataChannelEventEmitters(
|
|
179
|
-
this.sendrecvDataChannelController
|
|
180
|
-
);
|
|
159
|
+
this.registerDataChannelEventEmitters(this.sendrecvDataChannelController);
|
|
181
160
|
this.registerDataChannelEventEmitters(this.recvDataChannelController);
|
|
182
|
-
this.dataChannelSender = new DataChannelSender(
|
|
183
|
-
this.sendrecvDataChannelController
|
|
184
|
-
);
|
|
161
|
+
this.dataChannelSender = new DataChannelSender(this.sendrecvDataChannelController);
|
|
185
162
|
this.dataChannelSender.resetAfkWarningTimerOnDataSend = () =>
|
|
186
163
|
this.afkController.resetAfkWarningTimer();
|
|
187
164
|
|
|
@@ -217,30 +194,35 @@ export class WebRtcPlayerController {
|
|
|
217
194
|
this.handleIceCandidate(iceCandidateMessage.candidate);
|
|
218
195
|
});
|
|
219
196
|
this.protocol.transport.addListener('open', () => {
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
const message = MessageHelpers.createMessage(Messages.listStreamers);
|
|
223
|
-
this.protocol.sendMessage(message);
|
|
224
|
-
}
|
|
197
|
+
const message = MessageHelpers.createMessage(Messages.listStreamers);
|
|
198
|
+
this.protocol.sendMessage(message);
|
|
225
199
|
this.reconnectAttempt = 0;
|
|
200
|
+
this.isReconnecting = false;
|
|
226
201
|
});
|
|
227
202
|
this.protocol.transport.addListener('error', () => {
|
|
228
203
|
// dont really need to do anything here since the close event should follow.
|
|
229
|
-
Logger.Error(
|
|
204
|
+
Logger.Error(`Got a transport error.`);
|
|
230
205
|
});
|
|
231
206
|
this.protocol.transport.addListener('close', (event: CloseEvent) => {
|
|
232
207
|
// when we refresh the page during a stream we get the going away code.
|
|
233
208
|
// in that case we don't want to reconnect since we're navigating away.
|
|
234
209
|
// https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code
|
|
235
|
-
// lists all the codes.
|
|
210
|
+
// lists all the codes.
|
|
236
211
|
const CODE_GOING_AWAY = 1001;
|
|
237
212
|
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
213
|
+
const maxReconnectAttempts = this.config.getNumericSettingValue(
|
|
214
|
+
NumericParameters.MaxReconnectAttempts
|
|
215
|
+
);
|
|
216
|
+
const attemptsLeft = this.reconnectAttempt < maxReconnectAttempts;
|
|
217
|
+
const reconnectEnabled =
|
|
218
|
+
this.forceReconnect || (this.enableAutoReconnect && maxReconnectAttempts > 0 && attemptsLeft);
|
|
219
|
+
const willTryReconnect = reconnectEnabled && event.code != CODE_GOING_AWAY;
|
|
220
|
+
const allowClickToReconnect = !willTryReconnect;
|
|
242
221
|
const disconnectMessage = this.disconnectMessage ? this.disconnectMessage : event.reason;
|
|
243
|
-
|
|
222
|
+
|
|
223
|
+
this.forceReconnect = false;
|
|
224
|
+
|
|
225
|
+
this.pixelStreaming._onDisconnect(disconnectMessage, allowClickToReconnect);
|
|
244
226
|
|
|
245
227
|
this.afkController.stopAfkWarningTimer();
|
|
246
228
|
|
|
@@ -261,9 +243,8 @@ export class WebRtcPlayerController {
|
|
|
261
243
|
if (willTryReconnect) {
|
|
262
244
|
// need a small delay here to prevent reconnect spamming
|
|
263
245
|
setTimeout(() => {
|
|
264
|
-
this.isReconnecting = true;
|
|
265
246
|
this.reconnectAttempt++;
|
|
266
|
-
this.
|
|
247
|
+
this.doReconnect(event.reason);
|
|
267
248
|
}, 2000);
|
|
268
249
|
}
|
|
269
250
|
});
|
|
@@ -273,9 +254,7 @@ export class WebRtcPlayerController {
|
|
|
273
254
|
this.dataChannelSender,
|
|
274
255
|
this.streamMessageController
|
|
275
256
|
);
|
|
276
|
-
this.toStreamerMessagesController = new ToStreamerMessagesController(
|
|
277
|
-
this.sendMessageController
|
|
278
|
-
);
|
|
257
|
+
this.toStreamerMessagesController = new ToStreamerMessagesController(this.sendMessageController);
|
|
279
258
|
this.registerMessageHandlers();
|
|
280
259
|
this.streamMessageController.populateDefaultProtocol();
|
|
281
260
|
|
|
@@ -288,48 +267,31 @@ export class WebRtcPlayerController {
|
|
|
288
267
|
this.isUsingSFU = false;
|
|
289
268
|
this.isQualityController = false;
|
|
290
269
|
this.preferredCodec = '';
|
|
291
|
-
this.
|
|
292
|
-
this.
|
|
270
|
+
this.enableAutoReconnect = true;
|
|
271
|
+
this.forceReconnect = false;
|
|
293
272
|
this.reconnectAttempt = 0;
|
|
273
|
+
this.isReconnecting = false;
|
|
294
274
|
|
|
295
|
-
this.config._addOnOptionSettingChangedListener(
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (streamerid === "") {
|
|
299
|
-
return;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// close the current peer connection and create a new one
|
|
303
|
-
this.peerConnectionController.peerConnection.close();
|
|
304
|
-
this.peerConnectionController.createPeerConnection(
|
|
305
|
-
this.peerConfig,
|
|
306
|
-
this.preferredCodec
|
|
307
|
-
);
|
|
308
|
-
this.subscribedStream = streamerid;
|
|
309
|
-
const message = MessageHelpers.createMessage(Messages.subscribe, { streamerId: streamerid });
|
|
310
|
-
this.protocol.sendMessage(message);
|
|
275
|
+
this.config._addOnOptionSettingChangedListener(OptionParameters.StreamerId, (streamerid) => {
|
|
276
|
+
if (streamerid === undefined || streamerid === '') {
|
|
277
|
+
return;
|
|
311
278
|
}
|
|
312
|
-
|
|
279
|
+
|
|
280
|
+
// close the current peer connection and create a new one
|
|
281
|
+
this.peerConnectionController.peerConnection.close();
|
|
282
|
+
this.peerConnectionController.createPeerConnection(this.peerConfig, this.preferredCodec);
|
|
283
|
+
this.subscribedStream = streamerid;
|
|
284
|
+
const message = MessageHelpers.createMessage(Messages.subscribe, { streamerId: streamerid });
|
|
285
|
+
this.protocol.sendMessage(message);
|
|
286
|
+
});
|
|
313
287
|
|
|
314
288
|
this.setVideoEncoderAvgQP(-1);
|
|
315
289
|
|
|
316
290
|
this.signallingUrlBuilder = () => {
|
|
317
|
-
|
|
318
|
-
TextParameters.SignallingServerUrl
|
|
319
|
-
);
|
|
320
|
-
|
|
321
|
-
// If we are connecting to the SFU add a special url parameter to the url
|
|
322
|
-
if (this.config.isFlagEnabled(Flags.BrowserSendOffer)) {
|
|
323
|
-
signallingServerUrl += '?' + Flags.BrowserSendOffer + '=true';
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// This code is no longer needed, but is a good example for how subsequent config flags can be appended
|
|
327
|
-
// if (this.config.isFlagEnabled(Flags.BrowserSendOffer)) {
|
|
328
|
-
// signallingServerUrl += (signallingServerUrl.includes('?') ? '&' : '?') + Flags.BrowserSendOffer + '=true';
|
|
329
|
-
// }
|
|
291
|
+
const signallingServerUrl = this.config.getTextSettingValue(TextParameters.SignallingServerUrl);
|
|
330
292
|
|
|
331
293
|
return signallingServerUrl;
|
|
332
|
-
}
|
|
294
|
+
};
|
|
333
295
|
}
|
|
334
296
|
|
|
335
297
|
/**
|
|
@@ -337,11 +299,8 @@ export class WebRtcPlayerController {
|
|
|
337
299
|
* @param x x axis coordinate
|
|
338
300
|
* @param y y axis coordinate
|
|
339
301
|
*/
|
|
340
|
-
requestUnquantizedAndDenormalizeUnsigned(
|
|
341
|
-
x
|
|
342
|
-
y: number
|
|
343
|
-
): UnquantizedDenormalizedUnsignedCoord {
|
|
344
|
-
return this.coordinateConverter.unquantizeAndDenormalizeUnsigned(x, y);
|
|
302
|
+
requestUnquantizedAndDenormalizeUnsigned(x: number, y: number): UntranslatedCoordUnsigned {
|
|
303
|
+
return this.coordinateConverter.untranslateUnsigned(x, y);
|
|
345
304
|
}
|
|
346
305
|
|
|
347
306
|
/**
|
|
@@ -350,16 +309,11 @@ export class WebRtcPlayerController {
|
|
|
350
309
|
*/
|
|
351
310
|
handleOnMessage(event: MessageEvent) {
|
|
352
311
|
const message = new Uint8Array(event.data);
|
|
353
|
-
Logger.
|
|
312
|
+
Logger.Info('Message incoming:' + message);
|
|
354
313
|
|
|
355
314
|
//try {
|
|
356
|
-
const messageType =
|
|
357
|
-
|
|
358
|
-
message[0]
|
|
359
|
-
);
|
|
360
|
-
this.streamMessageController.fromStreamerHandlers.get(messageType)(
|
|
361
|
-
event.data
|
|
362
|
-
);
|
|
315
|
+
const messageType = this.streamMessageController.fromStreamerMessages.get(message[0]);
|
|
316
|
+
this.streamMessageController.fromStreamerHandlers.get(messageType)(event.data);
|
|
363
317
|
//} catch (e) {
|
|
364
318
|
//Logger.Error(Logger.GetStackTrace(), `Custom data channel message with message type that is unknown to the Pixel Streaming protocol. Does your PixelStreamingProtocol need updating? The message type was: ${message[0]}`);
|
|
365
319
|
//}
|
|
@@ -412,7 +366,7 @@ export class WebRtcPlayerController {
|
|
|
412
366
|
MessageDirection.FromStreamer,
|
|
413
367
|
'DataChannelLatencyTest',
|
|
414
368
|
(data: ArrayBuffer) => this.handleDataChannelLatencyTestResponse(data)
|
|
415
|
-
)
|
|
369
|
+
);
|
|
416
370
|
this.streamMessageController.registerMessageHandler(
|
|
417
371
|
MessageDirection.FromStreamer,
|
|
418
372
|
'InitialSettings',
|
|
@@ -433,13 +387,9 @@ export class WebRtcPlayerController {
|
|
|
433
387
|
'FileContents',
|
|
434
388
|
(data: ArrayBuffer) => this.onFileContents(data)
|
|
435
389
|
);
|
|
436
|
-
this.streamMessageController.registerMessageHandler(
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
() => {
|
|
440
|
-
/* Do nothing */
|
|
441
|
-
}
|
|
442
|
-
);
|
|
390
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'TestEcho', () => {
|
|
391
|
+
/* Do nothing */
|
|
392
|
+
});
|
|
443
393
|
this.streamMessageController.registerMessageHandler(
|
|
444
394
|
MessageDirection.FromStreamer,
|
|
445
395
|
'InputControlOwnership',
|
|
@@ -460,333 +410,222 @@ export class WebRtcPlayerController {
|
|
|
460
410
|
this.streamMessageController.registerMessageHandler(
|
|
461
411
|
MessageDirection.ToStreamer,
|
|
462
412
|
'IFrameRequest',
|
|
463
|
-
() =>
|
|
464
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
465
|
-
'IFrameRequest'
|
|
466
|
-
)
|
|
413
|
+
() => this.sendMessageController.sendMessageToStreamer('IFrameRequest')
|
|
467
414
|
);
|
|
468
415
|
this.streamMessageController.registerMessageHandler(
|
|
469
416
|
MessageDirection.ToStreamer,
|
|
470
417
|
'RequestQualityControl',
|
|
471
|
-
() =>
|
|
472
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
473
|
-
'RequestQualityControl'
|
|
474
|
-
)
|
|
418
|
+
() => this.sendMessageController.sendMessageToStreamer('RequestQualityControl')
|
|
475
419
|
);
|
|
476
|
-
this.streamMessageController.registerMessageHandler(
|
|
477
|
-
|
|
478
|
-
'FpsRequest',
|
|
479
|
-
() => this.sendMessageController.sendMessageToStreamer('FpsRequest')
|
|
420
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'FpsRequest', () =>
|
|
421
|
+
this.sendMessageController.sendMessageToStreamer('FpsRequest')
|
|
480
422
|
);
|
|
481
423
|
this.streamMessageController.registerMessageHandler(
|
|
482
424
|
MessageDirection.ToStreamer,
|
|
483
425
|
'AverageBitrateRequest',
|
|
484
|
-
() =>
|
|
485
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
486
|
-
'AverageBitrateRequest'
|
|
487
|
-
)
|
|
426
|
+
() => this.sendMessageController.sendMessageToStreamer('AverageBitrateRequest')
|
|
488
427
|
);
|
|
489
428
|
this.streamMessageController.registerMessageHandler(
|
|
490
429
|
MessageDirection.ToStreamer,
|
|
491
430
|
'StartStreaming',
|
|
492
|
-
() =>
|
|
493
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
494
|
-
'StartStreaming'
|
|
495
|
-
)
|
|
431
|
+
() => this.sendMessageController.sendMessageToStreamer('StartStreaming')
|
|
496
432
|
);
|
|
497
433
|
this.streamMessageController.registerMessageHandler(
|
|
498
434
|
MessageDirection.ToStreamer,
|
|
499
435
|
'StopStreaming',
|
|
500
|
-
() =>
|
|
501
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
502
|
-
'StopStreaming'
|
|
503
|
-
)
|
|
436
|
+
() => this.sendMessageController.sendMessageToStreamer('StopStreaming')
|
|
504
437
|
);
|
|
505
438
|
this.streamMessageController.registerMessageHandler(
|
|
506
439
|
MessageDirection.ToStreamer,
|
|
507
440
|
'LatencyTest',
|
|
508
441
|
(data: Array<number | string>) =>
|
|
509
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
510
|
-
'LatencyTest', data
|
|
511
|
-
)
|
|
442
|
+
this.sendMessageController.sendMessageToStreamer('LatencyTest', data)
|
|
512
443
|
);
|
|
513
444
|
this.streamMessageController.registerMessageHandler(
|
|
514
445
|
MessageDirection.ToStreamer,
|
|
515
446
|
'RequestInitialSettings',
|
|
516
|
-
() =>
|
|
517
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
518
|
-
'RequestInitialSettings'
|
|
519
|
-
)
|
|
520
|
-
);
|
|
521
|
-
this.streamMessageController.registerMessageHandler(
|
|
522
|
-
MessageDirection.ToStreamer,
|
|
523
|
-
'TestEcho',
|
|
524
|
-
() => {
|
|
525
|
-
/* Do nothing */
|
|
526
|
-
}
|
|
447
|
+
() => this.sendMessageController.sendMessageToStreamer('RequestInitialSettings')
|
|
527
448
|
);
|
|
449
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TestEcho', () => {
|
|
450
|
+
/* Do nothing */
|
|
451
|
+
});
|
|
528
452
|
this.streamMessageController.registerMessageHandler(
|
|
529
453
|
MessageDirection.ToStreamer,
|
|
530
454
|
'UIInteraction',
|
|
531
455
|
(data: Array<number | string>) =>
|
|
532
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
533
|
-
'UIInteraction', data
|
|
534
|
-
)
|
|
456
|
+
this.sendMessageController.sendMessageToStreamer('UIInteraction', data)
|
|
535
457
|
);
|
|
536
458
|
this.streamMessageController.registerMessageHandler(
|
|
537
459
|
MessageDirection.ToStreamer,
|
|
538
460
|
'Command',
|
|
539
461
|
(data: Array<number | string>) =>
|
|
540
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
541
|
-
'Command', data
|
|
542
|
-
)
|
|
462
|
+
this.sendMessageController.sendMessageToStreamer('Command', data)
|
|
543
463
|
);
|
|
544
464
|
this.streamMessageController.registerMessageHandler(
|
|
545
465
|
MessageDirection.ToStreamer,
|
|
546
466
|
'TextboxEntry',
|
|
547
467
|
(data: Array<number | string>) =>
|
|
548
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
549
|
-
'TextboxEntry', data
|
|
550
|
-
)
|
|
468
|
+
this.sendMessageController.sendMessageToStreamer('TextboxEntry', data)
|
|
551
469
|
);
|
|
552
470
|
this.streamMessageController.registerMessageHandler(
|
|
553
471
|
MessageDirection.ToStreamer,
|
|
554
472
|
'KeyDown',
|
|
555
473
|
(data: Array<number | string>) =>
|
|
556
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
557
|
-
'KeyDown',
|
|
558
|
-
data
|
|
559
|
-
)
|
|
474
|
+
this.sendMessageController.sendMessageToStreamer('KeyDown', data)
|
|
560
475
|
);
|
|
561
476
|
this.streamMessageController.registerMessageHandler(
|
|
562
477
|
MessageDirection.ToStreamer,
|
|
563
478
|
'KeyUp',
|
|
564
|
-
(data: Array<number | string>) =>
|
|
565
|
-
this.sendMessageController.sendMessageToStreamer('KeyUp', data)
|
|
479
|
+
(data: Array<number | string>) => this.sendMessageController.sendMessageToStreamer('KeyUp', data)
|
|
566
480
|
);
|
|
567
481
|
this.streamMessageController.registerMessageHandler(
|
|
568
482
|
MessageDirection.ToStreamer,
|
|
569
483
|
'KeyPress',
|
|
570
484
|
(data: Array<number | string>) =>
|
|
571
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
572
|
-
'KeyPress',
|
|
573
|
-
data
|
|
574
|
-
)
|
|
485
|
+
this.sendMessageController.sendMessageToStreamer('KeyPress', data)
|
|
575
486
|
);
|
|
576
487
|
this.streamMessageController.registerMessageHandler(
|
|
577
488
|
MessageDirection.ToStreamer,
|
|
578
489
|
'MouseEnter',
|
|
579
490
|
(data: Array<number | string>) =>
|
|
580
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
581
|
-
'MouseEnter',
|
|
582
|
-
data
|
|
583
|
-
)
|
|
491
|
+
this.sendMessageController.sendMessageToStreamer('MouseEnter', data)
|
|
584
492
|
);
|
|
585
493
|
this.streamMessageController.registerMessageHandler(
|
|
586
494
|
MessageDirection.ToStreamer,
|
|
587
495
|
'MouseLeave',
|
|
588
496
|
(data: Array<number | string>) =>
|
|
589
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
590
|
-
'MouseLeave',
|
|
591
|
-
data
|
|
592
|
-
)
|
|
497
|
+
this.sendMessageController.sendMessageToStreamer('MouseLeave', data)
|
|
593
498
|
);
|
|
594
499
|
this.streamMessageController.registerMessageHandler(
|
|
595
500
|
MessageDirection.ToStreamer,
|
|
596
501
|
'MouseDown',
|
|
597
502
|
(data: Array<number | string>) =>
|
|
598
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
599
|
-
'MouseDown',
|
|
600
|
-
data
|
|
601
|
-
)
|
|
503
|
+
this.sendMessageController.sendMessageToStreamer('MouseDown', data)
|
|
602
504
|
);
|
|
603
505
|
this.streamMessageController.registerMessageHandler(
|
|
604
506
|
MessageDirection.ToStreamer,
|
|
605
507
|
'MouseUp',
|
|
606
508
|
(data: Array<number | string>) =>
|
|
607
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
608
|
-
'MouseUp',
|
|
609
|
-
data
|
|
610
|
-
)
|
|
509
|
+
this.sendMessageController.sendMessageToStreamer('MouseUp', data)
|
|
611
510
|
);
|
|
612
511
|
this.streamMessageController.registerMessageHandler(
|
|
613
512
|
MessageDirection.ToStreamer,
|
|
614
513
|
'MouseMove',
|
|
615
514
|
(data: Array<number | string>) =>
|
|
616
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
617
|
-
'MouseMove',
|
|
618
|
-
data
|
|
619
|
-
)
|
|
515
|
+
this.sendMessageController.sendMessageToStreamer('MouseMove', data)
|
|
620
516
|
);
|
|
621
517
|
this.streamMessageController.registerMessageHandler(
|
|
622
518
|
MessageDirection.ToStreamer,
|
|
623
519
|
'MouseWheel',
|
|
624
520
|
(data: Array<number | string>) =>
|
|
625
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
626
|
-
'MouseWheel',
|
|
627
|
-
data
|
|
628
|
-
)
|
|
521
|
+
this.sendMessageController.sendMessageToStreamer('MouseWheel', data)
|
|
629
522
|
);
|
|
630
523
|
this.streamMessageController.registerMessageHandler(
|
|
631
524
|
MessageDirection.ToStreamer,
|
|
632
525
|
'MouseDouble',
|
|
633
526
|
(data: Array<number | string>) =>
|
|
634
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
635
|
-
'MouseDouble',
|
|
636
|
-
data
|
|
637
|
-
)
|
|
527
|
+
this.sendMessageController.sendMessageToStreamer('MouseDouble', data)
|
|
638
528
|
);
|
|
639
529
|
this.streamMessageController.registerMessageHandler(
|
|
640
530
|
MessageDirection.ToStreamer,
|
|
641
531
|
'TouchStart',
|
|
642
532
|
(data: Array<number | string>) =>
|
|
643
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
644
|
-
'TouchStart',
|
|
645
|
-
data
|
|
646
|
-
)
|
|
533
|
+
this.sendMessageController.sendMessageToStreamer('TouchStart', data)
|
|
647
534
|
);
|
|
648
535
|
this.streamMessageController.registerMessageHandler(
|
|
649
536
|
MessageDirection.ToStreamer,
|
|
650
537
|
'TouchEnd',
|
|
651
538
|
(data: Array<number | string>) =>
|
|
652
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
653
|
-
'TouchEnd',
|
|
654
|
-
data
|
|
655
|
-
)
|
|
539
|
+
this.sendMessageController.sendMessageToStreamer('TouchEnd', data)
|
|
656
540
|
);
|
|
657
541
|
this.streamMessageController.registerMessageHandler(
|
|
658
542
|
MessageDirection.ToStreamer,
|
|
659
543
|
'TouchMove',
|
|
660
544
|
(data: Array<number | string>) =>
|
|
661
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
662
|
-
'TouchMove',
|
|
663
|
-
data
|
|
664
|
-
)
|
|
545
|
+
this.sendMessageController.sendMessageToStreamer('TouchMove', data)
|
|
665
546
|
);
|
|
666
547
|
this.streamMessageController.registerMessageHandler(
|
|
667
548
|
MessageDirection.ToStreamer,
|
|
668
549
|
'GamepadConnected',
|
|
669
|
-
() =>
|
|
670
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
671
|
-
'GamepadConnected'
|
|
672
|
-
)
|
|
550
|
+
() => this.sendMessageController.sendMessageToStreamer('GamepadConnected')
|
|
673
551
|
);
|
|
674
552
|
this.streamMessageController.registerMessageHandler(
|
|
675
553
|
MessageDirection.ToStreamer,
|
|
676
554
|
'GamepadButtonPressed',
|
|
677
555
|
(data: Array<number | string>) =>
|
|
678
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
679
|
-
'GamepadButtonPressed',
|
|
680
|
-
data
|
|
681
|
-
)
|
|
556
|
+
this.sendMessageController.sendMessageToStreamer('GamepadButtonPressed', data)
|
|
682
557
|
);
|
|
683
558
|
this.streamMessageController.registerMessageHandler(
|
|
684
559
|
MessageDirection.ToStreamer,
|
|
685
560
|
'GamepadButtonReleased',
|
|
686
561
|
(data: Array<number | string>) =>
|
|
687
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
688
|
-
'GamepadButtonReleased',
|
|
689
|
-
data
|
|
690
|
-
)
|
|
562
|
+
this.sendMessageController.sendMessageToStreamer('GamepadButtonReleased', data)
|
|
691
563
|
);
|
|
692
564
|
this.streamMessageController.registerMessageHandler(
|
|
693
565
|
MessageDirection.ToStreamer,
|
|
694
566
|
'GamepadAnalog',
|
|
695
567
|
(data: Array<number | string>) =>
|
|
696
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
697
|
-
'GamepadAnalog',
|
|
698
|
-
data
|
|
699
|
-
)
|
|
568
|
+
this.sendMessageController.sendMessageToStreamer('GamepadAnalog', data)
|
|
700
569
|
);
|
|
701
570
|
this.streamMessageController.registerMessageHandler(
|
|
702
571
|
MessageDirection.ToStreamer,
|
|
703
572
|
'GamepadDisconnected',
|
|
704
573
|
(data: Array<number | string>) =>
|
|
705
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
706
|
-
'GamepadDisconnected',
|
|
707
|
-
data
|
|
708
|
-
)
|
|
574
|
+
this.sendMessageController.sendMessageToStreamer('GamepadDisconnected', data)
|
|
709
575
|
);
|
|
710
576
|
this.streamMessageController.registerMessageHandler(
|
|
711
577
|
MessageDirection.ToStreamer,
|
|
712
578
|
'XREyeViews',
|
|
713
579
|
(data: Array<number | string>) =>
|
|
714
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
715
|
-
'XREyeViews',
|
|
716
|
-
data
|
|
717
|
-
)
|
|
580
|
+
this.sendMessageController.sendMessageToStreamer('XREyeViews', data)
|
|
718
581
|
);
|
|
719
582
|
this.streamMessageController.registerMessageHandler(
|
|
720
583
|
MessageDirection.ToStreamer,
|
|
721
584
|
'XRHMDTransform',
|
|
722
585
|
(data: Array<number | string>) =>
|
|
723
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
724
|
-
'XRHMDTransform',
|
|
725
|
-
data
|
|
726
|
-
)
|
|
586
|
+
this.sendMessageController.sendMessageToStreamer('XRHMDTransform', data)
|
|
727
587
|
);
|
|
728
588
|
this.streamMessageController.registerMessageHandler(
|
|
729
589
|
MessageDirection.ToStreamer,
|
|
730
590
|
'XRControllerTransform',
|
|
731
591
|
(data: Array<number | string>) =>
|
|
732
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
733
|
-
'XRControllerTransform',
|
|
734
|
-
data
|
|
735
|
-
)
|
|
592
|
+
this.sendMessageController.sendMessageToStreamer('XRControllerTransform', data)
|
|
736
593
|
);
|
|
737
594
|
this.streamMessageController.registerMessageHandler(
|
|
738
595
|
MessageDirection.ToStreamer,
|
|
739
596
|
'XRSystem',
|
|
740
597
|
(data: Array<number | string>) =>
|
|
741
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
742
|
-
'XRSystem',
|
|
743
|
-
data
|
|
744
|
-
)
|
|
598
|
+
this.sendMessageController.sendMessageToStreamer('XRSystem', data)
|
|
745
599
|
);
|
|
746
600
|
this.streamMessageController.registerMessageHandler(
|
|
747
601
|
MessageDirection.ToStreamer,
|
|
748
602
|
'XRButtonTouched',
|
|
749
603
|
(data: Array<number | string>) =>
|
|
750
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
751
|
-
'XRButtonTouched',
|
|
752
|
-
data
|
|
753
|
-
)
|
|
604
|
+
this.sendMessageController.sendMessageToStreamer('XRButtonTouched', data)
|
|
754
605
|
);
|
|
755
606
|
this.streamMessageController.registerMessageHandler(
|
|
756
607
|
MessageDirection.ToStreamer,
|
|
757
608
|
'XRButtonTouchReleased',
|
|
758
609
|
(data: Array<number | string>) =>
|
|
759
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
760
|
-
'XRButtonTouchReleased',
|
|
761
|
-
data
|
|
762
|
-
)
|
|
610
|
+
this.sendMessageController.sendMessageToStreamer('XRButtonTouchReleased', data)
|
|
763
611
|
);
|
|
764
612
|
this.streamMessageController.registerMessageHandler(
|
|
765
613
|
MessageDirection.ToStreamer,
|
|
766
614
|
'XRButtonPressed',
|
|
767
615
|
(data: Array<number | string>) =>
|
|
768
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
769
|
-
'XRButtonPressed',
|
|
770
|
-
data
|
|
771
|
-
)
|
|
616
|
+
this.sendMessageController.sendMessageToStreamer('XRButtonPressed', data)
|
|
772
617
|
);
|
|
773
618
|
this.streamMessageController.registerMessageHandler(
|
|
774
619
|
MessageDirection.ToStreamer,
|
|
775
620
|
'XRButtonReleased',
|
|
776
621
|
(data: Array<number | string>) =>
|
|
777
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
778
|
-
'XRButtonReleased',
|
|
779
|
-
data
|
|
780
|
-
)
|
|
622
|
+
this.sendMessageController.sendMessageToStreamer('XRButtonReleased', data)
|
|
781
623
|
);
|
|
782
624
|
this.streamMessageController.registerMessageHandler(
|
|
783
625
|
MessageDirection.ToStreamer,
|
|
784
626
|
'XRAnalog',
|
|
785
627
|
(data: Array<number | string>) =>
|
|
786
|
-
this.sendMessageController.sendMessageToStreamer(
|
|
787
|
-
'XRAnalog',
|
|
788
|
-
data
|
|
789
|
-
)
|
|
628
|
+
this.sendMessageController.sendMessageToStreamer('XRAnalog', data)
|
|
790
629
|
);
|
|
791
630
|
}
|
|
792
631
|
|
|
@@ -795,20 +634,10 @@ export class WebRtcPlayerController {
|
|
|
795
634
|
* @param message
|
|
796
635
|
*/
|
|
797
636
|
onCommand(message: ArrayBuffer) {
|
|
798
|
-
Logger.
|
|
799
|
-
|
|
800
|
-
'DataChannelReceiveMessageType.Command',
|
|
801
|
-
6
|
|
802
|
-
);
|
|
803
|
-
const commandAsString = new TextDecoder('utf-16').decode(
|
|
804
|
-
message.slice(1)
|
|
805
|
-
);
|
|
637
|
+
Logger.Info('DataChannelReceiveMessageType.Command');
|
|
638
|
+
const commandAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
806
639
|
|
|
807
|
-
Logger.
|
|
808
|
-
Logger.GetStackTrace(),
|
|
809
|
-
'Data Channel Command: ' + commandAsString,
|
|
810
|
-
6
|
|
811
|
-
);
|
|
640
|
+
Logger.Info('Data Channel Command: ' + commandAsString);
|
|
812
641
|
const command = JSON.parse(commandAsString);
|
|
813
642
|
if (command.command === 'onScreenKeyboard') {
|
|
814
643
|
this.pixelStreaming._activateOnScreenKeyboard(command);
|
|
@@ -821,25 +650,16 @@ export class WebRtcPlayerController {
|
|
|
821
650
|
*/
|
|
822
651
|
onProtocolMessage(message: ArrayBuffer) {
|
|
823
652
|
try {
|
|
824
|
-
const protocolString = new TextDecoder('utf-16').decode(
|
|
825
|
-
message.slice(1)
|
|
826
|
-
);
|
|
653
|
+
const protocolString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
827
654
|
const protocolJSON = JSON.parse(protocolString);
|
|
828
|
-
if (
|
|
829
|
-
|
|
830
|
-
) {
|
|
831
|
-
Logger.Error(
|
|
832
|
-
Logger.GetStackTrace(),
|
|
833
|
-
'Malformed protocol received. Ensure the protocol message contains a direction'
|
|
834
|
-
);
|
|
655
|
+
if (!Object.prototype.hasOwnProperty.call(protocolJSON, 'Direction')) {
|
|
656
|
+
Logger.Error('Malformed protocol received. Ensure the protocol message contains a direction');
|
|
835
657
|
}
|
|
836
658
|
const direction = protocolJSON.Direction;
|
|
837
659
|
delete protocolJSON.Direction;
|
|
838
|
-
Logger.
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
? 'FromStreamer'
|
|
842
|
-
: 'ToStreamer'
|
|
660
|
+
Logger.Info(
|
|
661
|
+
`Received new ${
|
|
662
|
+
direction == MessageDirection.FromStreamer ? 'FromStreamer' : 'ToStreamer'
|
|
843
663
|
} protocol. Updating existing protocol...`
|
|
844
664
|
);
|
|
845
665
|
Object.keys(protocolJSON).forEach((messageType) => {
|
|
@@ -847,82 +667,54 @@ export class WebRtcPlayerController {
|
|
|
847
667
|
switch (direction) {
|
|
848
668
|
case MessageDirection.ToStreamer:
|
|
849
669
|
// Check that the message contains all the relevant params
|
|
850
|
-
if (
|
|
851
|
-
!Object.prototype.hasOwnProperty.call(
|
|
852
|
-
message,
|
|
853
|
-
'id'
|
|
854
|
-
)
|
|
855
|
-
) {
|
|
670
|
+
if (!Object.prototype.hasOwnProperty.call(message, 'id')) {
|
|
856
671
|
Logger.Error(
|
|
857
|
-
Logger.GetStackTrace(),
|
|
858
672
|
`ToStreamer->${messageType} protocol definition was malformed as it didn't contain at least an id\n
|
|
859
|
-
Definition was: ${JSON.stringify(
|
|
860
|
-
message,
|
|
861
|
-
null,
|
|
862
|
-
2
|
|
863
|
-
)}`
|
|
673
|
+
Definition was: ${JSON.stringify(message, null, 2)}`
|
|
864
674
|
);
|
|
865
675
|
// return in a forEach is equivalent to a continue in a normal for loop
|
|
866
676
|
return;
|
|
867
677
|
}
|
|
868
678
|
|
|
869
679
|
// UE5.1 and UE5.2 don't send a structure for these message types, but they actually do have a structure so ignore updating them
|
|
870
|
-
if (
|
|
680
|
+
if (
|
|
681
|
+
messageType === 'UIInteraction' ||
|
|
682
|
+
messageType === 'Command' ||
|
|
683
|
+
messageType === 'LatencyTest'
|
|
684
|
+
) {
|
|
871
685
|
return;
|
|
872
686
|
}
|
|
873
687
|
|
|
874
|
-
if (
|
|
875
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
876
|
-
messageType
|
|
877
|
-
)
|
|
878
|
-
) {
|
|
688
|
+
if (this.streamMessageController.toStreamerHandlers.get(messageType)) {
|
|
879
689
|
// If we've registered a handler for this message type we can add it to our supported messages. ie registerMessageHandler(...)
|
|
880
|
-
this.streamMessageController.toStreamerMessages.set(
|
|
881
|
-
messageType,
|
|
882
|
-
message
|
|
883
|
-
);
|
|
690
|
+
this.streamMessageController.toStreamerMessages.set(messageType, message);
|
|
884
691
|
} else {
|
|
885
692
|
Logger.Error(
|
|
886
|
-
Logger.GetStackTrace(),
|
|
887
693
|
`There was no registered handler for "${messageType}" - try adding one using registerMessageHandler(MessageDirection.ToStreamer, "${messageType}", myHandler)`
|
|
888
694
|
);
|
|
889
695
|
}
|
|
890
696
|
break;
|
|
891
697
|
case MessageDirection.FromStreamer:
|
|
892
698
|
// Check that the message contains all the relevant params
|
|
893
|
-
if (
|
|
894
|
-
!Object.prototype.hasOwnProperty.call(message, 'id')
|
|
895
|
-
) {
|
|
699
|
+
if (!Object.prototype.hasOwnProperty.call(message, 'id')) {
|
|
896
700
|
Logger.Error(
|
|
897
|
-
Logger.GetStackTrace(),
|
|
898
701
|
`FromStreamer->${messageType} protocol definition was malformed as it didn't contain at least an id\n
|
|
899
702
|
Definition was: ${JSON.stringify(message, null, 2)}`
|
|
900
703
|
);
|
|
901
704
|
// return in a forEach is equivalent to a continue in a normal for loop
|
|
902
705
|
return;
|
|
903
706
|
}
|
|
904
|
-
if (
|
|
905
|
-
this.streamMessageController.fromStreamerHandlers.get(
|
|
906
|
-
messageType
|
|
907
|
-
)
|
|
908
|
-
) {
|
|
707
|
+
if (this.streamMessageController.fromStreamerHandlers.get(messageType)) {
|
|
909
708
|
// If we've registered a handler for this message type. ie registerMessageHandler(...)
|
|
910
|
-
this.streamMessageController.fromStreamerMessages.set(
|
|
911
|
-
message.id,
|
|
912
|
-
messageType
|
|
913
|
-
);
|
|
709
|
+
this.streamMessageController.fromStreamerMessages.set(message.id, messageType);
|
|
914
710
|
} else {
|
|
915
711
|
Logger.Error(
|
|
916
|
-
Logger.GetStackTrace(),
|
|
917
712
|
`There was no registered handler for "${message}" - try adding one using registerMessageHandler(MessageDirection.FromStreamer, "${messageType}", myHandler)`
|
|
918
713
|
);
|
|
919
714
|
}
|
|
920
715
|
break;
|
|
921
716
|
default:
|
|
922
|
-
Logger.Error(
|
|
923
|
-
Logger.GetStackTrace(),
|
|
924
|
-
`Unknown direction: ${direction}`
|
|
925
|
-
);
|
|
717
|
+
Logger.Error(`Unknown direction: ${direction}`);
|
|
926
718
|
}
|
|
927
719
|
});
|
|
928
720
|
|
|
@@ -930,7 +722,7 @@ export class WebRtcPlayerController {
|
|
|
930
722
|
this.toStreamerMessagesController.SendRequestInitialSettings();
|
|
931
723
|
this.toStreamerMessagesController.SendRequestQualityControl();
|
|
932
724
|
} catch (e) {
|
|
933
|
-
Logger.
|
|
725
|
+
Logger.Info(e);
|
|
934
726
|
}
|
|
935
727
|
}
|
|
936
728
|
|
|
@@ -940,22 +732,17 @@ export class WebRtcPlayerController {
|
|
|
940
732
|
*/
|
|
941
733
|
onInputControlOwnership(message: ArrayBuffer) {
|
|
942
734
|
const view = new Uint8Array(message);
|
|
943
|
-
Logger.
|
|
944
|
-
Logger.GetStackTrace(),
|
|
945
|
-
'DataChannelReceiveMessageType.InputControlOwnership',
|
|
946
|
-
6
|
|
947
|
-
);
|
|
735
|
+
Logger.Info('DataChannelReceiveMessageType.InputControlOwnership');
|
|
948
736
|
const inputControlOwnership = new Boolean(view[1]).valueOf();
|
|
949
|
-
Logger.
|
|
950
|
-
Logger.GetStackTrace(),
|
|
737
|
+
Logger.Info(
|
|
951
738
|
`Received input controller message - will your input control the stream: ${inputControlOwnership}`
|
|
952
739
|
);
|
|
953
740
|
this.pixelStreaming._onInputControlOwnership(inputControlOwnership);
|
|
954
741
|
}
|
|
955
742
|
|
|
956
743
|
/**
|
|
957
|
-
*
|
|
958
|
-
* @param message
|
|
744
|
+
*
|
|
745
|
+
* @param message
|
|
959
746
|
*/
|
|
960
747
|
onGamepadResponse(message: ArrayBuffer) {
|
|
961
748
|
const responseString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
@@ -985,25 +772,31 @@ export class WebRtcPlayerController {
|
|
|
985
772
|
}
|
|
986
773
|
|
|
987
774
|
/**
|
|
988
|
-
* Attempt a reconnection to the signalling server
|
|
775
|
+
* Attempt a reconnection to the signalling server. Manual trigger
|
|
989
776
|
*/
|
|
990
777
|
tryReconnect(message: string) {
|
|
778
|
+
this.forceReconnect = true;
|
|
779
|
+
this.doReconnect(message);
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/**
|
|
783
|
+
* Does the actual reconnect work. Used by the auto reconnect feature to skip the manual flag.
|
|
784
|
+
*/
|
|
785
|
+
doReconnect(message: string) {
|
|
991
786
|
// if there is no webSocketController return immediately or this will not work
|
|
992
787
|
if (!this.protocol) {
|
|
993
|
-
Logger.
|
|
994
|
-
Logger.GetStackTrace(),
|
|
995
|
-
'This player has no protocol connection.'
|
|
996
|
-
);
|
|
788
|
+
Logger.Info('This player has no protocol connection.');
|
|
997
789
|
return;
|
|
998
790
|
}
|
|
999
791
|
|
|
1000
|
-
// if the connection is open, first close it. wait some time and try again.
|
|
1001
792
|
this.isReconnecting = true;
|
|
793
|
+
|
|
794
|
+
// if the connection is open, first close it and force a reconnect.
|
|
1002
795
|
if (this.protocol.isConnected()) {
|
|
1003
|
-
this.
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
796
|
+
if (!this.forceReconnect) {
|
|
797
|
+
message = `${message} Reconnecting.`;
|
|
798
|
+
}
|
|
799
|
+
this.closeSignalingServer(message, true);
|
|
1007
800
|
} else {
|
|
1008
801
|
this.pixelStreaming._onWebRtcAutoConnect();
|
|
1009
802
|
this.connectToSignallingServer();
|
|
@@ -1022,10 +815,10 @@ export class WebRtcPlayerController {
|
|
|
1022
815
|
})
|
|
1023
816
|
);
|
|
1024
817
|
if (this.shouldShowPlayOverlay === true) {
|
|
1025
|
-
Logger.
|
|
818
|
+
Logger.Info('showing play overlay');
|
|
1026
819
|
this.resizePlayerStyle();
|
|
1027
820
|
} else {
|
|
1028
|
-
Logger.
|
|
821
|
+
Logger.Info('showing freeze frame');
|
|
1029
822
|
this.freezeFrameController.showFreezeFrame();
|
|
1030
823
|
}
|
|
1031
824
|
setTimeout(() => {
|
|
@@ -1038,11 +831,7 @@ export class WebRtcPlayerController {
|
|
|
1038
831
|
* @param message The freeze frame data in bytes
|
|
1039
832
|
*/
|
|
1040
833
|
onFreezeFrameMessage(message: ArrayBuffer) {
|
|
1041
|
-
Logger.
|
|
1042
|
-
Logger.GetStackTrace(),
|
|
1043
|
-
'DataChannelReceiveMessageType.FreezeFrame',
|
|
1044
|
-
6
|
|
1045
|
-
);
|
|
834
|
+
Logger.Info('DataChannelReceiveMessageType.FreezeFrame');
|
|
1046
835
|
const view = new Uint8Array(message);
|
|
1047
836
|
this.freezeFrameController.processFreezeFrameMessage(view, () =>
|
|
1048
837
|
this.loadFreezeFrameOrShowPlayOverlay()
|
|
@@ -1053,15 +842,9 @@ export class WebRtcPlayerController {
|
|
|
1053
842
|
* Enable the video after hiding a freeze frame
|
|
1054
843
|
*/
|
|
1055
844
|
invalidateFreezeFrameAndEnableVideo() {
|
|
1056
|
-
Logger.
|
|
1057
|
-
Logger.GetStackTrace(),
|
|
1058
|
-
'DataChannelReceiveMessageType.FreezeFrame',
|
|
1059
|
-
6
|
|
1060
|
-
);
|
|
845
|
+
Logger.Info('DataChannelReceiveMessageType.FreezeFrame');
|
|
1061
846
|
setTimeout(() => {
|
|
1062
|
-
this.pixelStreaming.dispatchEvent(
|
|
1063
|
-
new HideFreezeFrameEvent()
|
|
1064
|
-
);
|
|
847
|
+
this.pixelStreaming.dispatchEvent(new HideFreezeFrameEvent());
|
|
1065
848
|
this.freezeFrameController.hideFreezeFrame();
|
|
1066
849
|
}, this.freezeFrameController.freezeFrameDelay);
|
|
1067
850
|
if (this.videoPlayer.getVideoElement()) {
|
|
@@ -1103,21 +886,16 @@ export class WebRtcPlayerController {
|
|
|
1103
886
|
if (!this.videoPlayer.getVideoElement()) {
|
|
1104
887
|
const message =
|
|
1105
888
|
'Could not play video stream because the video player was not initialized correctly.';
|
|
1106
|
-
this.pixelStreaming.dispatchEvent(
|
|
1107
|
-
|
|
1108
|
-
);
|
|
1109
|
-
Logger.Error(Logger.GetStackTrace(), message);
|
|
889
|
+
this.pixelStreaming.dispatchEvent(new PlayStreamErrorEvent({ message }));
|
|
890
|
+
Logger.Error(message);
|
|
1110
891
|
|
|
1111
892
|
// close the connection
|
|
1112
|
-
this.closeSignalingServer('Stream not initialized correctly');
|
|
893
|
+
this.closeSignalingServer('Stream not initialized correctly', false);
|
|
1113
894
|
return;
|
|
1114
895
|
}
|
|
1115
896
|
|
|
1116
897
|
if (!this.videoPlayer.hasVideoSource()) {
|
|
1117
|
-
Logger.Warning(
|
|
1118
|
-
Logger.GetStackTrace(),
|
|
1119
|
-
'Cannot play stream, the video element has no srcObject to play.'
|
|
1120
|
-
);
|
|
898
|
+
Logger.Warning('Cannot play stream, the video element has no srcObject to play.');
|
|
1121
899
|
return;
|
|
1122
900
|
}
|
|
1123
901
|
|
|
@@ -1125,7 +903,7 @@ export class WebRtcPlayerController {
|
|
|
1125
903
|
this.pixelStreaming.dispatchEvent(new PlayStreamEvent());
|
|
1126
904
|
|
|
1127
905
|
if (this.streamController.audioElement.srcObject) {
|
|
1128
|
-
const startMuted = this.config.isFlagEnabled(Flags.StartVideoMuted)
|
|
906
|
+
const startMuted = this.config.isFlagEnabled(Flags.StartVideoMuted);
|
|
1129
907
|
this.streamController.audioElement.muted = startMuted;
|
|
1130
908
|
|
|
1131
909
|
if (startMuted) {
|
|
@@ -1137,9 +915,8 @@ export class WebRtcPlayerController {
|
|
|
1137
915
|
this.playVideo();
|
|
1138
916
|
})
|
|
1139
917
|
.catch((onRejectedReason) => {
|
|
1140
|
-
Logger.
|
|
1141
|
-
Logger.
|
|
1142
|
-
Logger.GetStackTrace(),
|
|
918
|
+
Logger.Info(onRejectedReason);
|
|
919
|
+
Logger.Info(
|
|
1143
920
|
'Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay.'
|
|
1144
921
|
);
|
|
1145
922
|
this.pixelStreaming.dispatchEvent(
|
|
@@ -1166,14 +943,11 @@ export class WebRtcPlayerController {
|
|
|
1166
943
|
if (this.streamController.audioElement.srcObject) {
|
|
1167
944
|
this.streamController.audioElement.pause();
|
|
1168
945
|
}
|
|
1169
|
-
Logger.
|
|
1170
|
-
Logger.
|
|
1171
|
-
Logger.GetStackTrace(),
|
|
946
|
+
Logger.Info(onRejectedReason);
|
|
947
|
+
Logger.Info(
|
|
1172
948
|
'Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay.'
|
|
1173
949
|
);
|
|
1174
|
-
this.pixelStreaming.dispatchEvent(
|
|
1175
|
-
new PlayStreamRejectedEvent({ reason: onRejectedReason })
|
|
1176
|
-
);
|
|
950
|
+
this.pixelStreaming.dispatchEvent(new PlayStreamRejectedEvent({ reason: onRejectedReason }));
|
|
1177
951
|
});
|
|
1178
952
|
}
|
|
1179
953
|
|
|
@@ -1193,7 +967,7 @@ export class WebRtcPlayerController {
|
|
|
1193
967
|
*/
|
|
1194
968
|
connectToSignallingServer() {
|
|
1195
969
|
this.locallyClosed = false;
|
|
1196
|
-
this.
|
|
970
|
+
this.enableAutoReconnect = true;
|
|
1197
971
|
this.disconnectMessage = null;
|
|
1198
972
|
const signallingUrl = this.signallingUrlBuilder();
|
|
1199
973
|
this.protocol.connect(signallingUrl);
|
|
@@ -1214,10 +988,12 @@ export class WebRtcPlayerController {
|
|
|
1214
988
|
// close and error if turn is forced and there is no turn server
|
|
1215
989
|
if (!hasTurnServer) {
|
|
1216
990
|
Logger.Info(
|
|
1217
|
-
Logger.GetStackTrace(),
|
|
1218
991
|
'No turn server was found in the Peer Connection Options. TURN cannot be forced, closing connection. Please use STUN instead'
|
|
1219
992
|
);
|
|
1220
|
-
this.closeSignalingServer(
|
|
993
|
+
this.closeSignalingServer(
|
|
994
|
+
'TURN cannot be forced, closing connection. Please use STUN instead.',
|
|
995
|
+
false
|
|
996
|
+
);
|
|
1221
997
|
return;
|
|
1222
998
|
}
|
|
1223
999
|
}
|
|
@@ -1230,18 +1006,15 @@ export class WebRtcPlayerController {
|
|
|
1230
1006
|
);
|
|
1231
1007
|
|
|
1232
1008
|
// set up peer connection controller video stats
|
|
1233
|
-
this.peerConnectionController.onVideoStats = (event: AggregatedStats) =>
|
|
1234
|
-
this.handleVideoStats(event);
|
|
1009
|
+
this.peerConnectionController.onVideoStats = (event: AggregatedStats) => this.handleVideoStats(event);
|
|
1235
1010
|
|
|
1236
1011
|
/* When the Peer Connection wants to send an offer have it handled */
|
|
1237
|
-
this.peerConnectionController.onSendWebRTCOffer = (
|
|
1238
|
-
offer
|
|
1239
|
-
) => this.handleSendWebRTCOffer(offer);
|
|
1012
|
+
this.peerConnectionController.onSendWebRTCOffer = (offer: RTCSessionDescriptionInit) =>
|
|
1013
|
+
this.handleSendWebRTCOffer(offer);
|
|
1240
1014
|
|
|
1241
1015
|
/* When the Peer Connection wants to send an answer have it handled */
|
|
1242
|
-
this.peerConnectionController.onSendWebRTCAnswer = (
|
|
1243
|
-
offer
|
|
1244
|
-
) => this.handleSendWebRTCAnswer(offer);
|
|
1016
|
+
this.peerConnectionController.onSendWebRTCAnswer = (offer: RTCSessionDescriptionInit) =>
|
|
1017
|
+
this.handleSendWebRTCAnswer(offer);
|
|
1245
1018
|
|
|
1246
1019
|
/* When the Peer Connection ice candidate is added have it handled */
|
|
1247
1020
|
this.peerConnectionController.onPeerIceCandidate = (
|
|
@@ -1249,9 +1022,8 @@ export class WebRtcPlayerController {
|
|
|
1249
1022
|
) => this.handleSendIceCandidate(peerConnectionIceEvent);
|
|
1250
1023
|
|
|
1251
1024
|
/* When the Peer Connection has a data channel created for it by the browser, handle it */
|
|
1252
|
-
this.peerConnectionController.onDataChannel = (
|
|
1253
|
-
datachannelEvent
|
|
1254
|
-
) => this.handleDataChannel(datachannelEvent);
|
|
1025
|
+
this.peerConnectionController.onDataChannel = (datachannelEvent: RTCDataChannelEvent) =>
|
|
1026
|
+
this.handleDataChannel(datachannelEvent);
|
|
1255
1027
|
|
|
1256
1028
|
// set up webRtc text overlays
|
|
1257
1029
|
this.peerConnectionController.showTextOverlayConnecting = () =>
|
|
@@ -1263,8 +1035,12 @@ export class WebRtcPlayerController {
|
|
|
1263
1035
|
// Browsers emit "connected" when getting first connection and "completed" when finishing
|
|
1264
1036
|
// candidate checking. However, sometimes browsers can skip "connected" and only emit "completed".
|
|
1265
1037
|
// Therefore need to check both cases and emit onWebRtcConnected only once on the first hit.
|
|
1266
|
-
if (
|
|
1267
|
-
|
|
1038
|
+
if (
|
|
1039
|
+
!webRtcConnectedSent &&
|
|
1040
|
+
['connected', 'completed'].includes(
|
|
1041
|
+
this.peerConnectionController.peerConnection.iceConnectionState
|
|
1042
|
+
)
|
|
1043
|
+
) {
|
|
1268
1044
|
this.pixelStreaming._onWebRtcConnected();
|
|
1269
1045
|
webRtcConnectedSent = true;
|
|
1270
1046
|
}
|
|
@@ -1273,26 +1049,6 @@ export class WebRtcPlayerController {
|
|
|
1273
1049
|
/* RTC Peer Connection on Track event -> handle on track */
|
|
1274
1050
|
this.peerConnectionController.onTrack = (trackEvent: RTCTrackEvent) =>
|
|
1275
1051
|
this.streamController.handleOnTrack(trackEvent);
|
|
1276
|
-
|
|
1277
|
-
/* Start the Hand shake process by creating an Offer */
|
|
1278
|
-
const BrowserSendsOffer = this.config.isFlagEnabled(
|
|
1279
|
-
Flags.BrowserSendOffer
|
|
1280
|
-
);
|
|
1281
|
-
if (BrowserSendsOffer) {
|
|
1282
|
-
// If browser is sending the offer, create an offer and send it to the streamer
|
|
1283
|
-
this.sendrecvDataChannelController.createDataChannel(
|
|
1284
|
-
this.peerConnectionController.peerConnection,
|
|
1285
|
-
'cirrus',
|
|
1286
|
-
this.datachannelOptions
|
|
1287
|
-
);
|
|
1288
|
-
this.sendrecvDataChannelController.handleOnMessage = (
|
|
1289
|
-
ev: MessageEvent<ArrayBuffer>
|
|
1290
|
-
) => this.handleOnMessage(ev);
|
|
1291
|
-
this.peerConnectionController.createOffer(
|
|
1292
|
-
this.sdpConstraints,
|
|
1293
|
-
this.config
|
|
1294
|
-
);
|
|
1295
|
-
}
|
|
1296
1052
|
}
|
|
1297
1053
|
|
|
1298
1054
|
/**
|
|
@@ -1301,7 +1057,7 @@ export class WebRtcPlayerController {
|
|
|
1301
1057
|
checkTurnServerAvailability(options: RTCConfiguration) {
|
|
1302
1058
|
// if iceServers is empty return false this should not be the general use case but is here incase
|
|
1303
1059
|
if (!options.iceServers) {
|
|
1304
|
-
Logger.Info(
|
|
1060
|
+
Logger.Info('A turn sever was not found');
|
|
1305
1061
|
return false;
|
|
1306
1062
|
}
|
|
1307
1063
|
|
|
@@ -1309,16 +1065,13 @@ export class WebRtcPlayerController {
|
|
|
1309
1065
|
for (const iceServer of options.iceServers) {
|
|
1310
1066
|
for (const url of iceServer.urls) {
|
|
1311
1067
|
if (url.includes('turn')) {
|
|
1312
|
-
Logger.
|
|
1313
|
-
Logger.GetStackTrace(),
|
|
1314
|
-
`A turn sever was found at ${url}`
|
|
1315
|
-
);
|
|
1068
|
+
Logger.Info(`A turn sever was found at ${url}`);
|
|
1316
1069
|
return true;
|
|
1317
1070
|
}
|
|
1318
1071
|
}
|
|
1319
1072
|
}
|
|
1320
1073
|
|
|
1321
|
-
Logger.Info(
|
|
1074
|
+
Logger.Info('A turn sever was not found');
|
|
1322
1075
|
return false;
|
|
1323
1076
|
}
|
|
1324
1077
|
|
|
@@ -1337,11 +1090,7 @@ export class WebRtcPlayerController {
|
|
|
1337
1090
|
* Handles when the signalling server gives us the list of streamer ids.
|
|
1338
1091
|
*/
|
|
1339
1092
|
handleStreamerListMessage(messageStreamerList: Messages.streamerList) {
|
|
1340
|
-
Logger.
|
|
1341
|
-
Logger.GetStackTrace(),
|
|
1342
|
-
`Got streamer list ${messageStreamerList.ids}`,
|
|
1343
|
-
6
|
|
1344
|
-
);
|
|
1093
|
+
Logger.Info(`Got streamer list ${messageStreamerList.ids}`);
|
|
1345
1094
|
|
|
1346
1095
|
let wantedStreamerId: string = '';
|
|
1347
1096
|
|
|
@@ -1356,10 +1105,7 @@ export class WebRtcPlayerController {
|
|
|
1356
1105
|
// add the streamers to the UI
|
|
1357
1106
|
const settingOptions = [...messageStreamerList.ids]; // copy the original messageStreamerList.ids
|
|
1358
1107
|
settingOptions.unshift(''); // add an empty option at the top
|
|
1359
|
-
this.config.setOptionSettingOptions(
|
|
1360
|
-
OptionParameters.StreamerId,
|
|
1361
|
-
settingOptions
|
|
1362
|
-
);
|
|
1108
|
+
this.config.setOptionSettingOptions(OptionParameters.StreamerId, settingOptions);
|
|
1363
1109
|
|
|
1364
1110
|
let autoSelectedStreamerId: string = '';
|
|
1365
1111
|
const waitForStreamer = this.config.isFlagEnabled(Flags.WaitForStreamer);
|
|
@@ -1368,7 +1114,7 @@ export class WebRtcPlayerController {
|
|
|
1368
1114
|
|
|
1369
1115
|
// first we figure out a wanted streamer id through various means
|
|
1370
1116
|
const useUrlParams = this.config.useUrlParams;
|
|
1371
|
-
const urlParams = new
|
|
1117
|
+
const urlParams = new IURLSearchParams(window.location.search);
|
|
1372
1118
|
if (useUrlParams && urlParams.has(OptionParameters.StreamerId)) {
|
|
1373
1119
|
// if we've set the streamer id on the url we only want that streamer id
|
|
1374
1120
|
wantedStreamerId = urlParams.get(OptionParameters.StreamerId);
|
|
@@ -1388,20 +1134,17 @@ export class WebRtcPlayerController {
|
|
|
1388
1134
|
|
|
1389
1135
|
// if we found a streamer id to auto select, select it
|
|
1390
1136
|
if (autoSelectedStreamerId) {
|
|
1391
|
-
this.isReconnecting = false;
|
|
1392
1137
|
this.reconnectAttempt = 0;
|
|
1393
|
-
this.
|
|
1394
|
-
|
|
1395
|
-
autoSelectedStreamerId
|
|
1396
|
-
);
|
|
1138
|
+
this.isReconnecting = false;
|
|
1139
|
+
this.config.setOptionSettingValue(OptionParameters.StreamerId, autoSelectedStreamerId);
|
|
1397
1140
|
} else {
|
|
1398
1141
|
// no auto selected streamer.
|
|
1399
1142
|
// if we're waiting for a streamer then try reconnecting
|
|
1400
1143
|
if (waitForStreamer) {
|
|
1401
1144
|
if (this.reconnectAttempt < reconnectLimit) {
|
|
1402
1145
|
// still reconnects available
|
|
1403
|
-
this.isReconnecting = true;
|
|
1404
1146
|
this.reconnectAttempt++;
|
|
1147
|
+
this.isReconnecting = true;
|
|
1405
1148
|
setTimeout(() => {
|
|
1406
1149
|
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.listStreamers));
|
|
1407
1150
|
}, reconnectDelay);
|
|
@@ -1409,7 +1152,7 @@ export class WebRtcPlayerController {
|
|
|
1409
1152
|
// We've exhausted our reconnect attempts, return to main screen
|
|
1410
1153
|
this.reconnectAttempt = 0;
|
|
1411
1154
|
this.isReconnecting = false;
|
|
1412
|
-
this.
|
|
1155
|
+
this.enableAutoReconnect = false;
|
|
1413
1156
|
}
|
|
1414
1157
|
}
|
|
1415
1158
|
}
|
|
@@ -1432,7 +1175,7 @@ export class WebRtcPlayerController {
|
|
|
1432
1175
|
|
|
1433
1176
|
// temporarily prevent onChange from firing (it would try to subscribe to the streamer again)
|
|
1434
1177
|
const oldOnChange = streamerListOptions.onChange;
|
|
1435
|
-
streamerListOptions.onChange = () => {
|
|
1178
|
+
streamerListOptions.onChange = () => {};
|
|
1436
1179
|
|
|
1437
1180
|
// change the selected entry.
|
|
1438
1181
|
const streamerList = streamerListOptions.options;
|
|
@@ -1468,7 +1211,7 @@ export class WebRtcPlayerController {
|
|
|
1468
1211
|
* @param Answer - Answer SDP from the peer.
|
|
1469
1212
|
*/
|
|
1470
1213
|
handleWebRtcAnswer(Answer: Messages.answer) {
|
|
1471
|
-
Logger.
|
|
1214
|
+
Logger.Info(`Got answer sdp ${Answer.sdp}`);
|
|
1472
1215
|
|
|
1473
1216
|
const sdpAnswer: RTCSessionDescriptionInit = {
|
|
1474
1217
|
sdp: Answer.sdp,
|
|
@@ -1484,7 +1227,7 @@ export class WebRtcPlayerController {
|
|
|
1484
1227
|
* @param Offer - Offer SDP from the peer.
|
|
1485
1228
|
*/
|
|
1486
1229
|
handleWebRtcOffer(Offer: Messages.offer) {
|
|
1487
|
-
Logger.
|
|
1230
|
+
Logger.Info(`Got offer sdp ${Offer.sdp}`);
|
|
1488
1231
|
|
|
1489
1232
|
this.isUsingSFU = Offer.sfu ? Offer.sfu : false;
|
|
1490
1233
|
if (this.isUsingSFU) {
|
|
@@ -1512,8 +1255,7 @@ export class WebRtcPlayerController {
|
|
|
1512
1255
|
id: DataChannels.sendStreamId
|
|
1513
1256
|
};
|
|
1514
1257
|
|
|
1515
|
-
const unidirectional =
|
|
1516
|
-
DataChannels.sendStreamId != DataChannels.recvStreamId;
|
|
1258
|
+
const unidirectional = DataChannels.sendStreamId != DataChannels.recvStreamId;
|
|
1517
1259
|
|
|
1518
1260
|
this.sendrecvDataChannelController.createDataChannel(
|
|
1519
1261
|
this.peerConnectionController.peerConnection,
|
|
@@ -1536,14 +1278,11 @@ export class WebRtcPlayerController {
|
|
|
1536
1278
|
this.recvDataChannelController.handleOnOpen = () =>
|
|
1537
1279
|
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.peerDataChannelsReady));
|
|
1538
1280
|
// If we're uni-directional, only the recv data channel should handle incoming messages
|
|
1539
|
-
this.recvDataChannelController.handleOnMessage = (
|
|
1540
|
-
ev: MessageEvent
|
|
1541
|
-
) => this.handleOnMessage(ev);
|
|
1281
|
+
this.recvDataChannelController.handleOnMessage = (ev: MessageEvent) => this.handleOnMessage(ev);
|
|
1542
1282
|
} else {
|
|
1543
1283
|
// else our primary datachannel is send/recv so it can handle incoming messages
|
|
1544
|
-
this.sendrecvDataChannelController.handleOnMessage = (
|
|
1545
|
-
ev
|
|
1546
|
-
) => this.handleOnMessage(ev);
|
|
1284
|
+
this.sendrecvDataChannelController.handleOnMessage = (ev: MessageEvent) =>
|
|
1285
|
+
this.handleOnMessage(ev);
|
|
1547
1286
|
}
|
|
1548
1287
|
}
|
|
1549
1288
|
|
|
@@ -1570,11 +1309,7 @@ export class WebRtcPlayerController {
|
|
|
1570
1309
|
* @param iceCandidate - Ice Candidate from Server
|
|
1571
1310
|
*/
|
|
1572
1311
|
handleIceCandidate(iceCandidate: RTCIceCandidateInit) {
|
|
1573
|
-
Logger.
|
|
1574
|
-
Logger.GetStackTrace(),
|
|
1575
|
-
'Web RTC Controller: onWebRtcIce',
|
|
1576
|
-
6
|
|
1577
|
-
);
|
|
1312
|
+
Logger.Info('Web RTC Controller: onWebRtcIce');
|
|
1578
1313
|
|
|
1579
1314
|
const candidate = new RTCIceCandidate(iceCandidate);
|
|
1580
1315
|
this.peerConnectionController.handleOnIce(candidate);
|
|
@@ -1585,9 +1320,11 @@ export class WebRtcPlayerController {
|
|
|
1585
1320
|
* @param iceEvent - RTC Peer ConnectionIceEvent) {
|
|
1586
1321
|
*/
|
|
1587
1322
|
handleSendIceCandidate(iceEvent: RTCPeerConnectionIceEvent) {
|
|
1588
|
-
Logger.
|
|
1323
|
+
Logger.Info('OnIceCandidate');
|
|
1589
1324
|
if (iceEvent.candidate && iceEvent.candidate.candidate) {
|
|
1590
|
-
this.protocol.sendMessage(
|
|
1325
|
+
this.protocol.sendMessage(
|
|
1326
|
+
MessageHelpers.createMessage(Messages.iceCandidate, { candidate: iceEvent.candidate })
|
|
1327
|
+
);
|
|
1591
1328
|
}
|
|
1592
1329
|
}
|
|
1593
1330
|
|
|
@@ -1596,18 +1333,12 @@ export class WebRtcPlayerController {
|
|
|
1596
1333
|
* @param iceEvent - RTC Peer ConnectionIceEvent) {
|
|
1597
1334
|
*/
|
|
1598
1335
|
handleDataChannel(datachannelEvent: RTCDataChannelEvent) {
|
|
1599
|
-
Logger.
|
|
1600
|
-
|
|
1601
|
-
'Data channel created for us by browser as we are a receiving peer.',
|
|
1602
|
-
6
|
|
1603
|
-
);
|
|
1604
|
-
this.sendrecvDataChannelController.dataChannel =
|
|
1605
|
-
datachannelEvent.channel;
|
|
1336
|
+
Logger.Info('Data channel created for us by browser as we are a receiving peer.');
|
|
1337
|
+
this.sendrecvDataChannelController.dataChannel = datachannelEvent.channel;
|
|
1606
1338
|
// Data channel was created for us, so we just need to setup its callbacks and array type
|
|
1607
1339
|
this.sendrecvDataChannelController.setupDataChannel();
|
|
1608
|
-
this.sendrecvDataChannelController.handleOnMessage = (
|
|
1609
|
-
ev
|
|
1610
|
-
) => this.handleOnMessage(ev);
|
|
1340
|
+
this.sendrecvDataChannelController.handleOnMessage = (ev: MessageEvent<ArrayBuffer>) =>
|
|
1341
|
+
this.handleOnMessage(ev);
|
|
1611
1342
|
}
|
|
1612
1343
|
|
|
1613
1344
|
/**
|
|
@@ -1615,11 +1346,7 @@ export class WebRtcPlayerController {
|
|
|
1615
1346
|
* @param offer - RTC Session Description
|
|
1616
1347
|
*/
|
|
1617
1348
|
handleSendWebRTCOffer(offer: RTCSessionDescriptionInit) {
|
|
1618
|
-
Logger.
|
|
1619
|
-
Logger.GetStackTrace(),
|
|
1620
|
-
'Sending the offer to the Server',
|
|
1621
|
-
6
|
|
1622
|
-
);
|
|
1349
|
+
Logger.Info('Sending the offer to the Server');
|
|
1623
1350
|
|
|
1624
1351
|
const extraParams = {
|
|
1625
1352
|
sdp: offer.sdp,
|
|
@@ -1635,11 +1362,7 @@ export class WebRtcPlayerController {
|
|
|
1635
1362
|
* @param answer - RTC Session Description
|
|
1636
1363
|
*/
|
|
1637
1364
|
handleSendWebRTCAnswer(answer: RTCSessionDescriptionInit) {
|
|
1638
|
-
Logger.
|
|
1639
|
-
Logger.GetStackTrace(),
|
|
1640
|
-
'Sending the answer to the Server',
|
|
1641
|
-
6
|
|
1642
|
-
);
|
|
1365
|
+
Logger.Info('Sending the answer to the Server');
|
|
1643
1366
|
|
|
1644
1367
|
const extraParams = {
|
|
1645
1368
|
sdp: answer.sdp,
|
|
@@ -1659,22 +1382,23 @@ export class WebRtcPlayerController {
|
|
|
1659
1382
|
*/
|
|
1660
1383
|
setUpMouseAndFreezeFrame() {
|
|
1661
1384
|
// Calculating and normalizing positions depends on the width and height of the player.
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1385
|
+
const playerElement = this.videoPlayer.getVideoParentElement();
|
|
1386
|
+
const videoElement = this.videoPlayer.getVideoElement();
|
|
1387
|
+
this.coordinateConverter.reconfigure(
|
|
1388
|
+
{ width: playerElement.clientWidth, height: playerElement.clientHeight },
|
|
1389
|
+
{ width: videoElement.videoWidth, height: videoElement.videoHeight }
|
|
1390
|
+
);
|
|
1666
1391
|
this.freezeFrameController.freezeFrame.resize();
|
|
1667
1392
|
}
|
|
1668
1393
|
|
|
1669
1394
|
/**
|
|
1670
1395
|
* Close the Connection to the signaling server
|
|
1671
1396
|
*/
|
|
1672
|
-
closeSignalingServer(message: string) {
|
|
1673
|
-
// We explicitly called close, therefore we don't want to trigger auto reconnect
|
|
1397
|
+
closeSignalingServer(message: string, allowReconnect: boolean) {
|
|
1674
1398
|
this.locallyClosed = true;
|
|
1675
|
-
this.
|
|
1399
|
+
this.enableAutoReconnect = allowReconnect;
|
|
1676
1400
|
this.disconnectMessage = message;
|
|
1677
|
-
this.protocol?.disconnect();
|
|
1401
|
+
this.protocol?.disconnect(1000, message);
|
|
1678
1402
|
}
|
|
1679
1403
|
|
|
1680
1404
|
/**
|
|
@@ -1688,7 +1412,7 @@ export class WebRtcPlayerController {
|
|
|
1688
1412
|
* Close all connections
|
|
1689
1413
|
*/
|
|
1690
1414
|
close() {
|
|
1691
|
-
this.closeSignalingServer('');
|
|
1415
|
+
this.closeSignalingServer('', false);
|
|
1692
1416
|
this.closePeerConnection();
|
|
1693
1417
|
}
|
|
1694
1418
|
|
|
@@ -1705,20 +1429,20 @@ export class WebRtcPlayerController {
|
|
|
1705
1429
|
sendLatencyTest() {
|
|
1706
1430
|
this.latencyStartTime = Date.now();
|
|
1707
1431
|
|
|
1708
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1432
|
+
this.streamMessageController.toStreamerHandlers.get('LatencyTest')([
|
|
1433
|
+
JSON.stringify({
|
|
1434
|
+
StartTime: this.latencyStartTime
|
|
1435
|
+
})
|
|
1436
|
+
]);
|
|
1713
1437
|
}
|
|
1714
1438
|
|
|
1715
1439
|
/**
|
|
1716
1440
|
* Send a Data Channel Latency Test Request to the UE Instance
|
|
1717
1441
|
*/
|
|
1718
1442
|
sendDataChannelLatencyTest(descriptor: DataChannelLatencyTestRequest) {
|
|
1719
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1720
|
-
|
|
1721
|
-
|
|
1443
|
+
this.streamMessageController.toStreamerHandlers.get('DataChannelLatencyTest')([
|
|
1444
|
+
JSON.stringify(descriptor)
|
|
1445
|
+
]);
|
|
1722
1446
|
}
|
|
1723
1447
|
|
|
1724
1448
|
/**
|
|
@@ -1731,14 +1455,14 @@ export class WebRtcPlayerController {
|
|
|
1731
1455
|
* to aim for the best quality it can on the given network link.
|
|
1732
1456
|
*/
|
|
1733
1457
|
sendEncoderMinQP(minQP: number) {
|
|
1734
|
-
Logger.
|
|
1458
|
+
Logger.Info(`MinQP=${minQP}\n`);
|
|
1735
1459
|
|
|
1736
1460
|
if (minQP != null) {
|
|
1737
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1461
|
+
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1462
|
+
JSON.stringify({
|
|
1463
|
+
'Encoder.MinQP': minQP
|
|
1464
|
+
})
|
|
1465
|
+
]);
|
|
1742
1466
|
}
|
|
1743
1467
|
}
|
|
1744
1468
|
|
|
@@ -1752,68 +1476,68 @@ export class WebRtcPlayerController {
|
|
|
1752
1476
|
* to drop quality as low as needed on the given network link.
|
|
1753
1477
|
*/
|
|
1754
1478
|
sendEncoderMaxQP(maxQP: number) {
|
|
1755
|
-
Logger.
|
|
1479
|
+
Logger.Info(`MaxQP=${maxQP}\n`);
|
|
1756
1480
|
|
|
1757
1481
|
if (maxQP != null) {
|
|
1758
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1482
|
+
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1483
|
+
JSON.stringify({
|
|
1484
|
+
'Encoder.MaxQP': maxQP
|
|
1485
|
+
})
|
|
1486
|
+
]);
|
|
1763
1487
|
}
|
|
1764
1488
|
}
|
|
1765
1489
|
|
|
1766
1490
|
/**
|
|
1767
|
-
* Send the { WebRTC.MinBitrate: SomeNumber }} command to UE to set
|
|
1768
|
-
* the minimum bitrate that we allow WebRTC to use
|
|
1491
|
+
* Send the { WebRTC.MinBitrate: SomeNumber }} command to UE to set
|
|
1492
|
+
* the minimum bitrate that we allow WebRTC to use
|
|
1769
1493
|
* (note setting this too high in poor networks can be problematic).
|
|
1770
1494
|
* @param minBitrate - The minimum bitrate we would like WebRTC to not fall below.
|
|
1771
1495
|
*/
|
|
1772
1496
|
sendWebRTCMinBitrate(minBitrate: number) {
|
|
1773
|
-
Logger.
|
|
1497
|
+
Logger.Info(`WebRTC Min Bitrate=${minBitrate}`);
|
|
1774
1498
|
if (minBitrate != null) {
|
|
1775
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1499
|
+
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1500
|
+
JSON.stringify({
|
|
1501
|
+
'WebRTC.MinBitrate': minBitrate
|
|
1502
|
+
})
|
|
1503
|
+
]);
|
|
1780
1504
|
}
|
|
1781
1505
|
}
|
|
1782
1506
|
|
|
1783
1507
|
/**
|
|
1784
|
-
* Send the { WebRTC.MaxBitrate: SomeNumber }} command to UE to set
|
|
1785
|
-
* the minimum bitrate that we allow WebRTC to use
|
|
1508
|
+
* Send the { WebRTC.MaxBitrate: SomeNumber }} command to UE to set
|
|
1509
|
+
* the minimum bitrate that we allow WebRTC to use
|
|
1786
1510
|
* (note setting this too low could result in blocky video).
|
|
1787
1511
|
* @param minBitrate - The minimum bitrate we would like WebRTC to not fall below.
|
|
1788
1512
|
*/
|
|
1789
1513
|
sendWebRTCMaxBitrate(maxBitrate: number) {
|
|
1790
|
-
Logger.
|
|
1514
|
+
Logger.Info(`WebRTC Max Bitrate=${maxBitrate}`);
|
|
1791
1515
|
if (maxBitrate != null) {
|
|
1792
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1516
|
+
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1517
|
+
JSON.stringify({
|
|
1518
|
+
'WebRTC.MaxBitrate': maxBitrate
|
|
1519
|
+
})
|
|
1520
|
+
]);
|
|
1797
1521
|
}
|
|
1798
1522
|
}
|
|
1799
1523
|
|
|
1800
1524
|
/**
|
|
1801
1525
|
* Send the { WebRTC.Fps: SomeNumber }} UE 5.0+
|
|
1802
|
-
* and { WebRTC.MaxFps } UE 4.27 command to set
|
|
1803
|
-
* the maximum fps we would like WebRTC to stream at.
|
|
1526
|
+
* and { WebRTC.MaxFps } UE 4.27 command to set
|
|
1527
|
+
* the maximum fps we would like WebRTC to stream at.
|
|
1804
1528
|
* @param fps - The maximum stream fps.
|
|
1805
1529
|
*/
|
|
1806
1530
|
sendWebRTCFps(fps: number) {
|
|
1807
|
-
Logger.
|
|
1531
|
+
Logger.Info(`WebRTC FPS=${fps}`);
|
|
1808
1532
|
if (fps != null) {
|
|
1809
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1810
|
-
'
|
|
1811
|
-
|
|
1533
|
+
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1534
|
+
JSON.stringify({ 'WebRTC.Fps': fps })
|
|
1535
|
+
]);
|
|
1812
1536
|
|
|
1813
1537
|
/* TODO: Remove when UE 4.27 unsupported. */
|
|
1814
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1815
|
-
'
|
|
1816
|
-
|
|
1538
|
+
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1539
|
+
JSON.stringify({ 'WebRTC.MaxFps': fps })
|
|
1540
|
+
]);
|
|
1817
1541
|
}
|
|
1818
1542
|
}
|
|
1819
1543
|
|
|
@@ -1821,26 +1545,16 @@ export class WebRtcPlayerController {
|
|
|
1821
1545
|
* Sends the UI Descriptor `stat fps` to the UE Instance
|
|
1822
1546
|
*/
|
|
1823
1547
|
sendShowFps(): void {
|
|
1824
|
-
Logger.
|
|
1825
|
-
Logger.GetStackTrace(),
|
|
1826
|
-
'---- Sending show stat to UE ----',
|
|
1827
|
-
6
|
|
1828
|
-
);
|
|
1548
|
+
Logger.Info('---- Sending show stat to UE ----');
|
|
1829
1549
|
|
|
1830
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1831
|
-
'Command'
|
|
1832
|
-
)([JSON.stringify({ 'stat.fps': '' })]);
|
|
1550
|
+
this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify({ 'stat.fps': '' })]);
|
|
1833
1551
|
}
|
|
1834
1552
|
|
|
1835
1553
|
/**
|
|
1836
1554
|
* Send an Iframe request to the streamer
|
|
1837
1555
|
*/
|
|
1838
1556
|
sendIframeRequest(): void {
|
|
1839
|
-
Logger.
|
|
1840
|
-
Logger.GetStackTrace(),
|
|
1841
|
-
'---- Sending Request for an IFrame ----',
|
|
1842
|
-
6
|
|
1843
|
-
);
|
|
1557
|
+
Logger.Info('---- Sending Request for an IFrame ----');
|
|
1844
1558
|
this.streamMessageController.toStreamerHandlers.get('IFrameRequest')();
|
|
1845
1559
|
}
|
|
1846
1560
|
|
|
@@ -1848,58 +1562,38 @@ export class WebRtcPlayerController {
|
|
|
1848
1562
|
* Send a UIInteraction message
|
|
1849
1563
|
*/
|
|
1850
1564
|
emitUIInteraction(descriptor: object | string) {
|
|
1851
|
-
Logger.
|
|
1852
|
-
Logger.GetStackTrace(),
|
|
1853
|
-
'---- Sending custom UIInteraction message ----',
|
|
1854
|
-
6
|
|
1855
|
-
);
|
|
1565
|
+
Logger.Info('---- Sending custom UIInteraction message ----');
|
|
1856
1566
|
|
|
1857
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1858
|
-
'UIInteraction'
|
|
1859
|
-
)([JSON.stringify(descriptor)]);
|
|
1567
|
+
this.streamMessageController.toStreamerHandlers.get('UIInteraction')([JSON.stringify(descriptor)]);
|
|
1860
1568
|
}
|
|
1861
1569
|
|
|
1862
1570
|
/**
|
|
1863
1571
|
* Send a Command message
|
|
1864
1572
|
*/
|
|
1865
1573
|
emitCommand(descriptor: object) {
|
|
1866
|
-
Logger.
|
|
1867
|
-
Logger.GetStackTrace(),
|
|
1868
|
-
'---- Sending custom Command message ----',
|
|
1869
|
-
6
|
|
1870
|
-
);
|
|
1574
|
+
Logger.Info('---- Sending custom Command message ----');
|
|
1871
1575
|
|
|
1872
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1873
|
-
'Command'
|
|
1874
|
-
)([JSON.stringify(descriptor)]);
|
|
1576
|
+
this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify(descriptor)]);
|
|
1875
1577
|
}
|
|
1876
1578
|
|
|
1877
1579
|
/**
|
|
1878
1580
|
* Send a console command message
|
|
1879
1581
|
*/
|
|
1880
1582
|
emitConsoleCommand(command: string) {
|
|
1881
|
-
Logger.
|
|
1882
|
-
Logger.GetStackTrace(),
|
|
1883
|
-
'---- Sending custom Command:ConsoleCommand message ----',
|
|
1884
|
-
6
|
|
1885
|
-
);
|
|
1583
|
+
Logger.Info('---- Sending custom Command:ConsoleCommand message ----');
|
|
1886
1584
|
|
|
1887
|
-
this.streamMessageController.toStreamerHandlers.get(
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1585
|
+
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1586
|
+
JSON.stringify({
|
|
1587
|
+
ConsoleCommand: command
|
|
1588
|
+
})
|
|
1589
|
+
]);
|
|
1892
1590
|
}
|
|
1893
1591
|
|
|
1894
1592
|
/**
|
|
1895
1593
|
* Sends a request to the UE Instance to have ownership of Quality
|
|
1896
1594
|
*/
|
|
1897
1595
|
sendRequestQualityControlOwnership(): void {
|
|
1898
|
-
Logger.
|
|
1899
|
-
Logger.GetStackTrace(),
|
|
1900
|
-
'---- Sending Request to Control Quality ----',
|
|
1901
|
-
6
|
|
1902
|
-
);
|
|
1596
|
+
Logger.Info('---- Sending Request to Control Quality ----');
|
|
1903
1597
|
this.toStreamerMessagesController.SendRequestQualityControl();
|
|
1904
1598
|
}
|
|
1905
1599
|
|
|
@@ -1908,14 +1602,8 @@ export class WebRtcPlayerController {
|
|
|
1908
1602
|
* @param message - Latency Test Timings
|
|
1909
1603
|
*/
|
|
1910
1604
|
handleLatencyTestResult(message: ArrayBuffer) {
|
|
1911
|
-
Logger.
|
|
1912
|
-
|
|
1913
|
-
'DataChannelReceiveMessageType.latencyTest',
|
|
1914
|
-
6
|
|
1915
|
-
);
|
|
1916
|
-
const latencyAsString = new TextDecoder('utf-16').decode(
|
|
1917
|
-
message.slice(1)
|
|
1918
|
-
);
|
|
1605
|
+
Logger.Info('DataChannelReceiveMessageType.latencyTest');
|
|
1606
|
+
const latencyAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
1919
1607
|
const latencyTestResults: LatencyTestResults = new LatencyTestResults();
|
|
1920
1608
|
Object.assign(latencyTestResults, JSON.parse(latencyAsString));
|
|
1921
1609
|
latencyTestResults.processFields();
|
|
@@ -1924,26 +1612,19 @@ export class WebRtcPlayerController {
|
|
|
1924
1612
|
latencyTestResults.browserReceiptTimeMs = Date.now();
|
|
1925
1613
|
|
|
1926
1614
|
latencyTestResults.latencyExcludingDecode = ~~(
|
|
1927
|
-
latencyTestResults.browserReceiptTimeMs -
|
|
1928
|
-
latencyTestResults.testStartTimeMs
|
|
1615
|
+
latencyTestResults.browserReceiptTimeMs - latencyTestResults.testStartTimeMs
|
|
1929
1616
|
);
|
|
1930
1617
|
latencyTestResults.testDuration = ~~(
|
|
1931
|
-
latencyTestResults.TransmissionTimeMs -
|
|
1932
|
-
latencyTestResults.ReceiptTimeMs
|
|
1618
|
+
latencyTestResults.TransmissionTimeMs - latencyTestResults.ReceiptTimeMs
|
|
1933
1619
|
);
|
|
1934
1620
|
latencyTestResults.networkLatency = ~~(
|
|
1935
|
-
latencyTestResults.latencyExcludingDecode -
|
|
1936
|
-
latencyTestResults.testDuration
|
|
1621
|
+
latencyTestResults.latencyExcludingDecode - latencyTestResults.testDuration
|
|
1937
1622
|
);
|
|
1938
1623
|
|
|
1939
|
-
if (
|
|
1940
|
-
latencyTestResults.frameDisplayDeltaTimeMs
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
latencyTestResults.endToEndLatency =
|
|
1944
|
-
~~(latencyTestResults.frameDisplayDeltaTimeMs +
|
|
1945
|
-
latencyTestResults.networkLatency,
|
|
1946
|
-
+latencyTestResults.CaptureToSendMs);
|
|
1624
|
+
if (latencyTestResults.frameDisplayDeltaTimeMs && latencyTestResults.browserReceiptTimeMs) {
|
|
1625
|
+
latencyTestResults.endToEndLatency = ~~(latencyTestResults.frameDisplayDeltaTimeMs +
|
|
1626
|
+
latencyTestResults.networkLatency,
|
|
1627
|
+
+latencyTestResults.CaptureToSendMs);
|
|
1947
1628
|
}
|
|
1948
1629
|
this.pixelStreaming._onLatencyTestResult(latencyTestResults);
|
|
1949
1630
|
}
|
|
@@ -1953,14 +1634,8 @@ export class WebRtcPlayerController {
|
|
|
1953
1634
|
* @param message - Data Channel Latency Test Response
|
|
1954
1635
|
*/
|
|
1955
1636
|
handleDataChannelLatencyTestResponse(message: ArrayBuffer) {
|
|
1956
|
-
Logger.
|
|
1957
|
-
|
|
1958
|
-
'DataChannelReceiveMessageType.dataChannelLatencyResponse',
|
|
1959
|
-
6
|
|
1960
|
-
);
|
|
1961
|
-
const responseAsString = new TextDecoder('utf-16').decode(
|
|
1962
|
-
message.slice(1)
|
|
1963
|
-
);
|
|
1637
|
+
Logger.Info('DataChannelReceiveMessageType.dataChannelLatencyResponse');
|
|
1638
|
+
const responseAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
1964
1639
|
const latencyTestResponse: DataChannelLatencyTestResponse = JSON.parse(responseAsString);
|
|
1965
1640
|
this.pixelStreaming._onDataChannelLatencyTestResponse(latencyTestResponse);
|
|
1966
1641
|
}
|
|
@@ -1970,14 +1645,8 @@ export class WebRtcPlayerController {
|
|
|
1970
1645
|
* @param message - Initial Encoder and Web RTC Settings
|
|
1971
1646
|
*/
|
|
1972
1647
|
handleInitialSettings(message: ArrayBuffer) {
|
|
1973
|
-
Logger.
|
|
1974
|
-
|
|
1975
|
-
'DataChannelReceiveMessageType.InitialSettings',
|
|
1976
|
-
6
|
|
1977
|
-
);
|
|
1978
|
-
const payloadAsString = new TextDecoder('utf-16').decode(
|
|
1979
|
-
message.slice(1)
|
|
1980
|
-
);
|
|
1648
|
+
Logger.Info('DataChannelReceiveMessageType.InitialSettings');
|
|
1649
|
+
const payloadAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
1981
1650
|
const parsedInitialSettings = JSON.parse(payloadAsString);
|
|
1982
1651
|
|
|
1983
1652
|
const initialSettings: InitialSettings = new InitialSettings();
|
|
@@ -1991,11 +1660,13 @@ export class WebRtcPlayerController {
|
|
|
1991
1660
|
}
|
|
1992
1661
|
|
|
1993
1662
|
if (parsedInitialSettings.PixelStreaming) {
|
|
1994
|
-
initialSettings.PixelStreamingSettings =
|
|
1995
|
-
parsedInitialSettings.PixelStreaming;
|
|
1663
|
+
initialSettings.PixelStreamingSettings = parsedInitialSettings.PixelStreaming;
|
|
1996
1664
|
}
|
|
1997
1665
|
|
|
1998
|
-
if (
|
|
1666
|
+
if (
|
|
1667
|
+
parsedInitialSettings.ConfigOptions &&
|
|
1668
|
+
parsedInitialSettings.ConfigOptions.DefaultToHover !== undefined
|
|
1669
|
+
) {
|
|
1999
1670
|
this.config.setFlagEnabled(
|
|
2000
1671
|
Flags.HoveringMouseMode,
|
|
2001
1672
|
!!parsedInitialSettings.ConfigOptions.DefaultToHover
|
|
@@ -2003,7 +1674,7 @@ export class WebRtcPlayerController {
|
|
|
2003
1674
|
}
|
|
2004
1675
|
|
|
2005
1676
|
initialSettings.ueCompatible();
|
|
2006
|
-
Logger.
|
|
1677
|
+
Logger.Info(payloadAsString);
|
|
2007
1678
|
|
|
2008
1679
|
this.pixelStreaming._onInitialSettings(initialSettings);
|
|
2009
1680
|
}
|
|
@@ -2013,14 +1684,8 @@ export class WebRtcPlayerController {
|
|
|
2013
1684
|
* @param message - Encoders Quantization Parameter
|
|
2014
1685
|
*/
|
|
2015
1686
|
handleVideoEncoderAvgQP(message: ArrayBuffer) {
|
|
2016
|
-
Logger.
|
|
2017
|
-
|
|
2018
|
-
'DataChannelReceiveMessageType.VideoEncoderAvgQP',
|
|
2019
|
-
6
|
|
2020
|
-
);
|
|
2021
|
-
const AvgQP = Number(
|
|
2022
|
-
new TextDecoder('utf-16').decode(message.slice(1))
|
|
2023
|
-
);
|
|
1687
|
+
Logger.Info('DataChannelReceiveMessageType.VideoEncoderAvgQP');
|
|
1688
|
+
const AvgQP = Number(new TextDecoder('utf-16').decode(message.slice(1)));
|
|
2024
1689
|
this.setVideoEncoderAvgQP(AvgQP);
|
|
2025
1690
|
}
|
|
2026
1691
|
|
|
@@ -2042,19 +1707,10 @@ export class WebRtcPlayerController {
|
|
|
2042
1707
|
*/
|
|
2043
1708
|
onQualityControlOwnership(message: ArrayBuffer) {
|
|
2044
1709
|
const view = new Uint8Array(message);
|
|
2045
|
-
Logger.
|
|
2046
|
-
Logger.GetStackTrace(),
|
|
2047
|
-
'DataChannelReceiveMessageType.QualityControlOwnership',
|
|
2048
|
-
6
|
|
2049
|
-
);
|
|
1710
|
+
Logger.Info('DataChannelReceiveMessageType.QualityControlOwnership');
|
|
2050
1711
|
this.isQualityController = new Boolean(view[1]).valueOf();
|
|
2051
|
-
Logger.
|
|
2052
|
-
|
|
2053
|
-
`Received quality controller message, will control quality: ${this.isQualityController}`
|
|
2054
|
-
);
|
|
2055
|
-
this.pixelStreaming._onQualityControlOwnership(
|
|
2056
|
-
this.isQualityController
|
|
2057
|
-
);
|
|
1712
|
+
Logger.Info(`Received quality controller message, will control quality: ${this.isQualityController}`);
|
|
1713
|
+
this.pixelStreaming._onQualityControlOwnership(this.isQualityController);
|
|
2058
1714
|
}
|
|
2059
1715
|
|
|
2060
1716
|
/**
|
|
@@ -2089,11 +1745,9 @@ export class WebRtcPlayerController {
|
|
|
2089
1745
|
* enables/disables keyboard event listeners
|
|
2090
1746
|
*/
|
|
2091
1747
|
setKeyboardInputEnabled(isEnabled: boolean) {
|
|
2092
|
-
this.keyboardController?.
|
|
1748
|
+
this.keyboardController?.unregister();
|
|
2093
1749
|
if (isEnabled) {
|
|
2094
|
-
this.keyboardController = this.inputClassesFactory.registerKeyBoard(
|
|
2095
|
-
this.config
|
|
2096
|
-
);
|
|
1750
|
+
this.keyboardController = this.inputClassesFactory.registerKeyBoard(this.config);
|
|
2097
1751
|
}
|
|
2098
1752
|
}
|
|
2099
1753
|
|
|
@@ -2101,13 +1755,12 @@ export class WebRtcPlayerController {
|
|
|
2101
1755
|
* enables/disables mouse event listeners
|
|
2102
1756
|
*/
|
|
2103
1757
|
setMouseInputEnabled(isEnabled: boolean) {
|
|
2104
|
-
this.mouseController?.
|
|
1758
|
+
this.mouseController?.unregister();
|
|
2105
1759
|
if (isEnabled) {
|
|
2106
1760
|
const mouseMode = this.config.isFlagEnabled(Flags.HoveringMouseMode)
|
|
2107
1761
|
? ControlSchemeType.HoveringMouse
|
|
2108
1762
|
: ControlSchemeType.LockedMouse;
|
|
2109
|
-
this.mouseController =
|
|
2110
|
-
this.inputClassesFactory.registerMouse(mouseMode);
|
|
1763
|
+
this.mouseController = this.inputClassesFactory.registerMouse(mouseMode);
|
|
2111
1764
|
}
|
|
2112
1765
|
}
|
|
2113
1766
|
|
|
@@ -2115,11 +1768,10 @@ export class WebRtcPlayerController {
|
|
|
2115
1768
|
* enables/disables touch event listeners
|
|
2116
1769
|
*/
|
|
2117
1770
|
setTouchInputEnabled(isEnabled: boolean) {
|
|
2118
|
-
this.touchController?.
|
|
1771
|
+
this.touchController?.unregister();
|
|
2119
1772
|
if (isEnabled) {
|
|
2120
1773
|
this.touchController = this.inputClassesFactory.registerTouch(
|
|
2121
|
-
this.config.isFlagEnabled(Flags.FakeMouseWithTouches)
|
|
2122
|
-
this.videoElementParentClientRect
|
|
1774
|
+
this.config.isFlagEnabled(Flags.FakeMouseWithTouches)
|
|
2123
1775
|
);
|
|
2124
1776
|
}
|
|
2125
1777
|
}
|
|
@@ -2128,51 +1780,37 @@ export class WebRtcPlayerController {
|
|
|
2128
1780
|
* enables/disables game pad event listeners
|
|
2129
1781
|
*/
|
|
2130
1782
|
setGamePadInputEnabled(isEnabled: boolean) {
|
|
2131
|
-
this.gamePadController?.
|
|
1783
|
+
this.gamePadController?.unregister();
|
|
2132
1784
|
if (isEnabled) {
|
|
2133
1785
|
this.gamePadController = this.inputClassesFactory.registerGamePad();
|
|
2134
|
-
this.gamePadController.onGamepadConnected = () => {
|
|
2135
|
-
this.streamMessageController.toStreamerHandlers.get('GamepadConnected')();
|
|
2136
|
-
}
|
|
2137
|
-
this.gamePadController.onGamepadDisconnected = (controllerIdx: number) => {
|
|
2138
|
-
this.streamMessageController.toStreamerHandlers.get('GamepadDisconnected')([controllerIdx]);
|
|
2139
|
-
}
|
|
2140
1786
|
}
|
|
2141
1787
|
}
|
|
2142
1788
|
|
|
2143
1789
|
registerDataChannelEventEmitters(dataChannel: DataChannelController) {
|
|
2144
1790
|
dataChannel.onOpen = (label, event) =>
|
|
2145
|
-
this.pixelStreaming.dispatchEvent(
|
|
2146
|
-
new DataChannelOpenEvent({ label, event })
|
|
2147
|
-
);
|
|
1791
|
+
this.pixelStreaming.dispatchEvent(new DataChannelOpenEvent({ label, event }));
|
|
2148
1792
|
dataChannel.onClose = (label, event) =>
|
|
2149
|
-
this.pixelStreaming.dispatchEvent(
|
|
2150
|
-
new DataChannelCloseEvent({ label, event })
|
|
2151
|
-
);
|
|
1793
|
+
this.pixelStreaming.dispatchEvent(new DataChannelCloseEvent({ label, event }));
|
|
2152
1794
|
dataChannel.onError = (label, event) =>
|
|
2153
|
-
this.pixelStreaming.dispatchEvent(
|
|
2154
|
-
new DataChannelErrorEvent({ label, event })
|
|
2155
|
-
);
|
|
1795
|
+
this.pixelStreaming.dispatchEvent(new DataChannelErrorEvent({ label, event }));
|
|
2156
1796
|
}
|
|
2157
1797
|
|
|
2158
|
-
public registerMessageHandler(
|
|
1798
|
+
public registerMessageHandler(
|
|
1799
|
+
name: string,
|
|
1800
|
+
direction: MessageDirection,
|
|
1801
|
+
handler?: (data: ArrayBuffer | Array<number | string>) => void
|
|
1802
|
+
) {
|
|
2159
1803
|
if (direction === MessageDirection.FromStreamer && typeof handler === 'undefined') {
|
|
2160
|
-
Logger.Warning(
|
|
2161
|
-
Logger.GetStackTrace(),
|
|
2162
|
-
`Unable to register handler for ${name} as no handler was passed`
|
|
2163
|
-
);
|
|
1804
|
+
Logger.Warning(`Unable to register handler for ${name} as no handler was passed`);
|
|
2164
1805
|
}
|
|
2165
1806
|
|
|
2166
|
-
|
|
2167
1807
|
this.streamMessageController.registerMessageHandler(
|
|
2168
1808
|
direction,
|
|
2169
1809
|
name,
|
|
2170
|
-
(data: Array<number | string>) =>
|
|
2171
|
-
|
|
2172
|
-
name,
|
|
2173
|
-
data
|
|
2174
|
-
) :
|
|
2175
|
-
handler(data)
|
|
1810
|
+
(data: Array<number | string>) =>
|
|
1811
|
+
typeof handler === 'undefined' && direction === MessageDirection.ToStreamer
|
|
1812
|
+
? this.sendMessageController.sendMessageToStreamer(name, data)
|
|
1813
|
+
: handler(data)
|
|
2176
1814
|
);
|
|
2177
1815
|
}
|
|
2178
1816
|
}
|