@epicgames-ps/lib-pixelstreamingfrontend-ue5.5 0.4.6 → 0.4.8
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/.eslintignore +1 -1
- package/.eslintrc.js +1 -0
- package/.lintstagedrc.mjs +7 -0
- package/dist/{commonjs → cjs}/Config/Config.js +4 -0
- package/dist/cjs/Config/Config.js.map +1 -0
- package/dist/{commonjs → cjs}/PixelStreaming/PixelStreaming.js +3 -0
- package/dist/{commonjs → cjs}/PixelStreaming/PixelStreaming.js.map +1 -1
- package/dist/{commonjs → cjs}/Util/EventEmitter.js +8 -1
- package/dist/{commonjs → cjs}/Util/EventEmitter.js.map +1 -1
- package/dist/{commonjs → cjs}/WebRtcPlayer/WebRtcPlayerController.js +21 -1
- package/dist/cjs/WebRtcPlayer/WebRtcPlayerController.js.map +1 -0
- package/dist/esm/AFK/AFKController.js +16 -20
- package/dist/esm/AFK/AFKController.js.map +1 -1
- package/dist/esm/Config/Config.js +73 -81
- package/dist/esm/Config/Config.js.map +1 -1
- package/dist/esm/Config/SettingBase.js +1 -5
- package/dist/esm/Config/SettingBase.js.map +1 -1
- package/dist/esm/Config/SettingFlag.js +2 -6
- package/dist/esm/Config/SettingFlag.js.map +1 -1
- package/dist/esm/Config/SettingNumber.js +2 -6
- package/dist/esm/Config/SettingNumber.js.map +1 -1
- package/dist/esm/Config/SettingOption.js +4 -8
- package/dist/esm/Config/SettingOption.js.map +1 -1
- package/dist/esm/Config/SettingText.js +2 -6
- package/dist/esm/Config/SettingText.js.map +1 -1
- package/dist/esm/DataChannel/DataChannelController.js +6 -10
- package/dist/esm/DataChannel/DataChannelController.js.map +1 -1
- package/dist/esm/DataChannel/DataChannelLatencyTestController.js +5 -9
- package/dist/esm/DataChannel/DataChannelLatencyTestController.js.map +1 -1
- package/dist/esm/DataChannel/DataChannelLatencyTestResults.js +1 -5
- package/dist/esm/DataChannel/DataChannelLatencyTestResults.js.map +1 -1
- package/dist/esm/DataChannel/DataChannelSender.js +4 -8
- package/dist/esm/DataChannel/DataChannelSender.js.map +1 -1
- package/dist/esm/DataChannel/InitialSettings.js +4 -11
- package/dist/esm/DataChannel/InitialSettings.js.map +1 -1
- package/dist/esm/DataChannel/LatencyTestResults.js +4 -8
- package/dist/esm/DataChannel/LatencyTestResults.js.map +1 -1
- package/dist/esm/FreezeFrame/FreezeFrame.js +1 -5
- package/dist/esm/FreezeFrame/FreezeFrame.js.map +1 -1
- package/dist/esm/FreezeFrame/FreezeFrameController.js +7 -11
- package/dist/esm/FreezeFrame/FreezeFrameController.js.map +1 -1
- package/dist/esm/Inputs/GamepadController.js +7 -11
- package/dist/esm/Inputs/GamepadController.js.map +1 -1
- package/dist/esm/Inputs/GamepadTypes.js +1 -4
- package/dist/esm/Inputs/GamepadTypes.js.map +1 -1
- package/dist/esm/Inputs/IInputController.js +1 -2
- package/dist/esm/Inputs/InputClassesFactory.js +21 -26
- package/dist/esm/Inputs/InputClassesFactory.js.map +1 -1
- package/dist/esm/Inputs/KeyCodes.js +1 -4
- package/dist/esm/Inputs/KeyCodes.js.map +1 -1
- package/dist/esm/Inputs/KeyboardController.js +18 -22
- package/dist/esm/Inputs/KeyboardController.js.map +1 -1
- package/dist/esm/Inputs/MouseButtons.js +2 -7
- package/dist/esm/Inputs/MouseButtons.js.map +1 -1
- package/dist/esm/Inputs/MouseController.js +22 -26
- package/dist/esm/Inputs/MouseController.js.map +1 -1
- package/dist/esm/Inputs/MouseControllerHovering.js +2 -6
- package/dist/esm/Inputs/MouseControllerHovering.js.map +1 -1
- package/dist/esm/Inputs/MouseControllerLocked.js +5 -9
- package/dist/esm/Inputs/MouseControllerLocked.js.map +1 -1
- package/dist/esm/Inputs/SpecialKeyCodes.js +1 -5
- package/dist/esm/Inputs/SpecialKeyCodes.js.map +1 -1
- package/dist/esm/Inputs/TouchController.js +4 -8
- package/dist/esm/Inputs/TouchController.js.map +1 -1
- package/dist/esm/Inputs/TouchControllerFake.js +4 -8
- package/dist/esm/Inputs/TouchControllerFake.js.map +1 -1
- package/dist/esm/Inputs/XRGamepadController.js +4 -8
- package/dist/esm/Inputs/XRGamepadController.js.map +1 -1
- package/dist/esm/PeerConnectionController/AggregatedStats.js +19 -23
- package/dist/esm/PeerConnectionController/AggregatedStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/CandidatePairStats.js +1 -5
- package/dist/esm/PeerConnectionController/CandidatePairStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/CandidateStat.js +1 -5
- package/dist/esm/PeerConnectionController/CandidateStat.js.map +1 -1
- package/dist/esm/PeerConnectionController/CodecStats.js +1 -5
- package/dist/esm/PeerConnectionController/CodecStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/DataChannelStats.js +1 -5
- package/dist/esm/PeerConnectionController/DataChannelStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/InboundRTPStats.js +3 -9
- package/dist/esm/PeerConnectionController/InboundRTPStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/InboundTrackStats.js +1 -5
- package/dist/esm/PeerConnectionController/InboundTrackStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/OutBoundRTPStats.js +2 -7
- package/dist/esm/PeerConnectionController/OutBoundRTPStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/PeerConnectionController.js +37 -41
- package/dist/esm/PeerConnectionController/PeerConnectionController.js.map +1 -1
- package/dist/esm/PeerConnectionController/SessionStats.js +1 -5
- package/dist/esm/PeerConnectionController/SessionStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/StreamStats.js +1 -5
- package/dist/esm/PeerConnectionController/StreamStats.js.map +1 -1
- package/dist/esm/PixelStreaming/PixelStreaming.js +118 -119
- package/dist/esm/PixelStreaming/PixelStreaming.js.map +1 -1
- package/dist/esm/UI/OnScreenKeyboard.js +1 -5
- package/dist/esm/UI/OnScreenKeyboard.js.map +1 -1
- package/dist/esm/UeInstanceMessage/ResponseController.js +4 -8
- package/dist/esm/UeInstanceMessage/ResponseController.js.map +1 -1
- package/dist/esm/UeInstanceMessage/SendMessageController.js +5 -9
- package/dist/esm/UeInstanceMessage/SendMessageController.js.map +1 -1
- package/dist/esm/UeInstanceMessage/StreamMessageController.js +6 -11
- package/dist/esm/UeInstanceMessage/StreamMessageController.js.map +1 -1
- package/dist/esm/UeInstanceMessage/ToStreamerMessagesController.js +1 -5
- package/dist/esm/UeInstanceMessage/ToStreamerMessagesController.js.map +1 -1
- package/dist/esm/Util/EventEmitter.js +44 -79
- package/dist/esm/Util/EventEmitter.js.map +1 -1
- package/dist/esm/Util/FileUtil.js +11 -16
- package/dist/esm/Util/FileUtil.js.map +1 -1
- package/dist/esm/Util/IURLSearchParams.js +1 -5
- package/dist/esm/Util/IURLSearchParams.js.map +1 -1
- package/dist/esm/Util/InputCoordTranslator.js +1 -5
- package/dist/esm/Util/InputCoordTranslator.js.map +1 -1
- package/dist/esm/Util/RTCUtils.js +1 -5
- package/dist/esm/Util/RTCUtils.js.map +1 -1
- package/dist/esm/VideoPlayer/StreamController.js +6 -10
- package/dist/esm/VideoPlayer/StreamController.js.map +1 -1
- package/dist/esm/VideoPlayer/VideoPlayer.js +7 -11
- package/dist/esm/VideoPlayer/VideoPlayer.js.map +1 -1
- package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js +246 -230
- package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js.map +1 -1
- package/dist/esm/WebXR/WebXRController.js +12 -16
- package/dist/esm/WebXR/WebXRController.js.map +1 -1
- package/dist/esm/pixelstreamingfrontend.js +23 -58
- package/dist/esm/pixelstreamingfrontend.js.map +1 -1
- package/dist/types/Config/Config.d.ts +1 -0
- package/dist/types/PixelStreaming/PixelStreaming.d.ts +1 -0
- package/dist/types/Util/EventEmitter.d.ts +8 -1
- package/dist/types/WebRtcPlayer/WebRtcPlayerController.d.ts +4 -1
- package/package.json +48 -45
- package/src/Config/Config.ts +16 -0
- package/src/PixelStreaming/PixelStreaming.ts +6 -1
- package/src/Util/EventEmitter.ts +12 -0
- package/src/WebRtcPlayer/WebRtcPlayerController.ts +30 -2
- package/{tsconfig.json → tsconfig.base.json} +4 -2
- package/tsconfig.cjs.json +3 -5
- package/tsconfig.esm.json +3 -3
- package/tsconfig.jest.json +6 -6
- package/dist/commonjs/Config/Config.js.map +0 -1
- package/dist/commonjs/WebRtcPlayer/WebRtcPlayerController.js.map +0 -1
- /package/dist/{commonjs → cjs}/AFK/AFKController.js +0 -0
- /package/dist/{commonjs → cjs}/AFK/AFKController.js.map +0 -0
- /package/dist/{commonjs → cjs}/Config/SettingBase.js +0 -0
- /package/dist/{commonjs → cjs}/Config/SettingBase.js.map +0 -0
- /package/dist/{commonjs → cjs}/Config/SettingFlag.js +0 -0
- /package/dist/{commonjs → cjs}/Config/SettingFlag.js.map +0 -0
- /package/dist/{commonjs → cjs}/Config/SettingNumber.js +0 -0
- /package/dist/{commonjs → cjs}/Config/SettingNumber.js.map +0 -0
- /package/dist/{commonjs → cjs}/Config/SettingOption.js +0 -0
- /package/dist/{commonjs → cjs}/Config/SettingOption.js.map +0 -0
- /package/dist/{commonjs → cjs}/Config/SettingText.js +0 -0
- /package/dist/{commonjs → cjs}/Config/SettingText.js.map +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/DataChannelController.js +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/DataChannelController.js.map +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/DataChannelLatencyTestController.js +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/DataChannelLatencyTestController.js.map +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/DataChannelLatencyTestResults.js +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/DataChannelLatencyTestResults.js.map +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/DataChannelSender.js +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/DataChannelSender.js.map +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/InitialSettings.js +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/InitialSettings.js.map +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/LatencyTestResults.js +0 -0
- /package/dist/{commonjs → cjs}/DataChannel/LatencyTestResults.js.map +0 -0
- /package/dist/{commonjs → cjs}/FreezeFrame/FreezeFrame.js +0 -0
- /package/dist/{commonjs → cjs}/FreezeFrame/FreezeFrame.js.map +0 -0
- /package/dist/{commonjs → cjs}/FreezeFrame/FreezeFrameController.js +0 -0
- /package/dist/{commonjs → cjs}/FreezeFrame/FreezeFrameController.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/GamepadController.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/GamepadController.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/GamepadTypes.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/GamepadTypes.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/IInputController.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/IInputController.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/InputClassesFactory.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/InputClassesFactory.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/KeyCodes.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/KeyCodes.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/KeyboardController.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/KeyboardController.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/MouseButtons.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/MouseButtons.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/MouseController.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/MouseController.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/MouseControllerHovering.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/MouseControllerHovering.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/MouseControllerLocked.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/MouseControllerLocked.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/SpecialKeyCodes.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/SpecialKeyCodes.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/TouchController.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/TouchController.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/TouchControllerFake.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/TouchControllerFake.js.map +0 -0
- /package/dist/{commonjs → cjs}/Inputs/XRGamepadController.js +0 -0
- /package/dist/{commonjs → cjs}/Inputs/XRGamepadController.js.map +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/AggregatedStats.js +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/AggregatedStats.js.map +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/CandidatePairStats.js +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/CandidatePairStats.js.map +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/CandidateStat.js +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/CandidateStat.js.map +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/CodecStats.js +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/CodecStats.js.map +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/DataChannelStats.js +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/DataChannelStats.js.map +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/InboundRTPStats.js +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/InboundRTPStats.js.map +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/InboundTrackStats.js +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/InboundTrackStats.js.map +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/OutBoundRTPStats.js +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/OutBoundRTPStats.js.map +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/PeerConnectionController.js +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/PeerConnectionController.js.map +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/SessionStats.js +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/SessionStats.js.map +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/StreamStats.js +0 -0
- /package/dist/{commonjs → cjs}/PeerConnectionController/StreamStats.js.map +0 -0
- /package/dist/{commonjs → cjs}/UI/OnScreenKeyboard.js +0 -0
- /package/dist/{commonjs → cjs}/UI/OnScreenKeyboard.js.map +0 -0
- /package/dist/{commonjs → cjs}/UeInstanceMessage/ResponseController.js +0 -0
- /package/dist/{commonjs → cjs}/UeInstanceMessage/ResponseController.js.map +0 -0
- /package/dist/{commonjs → cjs}/UeInstanceMessage/SendMessageController.js +0 -0
- /package/dist/{commonjs → cjs}/UeInstanceMessage/SendMessageController.js.map +0 -0
- /package/dist/{commonjs → cjs}/UeInstanceMessage/StreamMessageController.js +0 -0
- /package/dist/{commonjs → cjs}/UeInstanceMessage/StreamMessageController.js.map +0 -0
- /package/dist/{commonjs → cjs}/UeInstanceMessage/ToStreamerMessagesController.js +0 -0
- /package/dist/{commonjs → cjs}/UeInstanceMessage/ToStreamerMessagesController.js.map +0 -0
- /package/dist/{commonjs → cjs}/Util/FileUtil.js +0 -0
- /package/dist/{commonjs → cjs}/Util/FileUtil.js.map +0 -0
- /package/dist/{commonjs → cjs}/Util/IURLSearchParams.js +0 -0
- /package/dist/{commonjs → cjs}/Util/IURLSearchParams.js.map +0 -0
- /package/dist/{commonjs → cjs}/Util/InputCoordTranslator.js +0 -0
- /package/dist/{commonjs → cjs}/Util/InputCoordTranslator.js.map +0 -0
- /package/dist/{commonjs → cjs}/Util/RTCUtils.js +0 -0
- /package/dist/{commonjs → cjs}/Util/RTCUtils.js.map +0 -0
- /package/dist/{commonjs → cjs}/VideoPlayer/StreamController.js +0 -0
- /package/dist/{commonjs → cjs}/VideoPlayer/StreamController.js.map +0 -0
- /package/dist/{commonjs → cjs}/VideoPlayer/VideoPlayer.js +0 -0
- /package/dist/{commonjs → cjs}/VideoPlayer/VideoPlayer.js.map +0 -0
- /package/dist/{commonjs → cjs}/WebXR/WebXRController.js +0 -0
- /package/dist/{commonjs → cjs}/WebXR/WebXRController.js.map +0 -0
- /package/dist/{commonjs → cjs}/pixelstreamingfrontend.js +0 -0
- /package/dist/{commonjs → cjs}/pixelstreamingfrontend.js.map +0 -0
|
@@ -1,31 +1,28 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const EventEmitter_1 = require("../Util/EventEmitter");
|
|
24
|
-
const IURLSearchParams_1 = require("../Util/IURLSearchParams");
|
|
2
|
+
import { WebSocketTransport, Logger, SignallingProtocol, Messages, MessageHelpers, KeepaliveMonitor } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.5';
|
|
3
|
+
import { StreamController } from '../VideoPlayer/StreamController';
|
|
4
|
+
import { FreezeFrameController } from '../FreezeFrame/FreezeFrameController';
|
|
5
|
+
import { AFKController } from '../AFK/AFKController';
|
|
6
|
+
import { DataChannelController } from '../DataChannel/DataChannelController';
|
|
7
|
+
import { PeerConnectionController } from '../PeerConnectionController/PeerConnectionController';
|
|
8
|
+
import { Flags, ControlSchemeType, TextParameters, OptionParameters, NumericParameters } from '../Config/Config';
|
|
9
|
+
import { InitialSettings } from '../DataChannel/InitialSettings';
|
|
10
|
+
import { LatencyTestResults } from '../DataChannel/LatencyTestResults';
|
|
11
|
+
import { FileTemplate, FileUtil } from '../Util/FileUtil';
|
|
12
|
+
import { InputClassesFactory } from '../Inputs/InputClassesFactory';
|
|
13
|
+
import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
|
|
14
|
+
import { StreamMessageController, MessageDirection } from '../UeInstanceMessage/StreamMessageController';
|
|
15
|
+
import { ResponseController } from '../UeInstanceMessage/ResponseController';
|
|
16
|
+
import { SendMessageController } from '../UeInstanceMessage/SendMessageController';
|
|
17
|
+
import { ToStreamerMessagesController } from '../UeInstanceMessage/ToStreamerMessagesController';
|
|
18
|
+
import { DataChannelSender } from '../DataChannel/DataChannelSender';
|
|
19
|
+
import { InputCoordTranslator } from '../Util/InputCoordTranslator';
|
|
20
|
+
import { DataChannelCloseEvent, DataChannelErrorEvent, DataChannelOpenEvent, HideFreezeFrameEvent, LoadFreezeFrameEvent, PlayStreamErrorEvent, PlayStreamEvent, PlayStreamRejectedEvent, StreamerListMessageEvent, StreamerIDChangedMessageEvent } from '../Util/EventEmitter';
|
|
21
|
+
import { IURLSearchParams } from '../Util/IURLSearchParams';
|
|
25
22
|
/**
|
|
26
23
|
* Entry point for the WebRTC Player
|
|
27
24
|
*/
|
|
28
|
-
class WebRtcPlayerController {
|
|
25
|
+
export class WebRtcPlayerController {
|
|
29
26
|
/**
|
|
30
27
|
*
|
|
31
28
|
* @param config - the frontend config object
|
|
@@ -36,19 +33,19 @@ class WebRtcPlayerController {
|
|
|
36
33
|
this.autoJoinTimer = undefined;
|
|
37
34
|
this.config = config;
|
|
38
35
|
this.pixelStreaming = pixelStreaming;
|
|
39
|
-
this.responseController = new
|
|
40
|
-
this.file = new
|
|
36
|
+
this.responseController = new ResponseController();
|
|
37
|
+
this.file = new FileTemplate();
|
|
41
38
|
this.sdpConstraints = {
|
|
42
39
|
offerToReceiveAudio: true,
|
|
43
40
|
offerToReceiveVideo: true
|
|
44
41
|
};
|
|
45
42
|
// set up the afk logic class and connect up its method for closing the signaling server
|
|
46
|
-
this.afkController = new
|
|
43
|
+
this.afkController = new AFKController(this.config, this.pixelStreaming, this.onAfkTriggered.bind(this));
|
|
47
44
|
this.afkController.onAFKTimedOutCallback = () => {
|
|
48
45
|
this.closeSignalingServer('You have been disconnected due to inactivity.', false);
|
|
49
46
|
};
|
|
50
|
-
this.freezeFrameController = new
|
|
51
|
-
this.videoPlayer = new
|
|
47
|
+
this.freezeFrameController = new FreezeFrameController(this.pixelStreaming.videoElementParent);
|
|
48
|
+
this.videoPlayer = new VideoPlayer(this.pixelStreaming.videoElementParent, this.config);
|
|
52
49
|
this.videoPlayer.onVideoInitialized = () => this.handleVideoInitialized();
|
|
53
50
|
// When in match viewport resolution mode, when the browser viewport is resized we send a resize command back to UE.
|
|
54
51
|
this.videoPlayer.onMatchViewportResolutionCallback = (width, height) => {
|
|
@@ -62,41 +59,43 @@ class WebRtcPlayerController {
|
|
|
62
59
|
this.videoPlayer.onResizePlayerCallback = () => {
|
|
63
60
|
this.setUpMouseAndFreezeFrame();
|
|
64
61
|
};
|
|
65
|
-
this.streamController = new
|
|
66
|
-
this.coordinateConverter = new
|
|
67
|
-
this.sendrecvDataChannelController = new
|
|
68
|
-
this.recvDataChannelController = new
|
|
62
|
+
this.streamController = new StreamController(this.videoPlayer);
|
|
63
|
+
this.coordinateConverter = new InputCoordTranslator();
|
|
64
|
+
this.sendrecvDataChannelController = new DataChannelController();
|
|
65
|
+
this.recvDataChannelController = new DataChannelController();
|
|
69
66
|
this.registerDataChannelEventEmitters(this.sendrecvDataChannelController);
|
|
70
67
|
this.registerDataChannelEventEmitters(this.recvDataChannelController);
|
|
71
|
-
this.dataChannelSender = new
|
|
68
|
+
this.dataChannelSender = new DataChannelSender(this.sendrecvDataChannelController);
|
|
72
69
|
this.dataChannelSender.resetAfkWarningTimerOnDataSend = () => this.afkController.resetAfkWarningTimer();
|
|
73
|
-
this.streamMessageController = new
|
|
70
|
+
this.streamMessageController = new StreamMessageController();
|
|
74
71
|
// set up websocket methods
|
|
75
|
-
this.transport = new
|
|
76
|
-
this.protocol = new
|
|
77
|
-
this.protocol.addListener(
|
|
78
|
-
this.protocol.addListener(
|
|
79
|
-
this.protocol.addListener(
|
|
80
|
-
this.protocol.addListener(
|
|
72
|
+
this.transport = new WebSocketTransport();
|
|
73
|
+
this.protocol = new SignallingProtocol(this.transport);
|
|
74
|
+
this.protocol.addListener(Messages.config.typeName, (msg) => this.handleOnConfigMessage(msg));
|
|
75
|
+
this.protocol.addListener(Messages.ping.typeName, (msg) => this.handlePingMessage(msg));
|
|
76
|
+
this.protocol.addListener(Messages.streamerList.typeName, (msg) => this.handleStreamerListMessage(msg));
|
|
77
|
+
this.protocol.addListener(Messages.subscribeFailed.typeName, (msg) => this.handleSubscribeFailedMessage(msg));
|
|
78
|
+
this.protocol.addListener(Messages.streamerIdChanged.typeName, (msg) => this.handleStreamerIDChangedMessage(msg));
|
|
79
|
+
this.protocol.addListener(Messages.playerCount.typeName, (msg) => {
|
|
81
80
|
const playerCountMessage = msg;
|
|
82
81
|
this.pixelStreaming._onPlayerCount(playerCountMessage.count);
|
|
83
82
|
});
|
|
84
|
-
this.protocol.addListener(
|
|
85
|
-
this.protocol.addListener(
|
|
86
|
-
this.protocol.addListener(
|
|
87
|
-
this.protocol.addListener(
|
|
83
|
+
this.protocol.addListener(Messages.answer.typeName, (msg) => this.handleWebRtcAnswer(msg));
|
|
84
|
+
this.protocol.addListener(Messages.offer.typeName, (msg) => this.handleWebRtcOffer(msg));
|
|
85
|
+
this.protocol.addListener(Messages.peerDataChannels.typeName, (msg) => this.handleWebRtcSFUPeerDatachannels(msg));
|
|
86
|
+
this.protocol.addListener(Messages.iceCandidate.typeName, (msg) => {
|
|
88
87
|
const iceCandidateMessage = msg;
|
|
89
88
|
this.handleIceCandidate(iceCandidateMessage.candidate);
|
|
90
89
|
});
|
|
91
90
|
this.protocol.transport.addListener('open', () => {
|
|
92
|
-
const message =
|
|
91
|
+
const message = MessageHelpers.createMessage(Messages.listStreamers);
|
|
93
92
|
this.protocol.sendMessage(message);
|
|
94
93
|
this.reconnectAttempt = 0;
|
|
95
94
|
this.isReconnecting = false;
|
|
96
95
|
});
|
|
97
96
|
this.protocol.transport.addListener('error', () => {
|
|
98
97
|
// dont really need to do anything here since the close event should follow.
|
|
99
|
-
|
|
98
|
+
Logger.Error(`Got a transport error.`);
|
|
100
99
|
});
|
|
101
100
|
this.protocol.transport.addListener('close', (event) => {
|
|
102
101
|
// when we refresh the page during a stream we get the going away code.
|
|
@@ -104,7 +103,7 @@ class WebRtcPlayerController {
|
|
|
104
103
|
// https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code
|
|
105
104
|
// lists all the codes.
|
|
106
105
|
const CODE_GOING_AWAY = 1001;
|
|
107
|
-
const maxReconnectAttempts = this.config.getNumericSettingValue(
|
|
106
|
+
const maxReconnectAttempts = this.config.getNumericSettingValue(NumericParameters.MaxReconnectAttempts);
|
|
108
107
|
const attemptsLeft = this.reconnectAttempt < maxReconnectAttempts;
|
|
109
108
|
const reconnectEnabled = this.forceReconnect || (this.enableAutoReconnect && maxReconnectAttempts > 0 && attemptsLeft);
|
|
110
109
|
const willTryReconnect = reconnectEnabled && event.code != CODE_GOING_AWAY;
|
|
@@ -133,11 +132,11 @@ class WebRtcPlayerController {
|
|
|
133
132
|
}
|
|
134
133
|
});
|
|
135
134
|
// set up the final webRtc player controller methods from within our application so a connection can be activated
|
|
136
|
-
this.sendMessageController = new
|
|
137
|
-
this.toStreamerMessagesController = new
|
|
135
|
+
this.sendMessageController = new SendMessageController(this.dataChannelSender, this.streamMessageController);
|
|
136
|
+
this.toStreamerMessagesController = new ToStreamerMessagesController(this.sendMessageController);
|
|
138
137
|
this.registerMessageHandlers();
|
|
139
138
|
this.streamMessageController.populateDefaultProtocol();
|
|
140
|
-
this.inputClassesFactory = new
|
|
139
|
+
this.inputClassesFactory = new InputClassesFactory(this.streamMessageController, this.videoPlayer, this.coordinateConverter);
|
|
141
140
|
this.isUsingSFU = false;
|
|
142
141
|
this.isUsingSVC = false;
|
|
143
142
|
this.isQualityController = false;
|
|
@@ -146,7 +145,7 @@ class WebRtcPlayerController {
|
|
|
146
145
|
this.forceReconnect = false;
|
|
147
146
|
this.reconnectAttempt = 0;
|
|
148
147
|
this.isReconnecting = false;
|
|
149
|
-
this.config._addOnOptionSettingChangedListener(
|
|
148
|
+
this.config._addOnOptionSettingChangedListener(OptionParameters.StreamerId, (streamerid) => {
|
|
150
149
|
if (streamerid === undefined || streamerid === '') {
|
|
151
150
|
return;
|
|
152
151
|
}
|
|
@@ -154,26 +153,26 @@ class WebRtcPlayerController {
|
|
|
154
153
|
this.peerConnectionController.peerConnection.close();
|
|
155
154
|
this.peerConnectionController.createPeerConnection(this.peerConfig, this.preferredCodec);
|
|
156
155
|
this.subscribedStream = streamerid;
|
|
157
|
-
const message =
|
|
156
|
+
const message = MessageHelpers.createMessage(Messages.subscribe, { streamerId: streamerid });
|
|
158
157
|
this.protocol.sendMessage(message);
|
|
159
158
|
});
|
|
160
|
-
this.config._addOnOptionSettingChangedListener(
|
|
159
|
+
this.config._addOnOptionSettingChangedListener(OptionParameters.PreferredQuality, (preferredQuality) => {
|
|
161
160
|
if (preferredQuality === undefined || preferredQuality === '') {
|
|
162
161
|
return;
|
|
163
162
|
}
|
|
164
163
|
let message;
|
|
165
164
|
if (this.isUsingSVC) {
|
|
166
165
|
// User is using SVC so selected quality will be of the form SxTy(h). Just extract the x and y numbers
|
|
167
|
-
message =
|
|
166
|
+
message = MessageHelpers.createMessage(Messages.layerPreference, {
|
|
168
167
|
spatialLayer: +preferredQuality[1] - 1,
|
|
169
168
|
temporalLayer: +preferredQuality[3] - 1
|
|
170
169
|
});
|
|
171
170
|
}
|
|
172
171
|
else {
|
|
173
172
|
// User is not using SVC so the selected quality will be either Low, Medium or High so we extract the appropriate spatial layer index
|
|
174
|
-
const allQualities = this.config.getSettingOption(
|
|
173
|
+
const allQualities = this.config.getSettingOption(OptionParameters.PreferredQuality).options;
|
|
175
174
|
const qualityIndex = allQualities.indexOf(preferredQuality);
|
|
176
|
-
message =
|
|
175
|
+
message = MessageHelpers.createMessage(Messages.layerPreference, {
|
|
177
176
|
spatialLayer: qualityIndex,
|
|
178
177
|
temporalLayer: 0
|
|
179
178
|
});
|
|
@@ -182,7 +181,7 @@ class WebRtcPlayerController {
|
|
|
182
181
|
});
|
|
183
182
|
this.setVideoEncoderAvgQP(-1);
|
|
184
183
|
this.signallingUrlBuilder = () => {
|
|
185
|
-
const signallingServerUrl = this.config.getTextSettingValue(
|
|
184
|
+
const signallingServerUrl = this.config.getTextSettingValue(TextParameters.SignallingServerUrl);
|
|
186
185
|
return signallingServerUrl;
|
|
187
186
|
};
|
|
188
187
|
}
|
|
@@ -200,7 +199,7 @@ class WebRtcPlayerController {
|
|
|
200
199
|
*/
|
|
201
200
|
handleOnMessage(event) {
|
|
202
201
|
const message = new Uint8Array(event.data);
|
|
203
|
-
|
|
202
|
+
Logger.Info('Message incoming:' + message);
|
|
204
203
|
//try {
|
|
205
204
|
const messageType = this.streamMessageController.fromStreamerMessages.get(message[0]);
|
|
206
205
|
this.streamMessageController.fromStreamerHandlers.get(messageType)(event.data);
|
|
@@ -214,75 +213,75 @@ class WebRtcPlayerController {
|
|
|
214
213
|
registerMessageHandlers() {
|
|
215
214
|
// From Streamer
|
|
216
215
|
// Message events from the streamer have a data type of ArrayBuffer as we force this type in the DatachannelController
|
|
217
|
-
this.streamMessageController.registerMessageHandler(
|
|
218
|
-
this.streamMessageController.registerMessageHandler(
|
|
219
|
-
this.streamMessageController.registerMessageHandler(
|
|
216
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'QualityControlOwnership', (data) => this.onQualityControlOwnership(data));
|
|
217
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'Response', (data) => this.responseController.onResponse(data));
|
|
218
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'Command', (data) => {
|
|
220
219
|
this.onCommand(data);
|
|
221
220
|
});
|
|
222
|
-
this.streamMessageController.registerMessageHandler(
|
|
223
|
-
this.streamMessageController.registerMessageHandler(
|
|
224
|
-
this.streamMessageController.registerMessageHandler(
|
|
225
|
-
this.streamMessageController.registerMessageHandler(
|
|
226
|
-
this.streamMessageController.registerMessageHandler(
|
|
227
|
-
this.streamMessageController.registerMessageHandler(
|
|
228
|
-
this.streamMessageController.registerMessageHandler(
|
|
229
|
-
this.streamMessageController.registerMessageHandler(
|
|
230
|
-
this.streamMessageController.registerMessageHandler(
|
|
231
|
-
this.streamMessageController.registerMessageHandler(
|
|
221
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'FreezeFrame', (data) => this.onFreezeFrameMessage(data));
|
|
222
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'UnfreezeFrame', () => this.invalidateFreezeFrameAndEnableVideo());
|
|
223
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'VideoEncoderAvgQP', (data) => this.handleVideoEncoderAvgQP(data));
|
|
224
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'LatencyTest', (data) => this.handleLatencyTestResult(data));
|
|
225
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'DataChannelLatencyTest', (data) => this.handleDataChannelLatencyTestResponse(data));
|
|
226
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'InitialSettings', (data) => this.handleInitialSettings(data));
|
|
227
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'FileExtension', (data) => this.onFileExtension(data));
|
|
228
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'FileMimeType', (data) => this.onFileMimeType(data));
|
|
229
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'FileContents', (data) => this.onFileContents(data));
|
|
230
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'TestEcho', () => {
|
|
232
231
|
/* Do nothing */
|
|
233
232
|
});
|
|
234
|
-
this.streamMessageController.registerMessageHandler(
|
|
235
|
-
this.streamMessageController.registerMessageHandler(
|
|
236
|
-
this.streamMessageController.registerMessageHandler(
|
|
233
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'InputControlOwnership', (data) => this.onInputControlOwnership(data));
|
|
234
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'GamepadResponse', (data) => this.onGamepadResponse(data));
|
|
235
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'Multiplexed', () => {
|
|
237
236
|
/* Do nothing as this message type is used only by the SFU */
|
|
238
237
|
});
|
|
239
|
-
this.streamMessageController.registerMessageHandler(
|
|
238
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'Protocol', (data) => this.onProtocolMessage(data));
|
|
240
239
|
// To Streamer
|
|
241
|
-
this.streamMessageController.registerMessageHandler(
|
|
242
|
-
this.streamMessageController.registerMessageHandler(
|
|
243
|
-
this.streamMessageController.registerMessageHandler(
|
|
244
|
-
this.streamMessageController.registerMessageHandler(
|
|
245
|
-
this.streamMessageController.registerMessageHandler(
|
|
246
|
-
this.streamMessageController.registerMessageHandler(
|
|
247
|
-
this.streamMessageController.registerMessageHandler(
|
|
248
|
-
this.streamMessageController.registerMessageHandler(
|
|
249
|
-
this.streamMessageController.registerMessageHandler(
|
|
240
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'IFrameRequest', () => this.sendMessageController.sendMessageToStreamer('IFrameRequest'));
|
|
241
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'RequestQualityControl', () => this.sendMessageController.sendMessageToStreamer('RequestQualityControl'));
|
|
242
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'FpsRequest', () => this.sendMessageController.sendMessageToStreamer('FpsRequest'));
|
|
243
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'AverageBitrateRequest', () => this.sendMessageController.sendMessageToStreamer('AverageBitrateRequest'));
|
|
244
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'StartStreaming', () => this.sendMessageController.sendMessageToStreamer('StartStreaming'));
|
|
245
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'StopStreaming', () => this.sendMessageController.sendMessageToStreamer('StopStreaming'));
|
|
246
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'LatencyTest', (data) => this.sendMessageController.sendMessageToStreamer('LatencyTest', data));
|
|
247
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'RequestInitialSettings', () => this.sendMessageController.sendMessageToStreamer('RequestInitialSettings'));
|
|
248
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TestEcho', () => {
|
|
250
249
|
/* Do nothing */
|
|
251
250
|
});
|
|
252
|
-
this.streamMessageController.registerMessageHandler(
|
|
253
|
-
this.streamMessageController.registerMessageHandler(
|
|
254
|
-
this.streamMessageController.registerMessageHandler(
|
|
255
|
-
this.streamMessageController.registerMessageHandler(
|
|
256
|
-
this.streamMessageController.registerMessageHandler(
|
|
257
|
-
this.streamMessageController.registerMessageHandler(
|
|
258
|
-
this.streamMessageController.registerMessageHandler(
|
|
259
|
-
this.streamMessageController.registerMessageHandler(
|
|
260
|
-
this.streamMessageController.registerMessageHandler(
|
|
261
|
-
this.streamMessageController.registerMessageHandler(
|
|
262
|
-
this.streamMessageController.registerMessageHandler(
|
|
263
|
-
this.streamMessageController.registerMessageHandler(
|
|
264
|
-
this.streamMessageController.registerMessageHandler(
|
|
265
|
-
this.streamMessageController.registerMessageHandler(
|
|
266
|
-
this.streamMessageController.registerMessageHandler(
|
|
267
|
-
this.streamMessageController.registerMessageHandler(
|
|
268
|
-
this.streamMessageController.registerMessageHandler(
|
|
269
|
-
this.streamMessageController.registerMessageHandler(
|
|
270
|
-
this.streamMessageController.registerMessageHandler(
|
|
271
|
-
this.streamMessageController.registerMessageHandler(
|
|
272
|
-
this.streamMessageController.registerMessageHandler(
|
|
273
|
-
this.streamMessageController.registerMessageHandler(
|
|
274
|
-
this.streamMessageController.registerMessageHandler(
|
|
275
|
-
this.streamMessageController.registerMessageHandler(
|
|
276
|
-
this.streamMessageController.registerMessageHandler(
|
|
277
|
-
this.streamMessageController.registerMessageHandler(
|
|
278
|
-
this.streamMessageController.registerMessageHandler(
|
|
279
|
-
this.streamMessageController.registerMessageHandler(
|
|
280
|
-
this.streamMessageController.registerMessageHandler(
|
|
281
|
-
this.streamMessageController.registerMessageHandler(
|
|
282
|
-
this.streamMessageController.registerMessageHandler(
|
|
251
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'UIInteraction', (data) => this.sendMessageController.sendMessageToStreamer('UIInteraction', data));
|
|
252
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'Command', (data) => this.sendMessageController.sendMessageToStreamer('Command', data));
|
|
253
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TextboxEntry', (data) => this.sendMessageController.sendMessageToStreamer('TextboxEntry', data));
|
|
254
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'KeyDown', (data) => this.sendMessageController.sendMessageToStreamer('KeyDown', data));
|
|
255
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'KeyUp', (data) => this.sendMessageController.sendMessageToStreamer('KeyUp', data));
|
|
256
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'KeyPress', (data) => this.sendMessageController.sendMessageToStreamer('KeyPress', data));
|
|
257
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseEnter', (data) => this.sendMessageController.sendMessageToStreamer('MouseEnter', data));
|
|
258
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseLeave', (data) => this.sendMessageController.sendMessageToStreamer('MouseLeave', data));
|
|
259
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseDown', (data) => this.sendMessageController.sendMessageToStreamer('MouseDown', data));
|
|
260
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseUp', (data) => this.sendMessageController.sendMessageToStreamer('MouseUp', data));
|
|
261
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseMove', (data) => this.sendMessageController.sendMessageToStreamer('MouseMove', data));
|
|
262
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseWheel', (data) => this.sendMessageController.sendMessageToStreamer('MouseWheel', data));
|
|
263
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseDouble', (data) => this.sendMessageController.sendMessageToStreamer('MouseDouble', data));
|
|
264
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TouchStart', (data) => this.sendMessageController.sendMessageToStreamer('TouchStart', data));
|
|
265
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TouchEnd', (data) => this.sendMessageController.sendMessageToStreamer('TouchEnd', data));
|
|
266
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TouchMove', (data) => this.sendMessageController.sendMessageToStreamer('TouchMove', data));
|
|
267
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'GamepadConnected', () => this.sendMessageController.sendMessageToStreamer('GamepadConnected'));
|
|
268
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'GamepadButtonPressed', (data) => this.sendMessageController.sendMessageToStreamer('GamepadButtonPressed', data));
|
|
269
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'GamepadButtonReleased', (data) => this.sendMessageController.sendMessageToStreamer('GamepadButtonReleased', data));
|
|
270
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'GamepadAnalog', (data) => this.sendMessageController.sendMessageToStreamer('GamepadAnalog', data));
|
|
271
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'GamepadDisconnected', (data) => this.sendMessageController.sendMessageToStreamer('GamepadDisconnected', data));
|
|
272
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XREyeViews', (data) => this.sendMessageController.sendMessageToStreamer('XREyeViews', data));
|
|
273
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRHMDTransform', (data) => this.sendMessageController.sendMessageToStreamer('XRHMDTransform', data));
|
|
274
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRControllerTransform', (data) => this.sendMessageController.sendMessageToStreamer('XRControllerTransform', data));
|
|
275
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRSystem', (data) => this.sendMessageController.sendMessageToStreamer('XRSystem', data));
|
|
276
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRButtonTouched', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonTouched', data));
|
|
277
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRButtonTouchReleased', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonTouchReleased', data));
|
|
278
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRButtonPressed', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonPressed', data));
|
|
279
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRButtonReleased', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonReleased', data));
|
|
280
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRAnalog', (data) => this.sendMessageController.sendMessageToStreamer('XRAnalog', data));
|
|
281
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'ChannelRelayStatus', () => {
|
|
283
282
|
/* Do nothing as this message type is used only by the SFU */
|
|
284
283
|
});
|
|
285
|
-
this.streamMessageController.registerMessageHandler(
|
|
284
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'Multiplexed', () => {
|
|
286
285
|
/* Do nothing as this message type is used only by the SFU */
|
|
287
286
|
});
|
|
288
287
|
}
|
|
@@ -291,9 +290,9 @@ class WebRtcPlayerController {
|
|
|
291
290
|
* @param message
|
|
292
291
|
*/
|
|
293
292
|
onCommand(message) {
|
|
294
|
-
|
|
293
|
+
Logger.Info('DataChannelReceiveMessageType.Command');
|
|
295
294
|
const commandAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
296
|
-
|
|
295
|
+
Logger.Info('Data Channel Command: ' + commandAsString);
|
|
297
296
|
const command = JSON.parse(commandAsString);
|
|
298
297
|
if (command.command === 'onScreenKeyboard') {
|
|
299
298
|
this.pixelStreaming._activateOnScreenKeyboard(command);
|
|
@@ -308,18 +307,18 @@ class WebRtcPlayerController {
|
|
|
308
307
|
const protocolString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
309
308
|
const protocolJSON = JSON.parse(protocolString);
|
|
310
309
|
if (!Object.prototype.hasOwnProperty.call(protocolJSON, 'Direction')) {
|
|
311
|
-
|
|
310
|
+
Logger.Error('Malformed protocol received. Ensure the protocol message contains a direction');
|
|
312
311
|
}
|
|
313
312
|
const direction = protocolJSON.Direction;
|
|
314
313
|
delete protocolJSON.Direction;
|
|
315
|
-
|
|
314
|
+
Logger.Info(`Received new ${direction == MessageDirection.FromStreamer ? 'FromStreamer' : 'ToStreamer'} protocol. Updating existing protocol...`);
|
|
316
315
|
Object.keys(protocolJSON).forEach((messageType) => {
|
|
317
316
|
const message = protocolJSON[messageType];
|
|
318
317
|
switch (direction) {
|
|
319
|
-
case
|
|
318
|
+
case MessageDirection.ToStreamer:
|
|
320
319
|
// Check that the message contains all the relevant params
|
|
321
320
|
if (!Object.prototype.hasOwnProperty.call(message, 'id')) {
|
|
322
|
-
|
|
321
|
+
Logger.Error(`ToStreamer->${messageType} protocol definition was malformed as it didn't contain at least an id\n
|
|
323
322
|
Definition was: ${JSON.stringify(message, null, 2)}`);
|
|
324
323
|
// return in a forEach is equivalent to a continue in a normal for loop
|
|
325
324
|
return;
|
|
@@ -335,13 +334,13 @@ class WebRtcPlayerController {
|
|
|
335
334
|
this.streamMessageController.toStreamerMessages.set(messageType, message);
|
|
336
335
|
}
|
|
337
336
|
else {
|
|
338
|
-
|
|
337
|
+
Logger.Error(`There was no registered handler for "${messageType}" - try adding one using registerMessageHandler(MessageDirection.ToStreamer, "${messageType}", myHandler)`);
|
|
339
338
|
}
|
|
340
339
|
break;
|
|
341
|
-
case
|
|
340
|
+
case MessageDirection.FromStreamer:
|
|
342
341
|
// Check that the message contains all the relevant params
|
|
343
342
|
if (!Object.prototype.hasOwnProperty.call(message, 'id')) {
|
|
344
|
-
|
|
343
|
+
Logger.Error(`FromStreamer->${messageType} protocol definition was malformed as it didn't contain at least an id\n
|
|
345
344
|
Definition was: ${JSON.stringify(message, null, 2)}`);
|
|
346
345
|
// return in a forEach is equivalent to a continue in a normal for loop
|
|
347
346
|
return;
|
|
@@ -351,11 +350,11 @@ class WebRtcPlayerController {
|
|
|
351
350
|
this.streamMessageController.fromStreamerMessages.set(message.id, messageType);
|
|
352
351
|
}
|
|
353
352
|
else {
|
|
354
|
-
|
|
353
|
+
Logger.Error(`There was no registered handler for "${message}" - try adding one using registerMessageHandler(MessageDirection.FromStreamer, "${messageType}", myHandler)`);
|
|
355
354
|
}
|
|
356
355
|
break;
|
|
357
356
|
default:
|
|
358
|
-
|
|
357
|
+
Logger.Error(`Unknown direction: ${direction}`);
|
|
359
358
|
}
|
|
360
359
|
});
|
|
361
360
|
// Once the protocol has been received, we can send our control messages
|
|
@@ -363,7 +362,7 @@ class WebRtcPlayerController {
|
|
|
363
362
|
this.toStreamerMessagesController.SendRequestQualityControl();
|
|
364
363
|
}
|
|
365
364
|
catch (e) {
|
|
366
|
-
|
|
365
|
+
Logger.Info(e);
|
|
367
366
|
}
|
|
368
367
|
}
|
|
369
368
|
/**
|
|
@@ -372,9 +371,9 @@ class WebRtcPlayerController {
|
|
|
372
371
|
*/
|
|
373
372
|
onInputControlOwnership(message) {
|
|
374
373
|
const view = new Uint8Array(message);
|
|
375
|
-
|
|
374
|
+
Logger.Info('DataChannelReceiveMessageType.InputControlOwnership');
|
|
376
375
|
const inputControlOwnership = new Boolean(view[1]).valueOf();
|
|
377
|
-
|
|
376
|
+
Logger.Info(`Received input controller message - will your input control the stream: ${inputControlOwnership}`);
|
|
378
377
|
this.pixelStreaming._onInputControlOwnership(inputControlOwnership);
|
|
379
378
|
}
|
|
380
379
|
/**
|
|
@@ -418,14 +417,14 @@ class WebRtcPlayerController {
|
|
|
418
417
|
doReconnect(message) {
|
|
419
418
|
// if there is no webSocketController return immediately or this will not work
|
|
420
419
|
if (!this.protocol) {
|
|
421
|
-
|
|
420
|
+
Logger.Info('This player has no protocol connection.');
|
|
422
421
|
return;
|
|
423
422
|
}
|
|
424
423
|
this.isReconnecting = true;
|
|
425
424
|
// if the connection is open, first close it and force a reconnect.
|
|
426
425
|
if (this.protocol.isConnected()) {
|
|
427
426
|
if (!this.forceReconnect) {
|
|
428
|
-
|
|
427
|
+
this.disconnectMessage = `${message} Reconnecting.`;
|
|
429
428
|
}
|
|
430
429
|
this.closeSignalingServer(message, true);
|
|
431
430
|
}
|
|
@@ -438,17 +437,17 @@ class WebRtcPlayerController {
|
|
|
438
437
|
* Loads a freeze frame if it is required otherwise shows the play overlay
|
|
439
438
|
*/
|
|
440
439
|
loadFreezeFrameOrShowPlayOverlay() {
|
|
441
|
-
this.pixelStreaming.dispatchEvent(new
|
|
440
|
+
this.pixelStreaming.dispatchEvent(new LoadFreezeFrameEvent({
|
|
442
441
|
shouldShowPlayOverlay: this.shouldShowPlayOverlay,
|
|
443
442
|
isValid: this.freezeFrameController.valid,
|
|
444
443
|
jpegData: this.freezeFrameController.jpeg
|
|
445
444
|
}));
|
|
446
445
|
if (this.shouldShowPlayOverlay === true) {
|
|
447
|
-
|
|
446
|
+
Logger.Info('showing play overlay');
|
|
448
447
|
this.resizePlayerStyle();
|
|
449
448
|
}
|
|
450
449
|
else {
|
|
451
|
-
|
|
450
|
+
Logger.Info('showing freeze frame');
|
|
452
451
|
this.freezeFrameController.showFreezeFrame();
|
|
453
452
|
}
|
|
454
453
|
setTimeout(() => {
|
|
@@ -460,7 +459,7 @@ class WebRtcPlayerController {
|
|
|
460
459
|
* @param message The freeze frame data in bytes
|
|
461
460
|
*/
|
|
462
461
|
onFreezeFrameMessage(message) {
|
|
463
|
-
|
|
462
|
+
Logger.Info('DataChannelReceiveMessageType.FreezeFrame');
|
|
464
463
|
const view = new Uint8Array(message);
|
|
465
464
|
this.freezeFrameController.processFreezeFrameMessage(view, () => this.loadFreezeFrameOrShowPlayOverlay());
|
|
466
465
|
}
|
|
@@ -468,9 +467,9 @@ class WebRtcPlayerController {
|
|
|
468
467
|
* Enable the video after hiding a freeze frame
|
|
469
468
|
*/
|
|
470
469
|
invalidateFreezeFrameAndEnableVideo() {
|
|
471
|
-
|
|
470
|
+
Logger.Info('DataChannelReceiveMessageType.FreezeFrame');
|
|
472
471
|
setTimeout(() => {
|
|
473
|
-
this.pixelStreaming.dispatchEvent(new
|
|
472
|
+
this.pixelStreaming.dispatchEvent(new HideFreezeFrameEvent());
|
|
474
473
|
this.freezeFrameController.hideFreezeFrame();
|
|
475
474
|
}, this.freezeFrameController.freezeFrameDelay);
|
|
476
475
|
if (this.videoPlayer.getVideoElement()) {
|
|
@@ -483,7 +482,7 @@ class WebRtcPlayerController {
|
|
|
483
482
|
*/
|
|
484
483
|
onFileExtension(data) {
|
|
485
484
|
const view = new Uint8Array(data);
|
|
486
|
-
|
|
485
|
+
FileUtil.setExtensionFromBytes(view, this.file);
|
|
487
486
|
}
|
|
488
487
|
/**
|
|
489
488
|
* Prep datachannel data for processing the file mime type
|
|
@@ -491,7 +490,7 @@ class WebRtcPlayerController {
|
|
|
491
490
|
*/
|
|
492
491
|
onFileMimeType(data) {
|
|
493
492
|
const view = new Uint8Array(data);
|
|
494
|
-
|
|
493
|
+
FileUtil.setMimeTypeFromBytes(view, this.file);
|
|
495
494
|
}
|
|
496
495
|
/**
|
|
497
496
|
* Prep datachannel data for processing the file contents
|
|
@@ -499,7 +498,7 @@ class WebRtcPlayerController {
|
|
|
499
498
|
*/
|
|
500
499
|
onFileContents(data) {
|
|
501
500
|
const view = new Uint8Array(data);
|
|
502
|
-
|
|
501
|
+
FileUtil.setContentsFromBytes(view, this.file);
|
|
503
502
|
}
|
|
504
503
|
/**
|
|
505
504
|
* Plays the stream audio and video source and sets up other pieces while the stream starts
|
|
@@ -507,20 +506,20 @@ class WebRtcPlayerController {
|
|
|
507
506
|
playStream() {
|
|
508
507
|
if (!this.videoPlayer.getVideoElement()) {
|
|
509
508
|
const message = 'Could not play video stream because the video player was not initialized correctly.';
|
|
510
|
-
this.pixelStreaming.dispatchEvent(new
|
|
511
|
-
|
|
509
|
+
this.pixelStreaming.dispatchEvent(new PlayStreamErrorEvent({ message }));
|
|
510
|
+
Logger.Error(message);
|
|
512
511
|
// close the connection
|
|
513
512
|
this.closeSignalingServer('Stream not initialized correctly', false);
|
|
514
513
|
return;
|
|
515
514
|
}
|
|
516
515
|
if (!this.videoPlayer.hasVideoSource()) {
|
|
517
|
-
|
|
516
|
+
Logger.Warning('Cannot play stream, the video element has no srcObject to play.');
|
|
518
517
|
return;
|
|
519
518
|
}
|
|
520
|
-
this.setTouchInputEnabled(this.config.isFlagEnabled(
|
|
521
|
-
this.pixelStreaming.dispatchEvent(new
|
|
519
|
+
this.setTouchInputEnabled(this.config.isFlagEnabled(Flags.TouchInput));
|
|
520
|
+
this.pixelStreaming.dispatchEvent(new PlayStreamEvent());
|
|
522
521
|
if (this.streamController.audioElement.srcObject) {
|
|
523
|
-
const startMuted = this.config.isFlagEnabled(
|
|
522
|
+
const startMuted = this.config.isFlagEnabled(Flags.StartVideoMuted);
|
|
524
523
|
this.streamController.audioElement.muted = startMuted;
|
|
525
524
|
if (startMuted) {
|
|
526
525
|
this.playVideo();
|
|
@@ -532,9 +531,9 @@ class WebRtcPlayerController {
|
|
|
532
531
|
this.playVideo();
|
|
533
532
|
})
|
|
534
533
|
.catch((onRejectedReason) => {
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
this.pixelStreaming.dispatchEvent(new
|
|
534
|
+
Logger.Info(onRejectedReason);
|
|
535
|
+
Logger.Info('Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay.');
|
|
536
|
+
this.pixelStreaming.dispatchEvent(new PlayStreamRejectedEvent({
|
|
538
537
|
reason: onRejectedReason
|
|
539
538
|
}));
|
|
540
539
|
});
|
|
@@ -555,16 +554,16 @@ class WebRtcPlayerController {
|
|
|
555
554
|
if (this.streamController.audioElement.srcObject) {
|
|
556
555
|
this.streamController.audioElement.pause();
|
|
557
556
|
}
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
this.pixelStreaming.dispatchEvent(new
|
|
557
|
+
Logger.Info(onRejectedReason);
|
|
558
|
+
Logger.Info('Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay.');
|
|
559
|
+
this.pixelStreaming.dispatchEvent(new PlayStreamRejectedEvent({ reason: onRejectedReason }));
|
|
561
560
|
});
|
|
562
561
|
}
|
|
563
562
|
/**
|
|
564
563
|
* Enable the video to play automatically if enableAutoplay is true
|
|
565
564
|
*/
|
|
566
565
|
autoPlayVideoOrSetUpPlayOverlay() {
|
|
567
|
-
if (this.config.isFlagEnabled(
|
|
566
|
+
if (this.config.isFlagEnabled(Flags.AutoPlayVideo)) {
|
|
568
567
|
// attempt to play the video
|
|
569
568
|
this.playStream();
|
|
570
569
|
}
|
|
@@ -579,6 +578,15 @@ class WebRtcPlayerController {
|
|
|
579
578
|
this.disconnectMessage = null;
|
|
580
579
|
const signallingUrl = this.signallingUrlBuilder();
|
|
581
580
|
this.protocol.connect(signallingUrl);
|
|
581
|
+
const keepaliveDelay = this.config.getNumericSettingValue(NumericParameters.KeepaliveDelay);
|
|
582
|
+
if (keepaliveDelay > 0) {
|
|
583
|
+
this.keepalive = new KeepaliveMonitor(this.protocol, keepaliveDelay);
|
|
584
|
+
this.keepalive.onTimeout = () => {
|
|
585
|
+
// if the ping fails just disconnect
|
|
586
|
+
Logger.Error(`Protocol timeout`);
|
|
587
|
+
this.protocol.disconnect();
|
|
588
|
+
};
|
|
589
|
+
}
|
|
582
590
|
}
|
|
583
591
|
/**
|
|
584
592
|
* This will start the handshake to the signalling server
|
|
@@ -588,18 +596,18 @@ class WebRtcPlayerController {
|
|
|
588
596
|
startSession(peerConfig) {
|
|
589
597
|
this.peerConfig = peerConfig;
|
|
590
598
|
// check for forcing turn
|
|
591
|
-
if (this.config.isFlagEnabled(
|
|
599
|
+
if (this.config.isFlagEnabled(Flags.ForceTURN)) {
|
|
592
600
|
// check for a turn server
|
|
593
601
|
const hasTurnServer = this.checkTurnServerAvailability(peerConfig);
|
|
594
602
|
// close and error if turn is forced and there is no turn server
|
|
595
603
|
if (!hasTurnServer) {
|
|
596
|
-
|
|
604
|
+
Logger.Info('No turn server was found in the Peer Connection Options. TURN cannot be forced, closing connection. Please use STUN instead');
|
|
597
605
|
this.closeSignalingServer('TURN cannot be forced, closing connection. Please use STUN instead.', false);
|
|
598
606
|
return;
|
|
599
607
|
}
|
|
600
608
|
}
|
|
601
609
|
// set up the peer connection controller
|
|
602
|
-
this.peerConnectionController = new
|
|
610
|
+
this.peerConnectionController = new PeerConnectionController(this.peerConfig, this.config, this.preferredCodec);
|
|
603
611
|
// set up peer connection controller video stats
|
|
604
612
|
this.peerConnectionController.onVideoStats = (event) => this.handleVideoStats(event);
|
|
605
613
|
/* When the Peer Connection wants to send an offer have it handled */
|
|
@@ -633,19 +641,19 @@ class WebRtcPlayerController {
|
|
|
633
641
|
checkTurnServerAvailability(options) {
|
|
634
642
|
// if iceServers is empty return false this should not be the general use case but is here incase
|
|
635
643
|
if (!options.iceServers) {
|
|
636
|
-
|
|
644
|
+
Logger.Info('A turn sever was not found');
|
|
637
645
|
return false;
|
|
638
646
|
}
|
|
639
647
|
// loop through the ice servers to check for a turn url
|
|
640
648
|
for (const iceServer of options.iceServers) {
|
|
641
649
|
for (const url of iceServer.urls) {
|
|
642
650
|
if (url.includes('turn')) {
|
|
643
|
-
|
|
651
|
+
Logger.Info(`A turn sever was found at ${url}`);
|
|
644
652
|
return true;
|
|
645
653
|
}
|
|
646
654
|
}
|
|
647
655
|
}
|
|
648
|
-
|
|
656
|
+
Logger.Info('A turn sever was not found');
|
|
649
657
|
return false;
|
|
650
658
|
}
|
|
651
659
|
/**
|
|
@@ -657,14 +665,17 @@ class WebRtcPlayerController {
|
|
|
657
665
|
// Tell the WebRtcController to start a session with the peer options sent from the signaling server
|
|
658
666
|
this.startSession(messageConfig.peerConnectionOptions);
|
|
659
667
|
}
|
|
668
|
+
handlePingMessage(pingMessage) {
|
|
669
|
+
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.pong, { time: pingMessage.time }));
|
|
670
|
+
}
|
|
660
671
|
/**
|
|
661
672
|
* Handles when the signalling server gives us the list of streamer ids.
|
|
662
673
|
*/
|
|
663
674
|
handleStreamerListMessage(messageStreamerList) {
|
|
664
|
-
|
|
675
|
+
Logger.Info(`Got streamer list ${messageStreamerList.ids}`);
|
|
665
676
|
let wantedStreamerId = '';
|
|
666
677
|
// get the current selected streamer id option
|
|
667
|
-
const streamerIDOption = this.config.getSettingOption(
|
|
678
|
+
const streamerIDOption = this.config.getSettingOption(OptionParameters.StreamerId);
|
|
668
679
|
const existingSelection = streamerIDOption.selected.toString().trim();
|
|
669
680
|
if (existingSelection) {
|
|
670
681
|
// default to selected option if it exists
|
|
@@ -673,17 +684,17 @@ class WebRtcPlayerController {
|
|
|
673
684
|
// add the streamers to the UI
|
|
674
685
|
const settingOptions = [...messageStreamerList.ids]; // copy the original messageStreamerList.ids
|
|
675
686
|
settingOptions.unshift(''); // add an empty option at the top
|
|
676
|
-
this.config.setOptionSettingOptions(
|
|
687
|
+
this.config.setOptionSettingOptions(OptionParameters.StreamerId, settingOptions);
|
|
677
688
|
let autoSelectedStreamerId = '';
|
|
678
|
-
const waitForStreamer = this.config.isFlagEnabled(
|
|
679
|
-
const reconnectLimit = this.config.getNumericSettingValue(
|
|
680
|
-
const reconnectDelay = this.config.getNumericSettingValue(
|
|
689
|
+
const waitForStreamer = this.config.isFlagEnabled(Flags.WaitForStreamer);
|
|
690
|
+
const reconnectLimit = this.config.getNumericSettingValue(NumericParameters.MaxReconnectAttempts);
|
|
691
|
+
const reconnectDelay = this.config.getNumericSettingValue(NumericParameters.StreamerAutoJoinInterval);
|
|
681
692
|
// first we figure out a wanted streamer id through various means
|
|
682
693
|
const useUrlParams = this.config.useUrlParams;
|
|
683
|
-
const urlParams = new
|
|
684
|
-
if (useUrlParams && urlParams.has(
|
|
694
|
+
const urlParams = new IURLSearchParams(window.location.search);
|
|
695
|
+
if (useUrlParams && urlParams.has(OptionParameters.StreamerId)) {
|
|
685
696
|
// if we've set the streamer id on the url we only want that streamer id
|
|
686
|
-
wantedStreamerId = urlParams.get(
|
|
697
|
+
wantedStreamerId = urlParams.get(OptionParameters.StreamerId);
|
|
687
698
|
}
|
|
688
699
|
else if (this.subscribedStream) {
|
|
689
700
|
// we were previously subscribed to a streamer, we want that
|
|
@@ -702,7 +713,7 @@ class WebRtcPlayerController {
|
|
|
702
713
|
if (autoSelectedStreamerId) {
|
|
703
714
|
this.reconnectAttempt = 0;
|
|
704
715
|
this.isReconnecting = false;
|
|
705
|
-
this.config.setOptionSettingValue(
|
|
716
|
+
this.config.setOptionSettingValue(OptionParameters.StreamerId, autoSelectedStreamerId);
|
|
706
717
|
}
|
|
707
718
|
else {
|
|
708
719
|
// no auto selected streamer.
|
|
@@ -713,7 +724,7 @@ class WebRtcPlayerController {
|
|
|
713
724
|
this.reconnectAttempt++;
|
|
714
725
|
this.isReconnecting = true;
|
|
715
726
|
setTimeout(() => {
|
|
716
|
-
this.protocol.sendMessage(
|
|
727
|
+
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.listStreamers));
|
|
717
728
|
}, reconnectDelay);
|
|
718
729
|
}
|
|
719
730
|
else {
|
|
@@ -725,16 +736,22 @@ class WebRtcPlayerController {
|
|
|
725
736
|
}
|
|
726
737
|
}
|
|
727
738
|
// dispatch this event finally
|
|
728
|
-
this.pixelStreaming.dispatchEvent(new
|
|
739
|
+
this.pixelStreaming.dispatchEvent(new StreamerListMessageEvent({
|
|
729
740
|
messageStreamerList,
|
|
730
741
|
autoSelectedStreamerId,
|
|
731
742
|
wantedStreamerId
|
|
732
743
|
}));
|
|
733
744
|
}
|
|
745
|
+
handleSubscribeFailedMessage(subscribeFailedMessage) {
|
|
746
|
+
this.reconnectAttempt = 0;
|
|
747
|
+
this.isReconnecting = false;
|
|
748
|
+
this.enableAutoReconnect = false;
|
|
749
|
+
this.pixelStreaming._onSubscribeFailed(subscribeFailedMessage.message);
|
|
750
|
+
}
|
|
734
751
|
handleStreamerIDChangedMessage(streamerIDChangedMessage) {
|
|
735
752
|
const newID = streamerIDChangedMessage.newID;
|
|
736
753
|
// need to edit the selected streamer in the settings list
|
|
737
|
-
const streamerListOptions = this.config.getSettingOption(
|
|
754
|
+
const streamerListOptions = this.config.getSettingOption(OptionParameters.StreamerId);
|
|
738
755
|
// temporarily prevent onChange from firing (it would try to subscribe to the streamer again)
|
|
739
756
|
const oldOnChange = streamerListOptions.onChange;
|
|
740
757
|
streamerListOptions.onChange = () => { };
|
|
@@ -755,7 +772,7 @@ class WebRtcPlayerController {
|
|
|
755
772
|
// remember which stream we're subscribe to
|
|
756
773
|
this.subscribedStream = streamerIDChangedMessage.newID;
|
|
757
774
|
// notify any listeners
|
|
758
|
-
this.pixelStreaming.dispatchEvent(new
|
|
775
|
+
this.pixelStreaming.dispatchEvent(new StreamerIDChangedMessageEvent({
|
|
759
776
|
newID
|
|
760
777
|
}));
|
|
761
778
|
}
|
|
@@ -764,7 +781,7 @@ class WebRtcPlayerController {
|
|
|
764
781
|
* @param Answer - Answer SDP from the peer.
|
|
765
782
|
*/
|
|
766
783
|
handleWebRtcAnswer(Answer) {
|
|
767
|
-
|
|
784
|
+
Logger.Info(`Got answer sdp ${Answer.sdp}`);
|
|
768
785
|
const sdpAnswer = {
|
|
769
786
|
sdp: Answer.sdp,
|
|
770
787
|
type: 'answer'
|
|
@@ -777,7 +794,7 @@ class WebRtcPlayerController {
|
|
|
777
794
|
* @param Offer - Offer SDP from the peer.
|
|
778
795
|
*/
|
|
779
796
|
handleWebRtcOffer(Offer) {
|
|
780
|
-
|
|
797
|
+
Logger.Info(`Got offer sdp ${Offer.sdp}`);
|
|
781
798
|
this.isUsingSFU = Offer.sfu ? Offer.sfu : false;
|
|
782
799
|
this.isUsingSVC = Offer.scalabilityMode ? Offer.scalabilityMode != 'L1T1' : false;
|
|
783
800
|
if (this.isUsingSFU || this.isUsingSVC) {
|
|
@@ -806,9 +823,9 @@ class WebRtcPlayerController {
|
|
|
806
823
|
}
|
|
807
824
|
}
|
|
808
825
|
// Update the possible video quality options
|
|
809
|
-
this.config.setOptionSettingOptions(
|
|
826
|
+
this.config.setOptionSettingOptions(OptionParameters.PreferredQuality, availableQualities);
|
|
810
827
|
// Update the selected video quality with the highest possible resolution
|
|
811
|
-
this.config.setOptionSettingValue(
|
|
828
|
+
this.config.setOptionSettingValue(OptionParameters.PreferredQuality, availableQualities.slice(-1)[0]);
|
|
812
829
|
const sdpOffer = {
|
|
813
830
|
sdp: Offer.sdp,
|
|
814
831
|
type: 'offer'
|
|
@@ -835,7 +852,7 @@ class WebRtcPlayerController {
|
|
|
835
852
|
id: DataChannels.recvStreamId
|
|
836
853
|
};
|
|
837
854
|
this.recvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection, 'recv-datachannel', RecvOptions);
|
|
838
|
-
this.recvDataChannelController.handleOnOpen = () => this.protocol.sendMessage(
|
|
855
|
+
this.recvDataChannelController.handleOnOpen = () => this.protocol.sendMessage(MessageHelpers.createMessage(Messages.peerDataChannelsReady));
|
|
839
856
|
// If we're uni-directional, only the recv data channel should handle incoming messages
|
|
840
857
|
this.recvDataChannelController.handleOnMessage = (ev) => this.handleOnMessage(ev);
|
|
841
858
|
}
|
|
@@ -854,16 +871,16 @@ class WebRtcPlayerController {
|
|
|
854
871
|
}
|
|
855
872
|
this.statsTimerHandle = window.setInterval(() => this.getStats(), 1000);
|
|
856
873
|
/* */
|
|
857
|
-
this.setMouseInputEnabled(this.config.isFlagEnabled(
|
|
858
|
-
this.setKeyboardInputEnabled(this.config.isFlagEnabled(
|
|
859
|
-
this.setGamePadInputEnabled(this.config.isFlagEnabled(
|
|
874
|
+
this.setMouseInputEnabled(this.config.isFlagEnabled(Flags.MouseInput));
|
|
875
|
+
this.setKeyboardInputEnabled(this.config.isFlagEnabled(Flags.KeyboardInput));
|
|
876
|
+
this.setGamePadInputEnabled(this.config.isFlagEnabled(Flags.GamepadInput));
|
|
860
877
|
}
|
|
861
878
|
/**
|
|
862
879
|
* When an ice Candidate is received from the Signaling server add it to the Peer Connection Client
|
|
863
880
|
* @param iceCandidate - Ice Candidate from Server
|
|
864
881
|
*/
|
|
865
882
|
handleIceCandidate(iceCandidate) {
|
|
866
|
-
|
|
883
|
+
Logger.Info('Web RTC Controller: onWebRtcIce');
|
|
867
884
|
const candidate = new RTCIceCandidate(iceCandidate);
|
|
868
885
|
this.peerConnectionController.handleOnIce(candidate);
|
|
869
886
|
}
|
|
@@ -872,9 +889,9 @@ class WebRtcPlayerController {
|
|
|
872
889
|
* @param iceEvent - RTC Peer ConnectionIceEvent) {
|
|
873
890
|
*/
|
|
874
891
|
handleSendIceCandidate(iceEvent) {
|
|
875
|
-
|
|
892
|
+
Logger.Info('OnIceCandidate');
|
|
876
893
|
if (iceEvent.candidate && iceEvent.candidate.candidate) {
|
|
877
|
-
this.protocol.sendMessage(
|
|
894
|
+
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.iceCandidate, { candidate: iceEvent.candidate }));
|
|
878
895
|
}
|
|
879
896
|
}
|
|
880
897
|
/**
|
|
@@ -882,7 +899,7 @@ class WebRtcPlayerController {
|
|
|
882
899
|
* @param iceEvent - RTC Peer ConnectionIceEvent) {
|
|
883
900
|
*/
|
|
884
901
|
handleDataChannel(datachannelEvent) {
|
|
885
|
-
|
|
902
|
+
Logger.Info('Data channel created for us by browser as we are a receiving peer.');
|
|
886
903
|
this.sendrecvDataChannelController.dataChannel = datachannelEvent.channel;
|
|
887
904
|
// Data channel was created for us, so we just need to setup its callbacks and array type
|
|
888
905
|
this.sendrecvDataChannelController.setupDataChannel();
|
|
@@ -893,28 +910,28 @@ class WebRtcPlayerController {
|
|
|
893
910
|
* @param offer - RTC Session Description
|
|
894
911
|
*/
|
|
895
912
|
handleSendWebRTCOffer(offer) {
|
|
896
|
-
|
|
913
|
+
Logger.Info('Sending the offer to the Server');
|
|
897
914
|
const extraParams = {
|
|
898
915
|
sdp: offer.sdp,
|
|
899
|
-
minBitrateBps: 1000 * this.config.getNumericSettingValue(
|
|
900
|
-
maxBitrateBps: 1000 * this.config.getNumericSettingValue(
|
|
916
|
+
minBitrateBps: 1000 * this.config.getNumericSettingValue(NumericParameters.WebRTCMinBitrate),
|
|
917
|
+
maxBitrateBps: 1000 * this.config.getNumericSettingValue(NumericParameters.WebRTCMaxBitrate)
|
|
901
918
|
};
|
|
902
|
-
this.protocol.sendMessage(
|
|
919
|
+
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.offer, extraParams));
|
|
903
920
|
}
|
|
904
921
|
/**
|
|
905
922
|
* Send the RTC Offer Session to the Signaling server via websocket
|
|
906
923
|
* @param answer - RTC Session Description
|
|
907
924
|
*/
|
|
908
925
|
handleSendWebRTCAnswer(answer) {
|
|
909
|
-
|
|
926
|
+
Logger.Info('Sending the answer to the Server');
|
|
910
927
|
const extraParams = {
|
|
911
928
|
sdp: answer.sdp,
|
|
912
|
-
minBitrateBps: 1000 * this.config.getNumericSettingValue(
|
|
913
|
-
maxBitrateBps: 1000 * this.config.getNumericSettingValue(
|
|
929
|
+
minBitrateBps: 1000 * this.config.getNumericSettingValue(NumericParameters.WebRTCMinBitrate),
|
|
930
|
+
maxBitrateBps: 1000 * this.config.getNumericSettingValue(NumericParameters.WebRTCMaxBitrate)
|
|
914
931
|
};
|
|
915
|
-
this.protocol.sendMessage(
|
|
932
|
+
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.answer, extraParams));
|
|
916
933
|
if (this.isUsingSFU) {
|
|
917
|
-
this.protocol.sendMessage(
|
|
934
|
+
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.dataChannelRequest));
|
|
918
935
|
}
|
|
919
936
|
}
|
|
920
937
|
/**
|
|
@@ -986,7 +1003,7 @@ class WebRtcPlayerController {
|
|
|
986
1003
|
* to aim for the best quality it can on the given network link.
|
|
987
1004
|
*/
|
|
988
1005
|
sendEncoderMinQP(minQP) {
|
|
989
|
-
|
|
1006
|
+
Logger.Info(`MinQP=${minQP}\n`);
|
|
990
1007
|
if (minQP != null) {
|
|
991
1008
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
992
1009
|
JSON.stringify({
|
|
@@ -1005,7 +1022,7 @@ class WebRtcPlayerController {
|
|
|
1005
1022
|
* to drop quality as low as needed on the given network link.
|
|
1006
1023
|
*/
|
|
1007
1024
|
sendEncoderMaxQP(maxQP) {
|
|
1008
|
-
|
|
1025
|
+
Logger.Info(`MaxQP=${maxQP}\n`);
|
|
1009
1026
|
if (maxQP != null) {
|
|
1010
1027
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1011
1028
|
JSON.stringify({
|
|
@@ -1022,7 +1039,7 @@ class WebRtcPlayerController {
|
|
|
1022
1039
|
* 100 = Best quality.
|
|
1023
1040
|
*/
|
|
1024
1041
|
sendEncoderMinQuality(minQuality) {
|
|
1025
|
-
|
|
1042
|
+
Logger.Info(`MinQuality=${minQuality}\n`);
|
|
1026
1043
|
if (minQuality != null) {
|
|
1027
1044
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1028
1045
|
JSON.stringify({
|
|
@@ -1039,7 +1056,7 @@ class WebRtcPlayerController {
|
|
|
1039
1056
|
* 100 = Best quality.
|
|
1040
1057
|
*/
|
|
1041
1058
|
sendEncoderMaxQuality(maxQuality) {
|
|
1042
|
-
|
|
1059
|
+
Logger.Info(`MaxQuality=${maxQuality}\n`);
|
|
1043
1060
|
if (maxQuality != null) {
|
|
1044
1061
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1045
1062
|
JSON.stringify({
|
|
@@ -1055,7 +1072,7 @@ class WebRtcPlayerController {
|
|
|
1055
1072
|
* @param minBitrate - The minimum bitrate we would like WebRTC to not fall below.
|
|
1056
1073
|
*/
|
|
1057
1074
|
sendWebRTCMinBitrate(minBitrate) {
|
|
1058
|
-
|
|
1075
|
+
Logger.Info(`WebRTC Min Bitrate=${minBitrate}`);
|
|
1059
1076
|
if (minBitrate != null) {
|
|
1060
1077
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1061
1078
|
JSON.stringify({
|
|
@@ -1071,7 +1088,7 @@ class WebRtcPlayerController {
|
|
|
1071
1088
|
* @param minBitrate - The minimum bitrate we would like WebRTC to not fall below.
|
|
1072
1089
|
*/
|
|
1073
1090
|
sendWebRTCMaxBitrate(maxBitrate) {
|
|
1074
|
-
|
|
1091
|
+
Logger.Info(`WebRTC Max Bitrate=${maxBitrate}`);
|
|
1075
1092
|
if (maxBitrate != null) {
|
|
1076
1093
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1077
1094
|
JSON.stringify({
|
|
@@ -1087,7 +1104,7 @@ class WebRtcPlayerController {
|
|
|
1087
1104
|
* @param fps - The maximum stream fps.
|
|
1088
1105
|
*/
|
|
1089
1106
|
sendWebRTCFps(fps) {
|
|
1090
|
-
|
|
1107
|
+
Logger.Info(`WebRTC FPS=${fps}`);
|
|
1091
1108
|
if (fps != null) {
|
|
1092
1109
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1093
1110
|
JSON.stringify({ 'WebRTC.Fps': fps })
|
|
@@ -1102,35 +1119,35 @@ class WebRtcPlayerController {
|
|
|
1102
1119
|
* Sends the UI Descriptor `stat fps` to the UE Instance
|
|
1103
1120
|
*/
|
|
1104
1121
|
sendShowFps() {
|
|
1105
|
-
|
|
1122
|
+
Logger.Info('---- Sending show stat to UE ----');
|
|
1106
1123
|
this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify({ 'stat.fps': '' })]);
|
|
1107
1124
|
}
|
|
1108
1125
|
/**
|
|
1109
1126
|
* Send an Iframe request to the streamer
|
|
1110
1127
|
*/
|
|
1111
1128
|
sendIframeRequest() {
|
|
1112
|
-
|
|
1129
|
+
Logger.Info('---- Sending Request for an IFrame ----');
|
|
1113
1130
|
this.streamMessageController.toStreamerHandlers.get('IFrameRequest')();
|
|
1114
1131
|
}
|
|
1115
1132
|
/**
|
|
1116
1133
|
* Send a UIInteraction message
|
|
1117
1134
|
*/
|
|
1118
1135
|
emitUIInteraction(descriptor) {
|
|
1119
|
-
|
|
1136
|
+
Logger.Info('---- Sending custom UIInteraction message ----');
|
|
1120
1137
|
this.streamMessageController.toStreamerHandlers.get('UIInteraction')([JSON.stringify(descriptor)]);
|
|
1121
1138
|
}
|
|
1122
1139
|
/**
|
|
1123
1140
|
* Send a Command message
|
|
1124
1141
|
*/
|
|
1125
1142
|
emitCommand(descriptor) {
|
|
1126
|
-
|
|
1143
|
+
Logger.Info('---- Sending custom Command message ----');
|
|
1127
1144
|
this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify(descriptor)]);
|
|
1128
1145
|
}
|
|
1129
1146
|
/**
|
|
1130
1147
|
* Send a console command message
|
|
1131
1148
|
*/
|
|
1132
1149
|
emitConsoleCommand(command) {
|
|
1133
|
-
|
|
1150
|
+
Logger.Info('---- Sending custom Command:ConsoleCommand message ----');
|
|
1134
1151
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1135
1152
|
JSON.stringify({
|
|
1136
1153
|
ConsoleCommand: command
|
|
@@ -1141,7 +1158,7 @@ class WebRtcPlayerController {
|
|
|
1141
1158
|
* Sends a request to the UE Instance to have ownership of Quality
|
|
1142
1159
|
*/
|
|
1143
1160
|
sendRequestQualityControlOwnership() {
|
|
1144
|
-
|
|
1161
|
+
Logger.Info('---- Sending Request to Control Quality ----');
|
|
1145
1162
|
this.toStreamerMessagesController.SendRequestQualityControl();
|
|
1146
1163
|
}
|
|
1147
1164
|
/**
|
|
@@ -1149,9 +1166,9 @@ class WebRtcPlayerController {
|
|
|
1149
1166
|
* @param message - Latency Test Timings
|
|
1150
1167
|
*/
|
|
1151
1168
|
handleLatencyTestResult(message) {
|
|
1152
|
-
|
|
1169
|
+
Logger.Info('DataChannelReceiveMessageType.latencyTest');
|
|
1153
1170
|
const latencyAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
1154
|
-
const latencyTestResults = new
|
|
1171
|
+
const latencyTestResults = new LatencyTestResults();
|
|
1155
1172
|
Object.assign(latencyTestResults, JSON.parse(latencyAsString));
|
|
1156
1173
|
latencyTestResults.processFields();
|
|
1157
1174
|
latencyTestResults.testStartTimeMs = this.latencyStartTime;
|
|
@@ -1171,7 +1188,7 @@ class WebRtcPlayerController {
|
|
|
1171
1188
|
* @param message - Data Channel Latency Test Response
|
|
1172
1189
|
*/
|
|
1173
1190
|
handleDataChannelLatencyTestResponse(message) {
|
|
1174
|
-
|
|
1191
|
+
Logger.Info('DataChannelReceiveMessageType.dataChannelLatencyResponse');
|
|
1175
1192
|
const responseAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
1176
1193
|
const latencyTestResponse = JSON.parse(responseAsString);
|
|
1177
1194
|
this.pixelStreaming._onDataChannelLatencyTestResponse(latencyTestResponse);
|
|
@@ -1181,10 +1198,10 @@ class WebRtcPlayerController {
|
|
|
1181
1198
|
* @param message - Initial Encoder and Web RTC Settings
|
|
1182
1199
|
*/
|
|
1183
1200
|
handleInitialSettings(message) {
|
|
1184
|
-
|
|
1201
|
+
Logger.Info('DataChannelReceiveMessageType.InitialSettings');
|
|
1185
1202
|
const payloadAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
1186
1203
|
const parsedInitialSettings = JSON.parse(payloadAsString);
|
|
1187
|
-
const initialSettings = new
|
|
1204
|
+
const initialSettings = new InitialSettings();
|
|
1188
1205
|
if (parsedInitialSettings.Encoder) {
|
|
1189
1206
|
initialSettings.EncoderSettings = parsedInitialSettings.Encoder;
|
|
1190
1207
|
}
|
|
@@ -1196,10 +1213,10 @@ class WebRtcPlayerController {
|
|
|
1196
1213
|
}
|
|
1197
1214
|
if (parsedInitialSettings.ConfigOptions &&
|
|
1198
1215
|
parsedInitialSettings.ConfigOptions.DefaultToHover !== undefined) {
|
|
1199
|
-
this.config.setFlagEnabled(
|
|
1216
|
+
this.config.setFlagEnabled(Flags.HoveringMouseMode, !!parsedInitialSettings.ConfigOptions.DefaultToHover);
|
|
1200
1217
|
}
|
|
1201
1218
|
initialSettings.ueCompatible();
|
|
1202
|
-
|
|
1219
|
+
Logger.Info(payloadAsString);
|
|
1203
1220
|
this.pixelStreaming._onInitialSettings(initialSettings);
|
|
1204
1221
|
}
|
|
1205
1222
|
/**
|
|
@@ -1207,7 +1224,7 @@ class WebRtcPlayerController {
|
|
|
1207
1224
|
* @param message - Encoders Quantization Parameter
|
|
1208
1225
|
*/
|
|
1209
1226
|
handleVideoEncoderAvgQP(message) {
|
|
1210
|
-
|
|
1227
|
+
Logger.Info('DataChannelReceiveMessageType.VideoEncoderAvgQP');
|
|
1211
1228
|
const AvgQP = Number(new TextDecoder('utf-16').decode(message.slice(1)));
|
|
1212
1229
|
this.setVideoEncoderAvgQP(AvgQP);
|
|
1213
1230
|
}
|
|
@@ -1227,9 +1244,9 @@ class WebRtcPlayerController {
|
|
|
1227
1244
|
*/
|
|
1228
1245
|
onQualityControlOwnership(message) {
|
|
1229
1246
|
const view = new Uint8Array(message);
|
|
1230
|
-
|
|
1247
|
+
Logger.Info('DataChannelReceiveMessageType.QualityControlOwnership');
|
|
1231
1248
|
this.isQualityController = new Boolean(view[1]).valueOf();
|
|
1232
|
-
|
|
1249
|
+
Logger.Info(`Received quality controller message, will control quality: ${this.isQualityController}`);
|
|
1233
1250
|
this.pixelStreaming._onQualityControlOwnership(this.isQualityController);
|
|
1234
1251
|
}
|
|
1235
1252
|
/**
|
|
@@ -1273,9 +1290,9 @@ class WebRtcPlayerController {
|
|
|
1273
1290
|
var _a;
|
|
1274
1291
|
(_a = this.mouseController) === null || _a === void 0 ? void 0 : _a.unregister();
|
|
1275
1292
|
if (isEnabled) {
|
|
1276
|
-
const mouseMode = this.config.isFlagEnabled(
|
|
1277
|
-
?
|
|
1278
|
-
:
|
|
1293
|
+
const mouseMode = this.config.isFlagEnabled(Flags.HoveringMouseMode)
|
|
1294
|
+
? ControlSchemeType.HoveringMouse
|
|
1295
|
+
: ControlSchemeType.LockedMouse;
|
|
1279
1296
|
this.mouseController = this.inputClassesFactory.registerMouse(mouseMode);
|
|
1280
1297
|
}
|
|
1281
1298
|
}
|
|
@@ -1286,7 +1303,7 @@ class WebRtcPlayerController {
|
|
|
1286
1303
|
var _a;
|
|
1287
1304
|
(_a = this.touchController) === null || _a === void 0 ? void 0 : _a.unregister();
|
|
1288
1305
|
if (isEnabled) {
|
|
1289
|
-
this.touchController = this.inputClassesFactory.registerTouch(this.config.isFlagEnabled(
|
|
1306
|
+
this.touchController = this.inputClassesFactory.registerTouch(this.config.isFlagEnabled(Flags.FakeMouseWithTouches));
|
|
1290
1307
|
}
|
|
1291
1308
|
}
|
|
1292
1309
|
/**
|
|
@@ -1300,18 +1317,17 @@ class WebRtcPlayerController {
|
|
|
1300
1317
|
}
|
|
1301
1318
|
}
|
|
1302
1319
|
registerDataChannelEventEmitters(dataChannel) {
|
|
1303
|
-
dataChannel.onOpen = (label, event) => this.pixelStreaming.dispatchEvent(new
|
|
1304
|
-
dataChannel.onClose = (label, event) => this.pixelStreaming.dispatchEvent(new
|
|
1305
|
-
dataChannel.onError = (label, event) => this.pixelStreaming.dispatchEvent(new
|
|
1320
|
+
dataChannel.onOpen = (label, event) => this.pixelStreaming.dispatchEvent(new DataChannelOpenEvent({ label, event }));
|
|
1321
|
+
dataChannel.onClose = (label, event) => this.pixelStreaming.dispatchEvent(new DataChannelCloseEvent({ label, event }));
|
|
1322
|
+
dataChannel.onError = (label, event) => this.pixelStreaming.dispatchEvent(new DataChannelErrorEvent({ label, event }));
|
|
1306
1323
|
}
|
|
1307
1324
|
registerMessageHandler(name, direction, handler) {
|
|
1308
|
-
if (direction ===
|
|
1309
|
-
|
|
1325
|
+
if (direction === MessageDirection.FromStreamer && typeof handler === 'undefined') {
|
|
1326
|
+
Logger.Warning(`Unable to register handler for ${name} as no handler was passed`);
|
|
1310
1327
|
}
|
|
1311
|
-
this.streamMessageController.registerMessageHandler(direction, name, (data) => typeof handler === 'undefined' && direction ===
|
|
1328
|
+
this.streamMessageController.registerMessageHandler(direction, name, (data) => typeof handler === 'undefined' && direction === MessageDirection.ToStreamer
|
|
1312
1329
|
? this.sendMessageController.sendMessageToStreamer(name, data)
|
|
1313
1330
|
: handler(data));
|
|
1314
1331
|
}
|
|
1315
1332
|
}
|
|
1316
|
-
exports.WebRtcPlayerController = WebRtcPlayerController;
|
|
1317
1333
|
//# sourceMappingURL=WebRtcPlayerController.js.map
|