@yang__yj/pixelstreaming-core 1.0.0 → 1.0.1

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.
Files changed (237) hide show
  1. package/.cspell.json +48 -0
  2. package/.eslintignore +8 -0
  3. package/.eslintrc.js +8 -0
  4. package/.prettierignore +0 -0
  5. package/.prettierrc.json +6 -0
  6. package/coverage/clover.xml +3480 -0
  7. package/coverage/coverage-final.json +62 -0
  8. package/coverage/lcov-report/base.css +224 -0
  9. package/coverage/lcov-report/block-navigation.js +87 -0
  10. package/coverage/lcov-report/favicon.png +0 -0
  11. package/coverage/lcov-report/index.html +356 -0
  12. package/coverage/lcov-report/prettify.css +1 -0
  13. package/coverage/lcov-report/prettify.js +2 -0
  14. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  15. package/coverage/lcov-report/sorter.js +196 -0
  16. package/coverage/lcov-report/src/AFK/AFKController.ts.html +559 -0
  17. package/coverage/lcov-report/src/AFK/index.html +116 -0
  18. package/coverage/lcov-report/src/Config/Config.ts.html +2764 -0
  19. package/coverage/lcov-report/src/Config/SettingBase.ts.html +280 -0
  20. package/coverage/lcov-report/src/Config/SettingFlag.ts.html +382 -0
  21. package/coverage/lcov-report/src/Config/SettingNumber.ts.html +418 -0
  22. package/coverage/lcov-report/src/Config/SettingOption.ts.html +424 -0
  23. package/coverage/lcov-report/src/Config/SettingText.ts.html +331 -0
  24. package/coverage/lcov-report/src/Config/index.html +191 -0
  25. package/coverage/lcov-report/src/DataChannel/DataChannelController.ts.html +499 -0
  26. package/coverage/lcov-report/src/DataChannel/DataChannelSender.ts.html +262 -0
  27. package/coverage/lcov-report/src/DataChannel/InitialSettings.ts.html +268 -0
  28. package/coverage/lcov-report/src/DataChannel/LatencyTestResults.ts.html +313 -0
  29. package/coverage/lcov-report/src/DataChannel/index.html +161 -0
  30. package/coverage/lcov-report/src/FreezeFrame/FreezeFrame.ts.html +427 -0
  31. package/coverage/lcov-report/src/FreezeFrame/FreezeFrameController.ts.html +427 -0
  32. package/coverage/lcov-report/src/FreezeFrame/index.html +131 -0
  33. package/coverage/lcov-report/src/Inputs/FakeTouchController.ts.html +682 -0
  34. package/coverage/lcov-report/src/Inputs/GamepadController.ts.html +985 -0
  35. package/coverage/lcov-report/src/Inputs/HoveringMouseEvents.ts.html +688 -0
  36. package/coverage/lcov-report/src/Inputs/InputClassesFactory.ts.html +505 -0
  37. package/coverage/lcov-report/src/Inputs/KeyboardController.ts.html +1048 -0
  38. package/coverage/lcov-report/src/Inputs/LockedMouseEvents.ts.html +946 -0
  39. package/coverage/lcov-report/src/Inputs/MouseButtons.ts.html +160 -0
  40. package/coverage/lcov-report/src/Inputs/MouseController.ts.html +1171 -0
  41. package/coverage/lcov-report/src/Inputs/SpecialKeyCodes.ts.html +133 -0
  42. package/coverage/lcov-report/src/Inputs/TouchController.ts.html +712 -0
  43. package/coverage/lcov-report/src/Inputs/XRGamepadController.ts.html +463 -0
  44. package/coverage/lcov-report/src/Inputs/index.html +266 -0
  45. package/coverage/lcov-report/src/Logger/Logger.ts.html +325 -0
  46. package/coverage/lcov-report/src/Logger/index.html +116 -0
  47. package/coverage/lcov-report/src/PeerConnectionController/AggregatedStats.ts.html +1018 -0
  48. package/coverage/lcov-report/src/PeerConnectionController/CandidatePairStats.ts.html +136 -0
  49. package/coverage/lcov-report/src/PeerConnectionController/CandidateStat.ts.html +124 -0
  50. package/coverage/lcov-report/src/PeerConnectionController/DataChannelStats.ts.html +136 -0
  51. package/coverage/lcov-report/src/PeerConnectionController/InboundRTPStats.ts.html +547 -0
  52. package/coverage/lcov-report/src/PeerConnectionController/OutBoundRTPStats.ts.html +163 -0
  53. package/coverage/lcov-report/src/PeerConnectionController/PeerConnectionController.ts.html +1795 -0
  54. package/coverage/lcov-report/src/PeerConnectionController/SessionStats.ts.html +115 -0
  55. package/coverage/lcov-report/src/PeerConnectionController/StreamStats.ts.html +118 -0
  56. package/coverage/lcov-report/src/PeerConnectionController/index.html +236 -0
  57. package/coverage/lcov-report/src/PixelStreaming/PixelStreaming.ts.html +2269 -0
  58. package/coverage/lcov-report/src/PixelStreaming/index.html +116 -0
  59. package/coverage/lcov-report/src/UI/OnScreenKeyboard.ts.html +376 -0
  60. package/coverage/lcov-report/src/UI/index.html +116 -0
  61. package/coverage/lcov-report/src/UeInstanceMessage/ResponseController.ts.html +226 -0
  62. package/coverage/lcov-report/src/UeInstanceMessage/SendDescriptorController.ts.html +346 -0
  63. package/coverage/lcov-report/src/UeInstanceMessage/SendMessageController.ts.html +364 -0
  64. package/coverage/lcov-report/src/UeInstanceMessage/StreamMessageController.ts.html +862 -0
  65. package/coverage/lcov-report/src/UeInstanceMessage/ToStreamerMessagesController.ts.html +271 -0
  66. package/coverage/lcov-report/src/UeInstanceMessage/TwoWayMap.ts.html +241 -0
  67. package/coverage/lcov-report/src/UeInstanceMessage/index.html +191 -0
  68. package/coverage/lcov-report/src/Util/CoordinateConverter.ts.html +952 -0
  69. package/coverage/lcov-report/src/Util/EventEmitter.ts.html +1705 -0
  70. package/coverage/lcov-report/src/Util/EventListenerTracker.ts.html +172 -0
  71. package/coverage/lcov-report/src/Util/FileUtil.ts.html +505 -0
  72. package/coverage/lcov-report/src/Util/WebGLUtils.ts.html +232 -0
  73. package/coverage/lcov-report/src/Util/WebXRUtils.ts.html +160 -0
  74. package/coverage/lcov-report/src/Util/index.html +191 -0
  75. package/coverage/lcov-report/src/VideoPlayer/StreamController.ts.html +349 -0
  76. package/coverage/lcov-report/src/VideoPlayer/VideoPlayer.ts.html +799 -0
  77. package/coverage/lcov-report/src/VideoPlayer/index.html +131 -0
  78. package/coverage/lcov-report/src/WebRtcPlayer/WebRtcPlayerController.ts.html +6199 -0
  79. package/coverage/lcov-report/src/WebRtcPlayer/index.html +116 -0
  80. package/coverage/lcov-report/src/WebSockets/MessageReceive.ts.html +352 -0
  81. package/coverage/lcov-report/src/WebSockets/MessageSend.ts.html +604 -0
  82. package/coverage/lcov-report/src/WebSockets/SignallingProtocol.ts.html +622 -0
  83. package/coverage/lcov-report/src/WebSockets/WebSocketController.ts.html +844 -0
  84. package/coverage/lcov-report/src/WebSockets/index.html +161 -0
  85. package/coverage/lcov-report/src/WebXR/WebXRController.ts.html +1042 -0
  86. package/coverage/lcov-report/src/WebXR/index.html +116 -0
  87. package/coverage/lcov-report/src/__test__/index.html +161 -0
  88. package/coverage/lcov-report/src/__test__/mockMediaStream.ts.html +457 -0
  89. package/coverage/lcov-report/src/__test__/mockRTCPeerConnection.ts.html +1126 -0
  90. package/coverage/lcov-report/src/__test__/mockRTCRtpReceiver.ts.html +151 -0
  91. package/coverage/lcov-report/src/__test__/mockWebSocket.ts.html +475 -0
  92. package/coverage/lcov-report/src/index.html +116 -0
  93. package/coverage/lcov-report/src/pixelstreamingfrontend.ts.html +232 -0
  94. package/coverage/lcov.info +6458 -0
  95. package/jest.config.js +18 -0
  96. package/package.json +46 -18
  97. package/readme.md +15 -0
  98. package/src/AFK/AFKController.test.ts +162 -0
  99. package/src/AFK/AFKController.ts +158 -0
  100. package/src/Config/Config.test.ts +222 -0
  101. package/src/Config/Config.ts +909 -0
  102. package/src/Config/SettingBase.ts +65 -0
  103. package/src/Config/SettingFlag.ts +99 -0
  104. package/src/Config/SettingNumber.ts +111 -0
  105. package/src/Config/SettingOption.ts +124 -0
  106. package/src/Config/SettingText.ts +82 -0
  107. package/src/DataChannel/DataChannelController.ts +138 -0
  108. package/src/DataChannel/DataChannelLatencyTestController.ts +129 -0
  109. package/src/DataChannel/DataChannelLatencyTestResults.ts +67 -0
  110. package/src/DataChannel/DataChannelSender.ts +59 -0
  111. package/src/DataChannel/InitialSettings.ts +61 -0
  112. package/src/DataChannel/LatencyTestResults.ts +76 -0
  113. package/src/FreezeFrame/FreezeFrame.ts +114 -0
  114. package/src/FreezeFrame/FreezeFrameController.ts +114 -0
  115. package/src/Inputs/FakeTouchController.ts +199 -0
  116. package/src/Inputs/GamepadController.ts +300 -0
  117. package/src/Inputs/GamepadTypes.ts +10 -0
  118. package/src/Inputs/HoveringMouseEvents.ts +192 -0
  119. package/src/Inputs/IMouseEvents.ts +64 -0
  120. package/src/Inputs/ITouchController.ts +29 -0
  121. package/src/Inputs/InputClassesFactory.ts +140 -0
  122. package/src/Inputs/KeyboardController.ts +318 -0
  123. package/src/Inputs/LockedMouseEvents.ts +287 -0
  124. package/src/Inputs/MouseButtons.ts +25 -0
  125. package/src/Inputs/MouseController.ts +362 -0
  126. package/src/Inputs/SpecialKeyCodes.ts +16 -0
  127. package/src/Inputs/TouchController.ts +253 -0
  128. package/src/Inputs/XRGamepadController.ts +126 -0
  129. package/src/Logger/Logger.ts +80 -0
  130. package/src/PeerConnectionController/AggregatedStats.ts +311 -0
  131. package/src/PeerConnectionController/CandidatePairStats.ts +17 -0
  132. package/src/PeerConnectionController/CandidateStat.ts +13 -0
  133. package/src/PeerConnectionController/CodecStats.ts +19 -0
  134. package/src/PeerConnectionController/DataChannelStats.ts +17 -0
  135. package/src/PeerConnectionController/InboundRTPStats.ts +154 -0
  136. package/src/PeerConnectionController/InboundTrackStats.ts +34 -0
  137. package/src/PeerConnectionController/OutBoundRTPStats.ts +26 -0
  138. package/src/PeerConnectionController/PeerConnectionController.ts +563 -0
  139. package/src/PeerConnectionController/SessionStats.ts +10 -0
  140. package/src/PeerConnectionController/StreamStats.ts +11 -0
  141. package/src/PixelStreaming/PixelStreaming.test.ts +624 -0
  142. package/src/PixelStreaming/PixelStreaming.ts +847 -0
  143. package/src/UI/OnScreenKeyboard.ts +97 -0
  144. package/src/UeInstanceMessage/ResponseController.ts +47 -0
  145. package/src/UeInstanceMessage/SendMessageController.ts +154 -0
  146. package/src/UeInstanceMessage/StreamMessageController.ts +233 -0
  147. package/src/UeInstanceMessage/ToStreamerMessagesController.ts +62 -0
  148. package/src/Util/CoordinateConverter.ts +289 -0
  149. package/src/Util/EventEmitter.ts +595 -0
  150. package/src/Util/EventListenerTracker.ts +29 -0
  151. package/src/Util/FileUtil.ts +140 -0
  152. package/src/Util/RTCUtils.ts +41 -0
  153. package/src/Util/WebGLUtils.ts +49 -0
  154. package/src/Util/WebXRUtils.ts +25 -0
  155. package/src/VideoPlayer/StreamController.ts +89 -0
  156. package/src/VideoPlayer/VideoPlayer.ts +246 -0
  157. package/src/WebRtcPlayer/WebRtcPlayerController.ts +2144 -0
  158. package/src/WebSockets/MessageReceive.ts +89 -0
  159. package/src/WebSockets/MessageSend.ts +185 -0
  160. package/src/WebSockets/SignallingProtocol.ts +180 -0
  161. package/src/WebSockets/WebSocketController.ts +267 -0
  162. package/src/WebXR/WebXRController.ts +319 -0
  163. package/src/__test__/mockMediaStream.ts +124 -0
  164. package/src/__test__/mockRTCPeerConnection.ts +347 -0
  165. package/src/__test__/mockRTCRtpReceiver.ts +22 -0
  166. package/src/__test__/mockWebSocket.ts +130 -0
  167. package/src/pixelstreamingfrontend.ts +50 -0
  168. package/tsconfig.jest.json +8 -0
  169. package/tsconfig.json +24 -0
  170. package/webpack.common.js +35 -0
  171. package/webpack.dev.js +35 -0
  172. package/webpack.prod.js +36 -0
  173. package/yang__yj-pixelstreaming-core-1.0.1.tgz +0 -0
  174. /package/{library/dist → dist}/lib-pixelstreamingfrontend.esm.js +0 -0
  175. /package/{library/dist → dist}/lib-pixelstreamingfrontend.js +0 -0
  176. /package/{library/types → types}/AFK/AFKController.d.ts +0 -0
  177. /package/{library/types → types}/Config/Config.d.ts +0 -0
  178. /package/{library/types → types}/Config/SettingBase.d.ts +0 -0
  179. /package/{library/types → types}/Config/SettingFlag.d.ts +0 -0
  180. /package/{library/types → types}/Config/SettingNumber.d.ts +0 -0
  181. /package/{library/types → types}/Config/SettingOption.d.ts +0 -0
  182. /package/{library/types → types}/Config/SettingText.d.ts +0 -0
  183. /package/{library/types → types}/DataChannel/DataChannelController.d.ts +0 -0
  184. /package/{library/types → types}/DataChannel/DataChannelSender.d.ts +0 -0
  185. /package/{library/types → types}/DataChannel/InitialSettings.d.ts +0 -0
  186. /package/{library/types → types}/DataChannel/LatencyTestResults.d.ts +0 -0
  187. /package/{library/types → types}/FreezeFrame/FreezeFrame.d.ts +0 -0
  188. /package/{library/types → types}/FreezeFrame/FreezeFrameController.d.ts +0 -0
  189. /package/{library/types → types}/Inputs/FakeTouchController.d.ts +0 -0
  190. /package/{library/types → types}/Inputs/GamepadController.d.ts +0 -0
  191. /package/{library/types → types}/Inputs/GamepadTypes.d.ts +0 -0
  192. /package/{library/types → types}/Inputs/HoveringMouseEvents.d.ts +0 -0
  193. /package/{library/types → types}/Inputs/IMouseEvents.d.ts +0 -0
  194. /package/{library/types → types}/Inputs/ITouchController.d.ts +0 -0
  195. /package/{library/types → types}/Inputs/InputClassesFactory.d.ts +0 -0
  196. /package/{library/types → types}/Inputs/KeyboardController.d.ts +0 -0
  197. /package/{library/types → types}/Inputs/LockedMouseEvents.d.ts +0 -0
  198. /package/{library/types → types}/Inputs/MouseButtons.d.ts +0 -0
  199. /package/{library/types → types}/Inputs/MouseController.d.ts +0 -0
  200. /package/{library/types → types}/Inputs/SpecialKeyCodes.d.ts +0 -0
  201. /package/{library/types → types}/Inputs/TouchController.d.ts +0 -0
  202. /package/{library/types → types}/Inputs/XRGamepadController.d.ts +0 -0
  203. /package/{library/types → types}/Logger/Logger.d.ts +0 -0
  204. /package/{library/types → types}/PeerConnectionController/AggregatedStats.d.ts +0 -0
  205. /package/{library/types → types}/PeerConnectionController/CandidatePairStats.d.ts +0 -0
  206. /package/{library/types → types}/PeerConnectionController/CandidateStat.d.ts +0 -0
  207. /package/{library/types → types}/PeerConnectionController/CodecStats.d.ts +0 -0
  208. /package/{library/types → types}/PeerConnectionController/DataChannelStats.d.ts +0 -0
  209. /package/{library/types → types}/PeerConnectionController/InboundRTPStats.d.ts +0 -0
  210. /package/{library/types → types}/PeerConnectionController/InboundTrackStats.d.ts +0 -0
  211. /package/{library/types → types}/PeerConnectionController/OutBoundRTPStats.d.ts +0 -0
  212. /package/{library/types → types}/PeerConnectionController/PeerConnectionController.d.ts +0 -0
  213. /package/{library/types → types}/PeerConnectionController/SessionStats.d.ts +0 -0
  214. /package/{library/types → types}/PeerConnectionController/StreamStats.d.ts +0 -0
  215. /package/{library/types → types}/PixelStreaming/PixelStreaming.d.ts +0 -0
  216. /package/{library/types → types}/UI/OnScreenKeyboard.d.ts +0 -0
  217. /package/{library/types → types}/UeInstanceMessage/ResponseController.d.ts +0 -0
  218. /package/{library/types → types}/UeInstanceMessage/SendDescriptorController.d.ts +0 -0
  219. /package/{library/types → types}/UeInstanceMessage/SendMessageController.d.ts +0 -0
  220. /package/{library/types → types}/UeInstanceMessage/StreamMessageController.d.ts +0 -0
  221. /package/{library/types → types}/UeInstanceMessage/ToStreamerMessagesController.d.ts +0 -0
  222. /package/{library/types → types}/UeInstanceMessage/TwoWayMap.d.ts +0 -0
  223. /package/{library/types → types}/Util/CoordinateConverter.d.ts +0 -0
  224. /package/{library/types → types}/Util/EventEmitter.d.ts +0 -0
  225. /package/{library/types → types}/Util/EventListenerTracker.d.ts +0 -0
  226. /package/{library/types → types}/Util/FileUtil.d.ts +0 -0
  227. /package/{library/types → types}/Util/WebGLUtils.d.ts +0 -0
  228. /package/{library/types → types}/Util/WebXRUtils.d.ts +0 -0
  229. /package/{library/types → types}/VideoPlayer/StreamController.d.ts +0 -0
  230. /package/{library/types → types}/VideoPlayer/VideoPlayer.d.ts +0 -0
  231. /package/{library/types → types}/WebRtcPlayer/WebRtcPlayerController.d.ts +0 -0
  232. /package/{library/types → types}/WebSockets/MessageReceive.d.ts +0 -0
  233. /package/{library/types → types}/WebSockets/MessageSend.d.ts +0 -0
  234. /package/{library/types → types}/WebSockets/SignallingProtocol.d.ts +0 -0
  235. /package/{library/types → types}/WebSockets/WebSocketController.d.ts +0 -0
  236. /package/{library/types → types}/WebXR/WebXRController.d.ts +0 -0
  237. /package/{library/types → types}/pixelstreamingfrontend.d.ts +0 -0
@@ -0,0 +1,847 @@
1
+ // Copyright Epic Games, Inc. All Rights Reserved.
2
+
3
+ import { Config, OptionParameters } from '../Config/Config';
4
+ import { LatencyTestResults } from '../DataChannel/LatencyTestResults';
5
+ import { AggregatedStats } from '../PeerConnectionController/AggregatedStats';
6
+ import { WebRtcPlayerController } from '../WebRtcPlayer/WebRtcPlayerController';
7
+ import { Flags, NumericParameters } from '../Config/Config';
8
+ import { Logger } from '../Logger/Logger';
9
+ import { InitialSettings } from '../DataChannel/InitialSettings';
10
+ import { OnScreenKeyboard } from '../UI/OnScreenKeyboard';
11
+ import {
12
+ EventEmitter,
13
+ InitialSettingsEvent,
14
+ LatencyTestResultEvent,
15
+ PixelStreamingEvent,
16
+ StatsReceivedEvent,
17
+ StreamLoadingEvent,
18
+ StreamPreConnectEvent,
19
+ StreamReconnectEvent,
20
+ StreamPreDisconnectEvent,
21
+ VideoEncoderAvgQPEvent,
22
+ VideoInitializedEvent,
23
+ WebRtcAutoConnectEvent,
24
+ WebRtcConnectedEvent,
25
+ WebRtcConnectingEvent,
26
+ WebRtcDisconnectedEvent,
27
+ WebRtcFailedEvent,
28
+ WebRtcSdpEvent,
29
+ DataChannelLatencyTestResponseEvent,
30
+ DataChannelLatencyTestResultEvent,
31
+ PlayerCountEvent
32
+ } from '../Util/EventEmitter';
33
+ import { MessageOnScreenKeyboard } from '../WebSockets/MessageReceive';
34
+ import { WebXRController } from '../WebXR/WebXRController';
35
+ import { MessageDirection } from '../UeInstanceMessage/StreamMessageController';
36
+ import {
37
+ DataChannelLatencyTestConfig,
38
+ DataChannelLatencyTestController
39
+ } from "../DataChannel/DataChannelLatencyTestController";
40
+ import {
41
+ DataChannelLatencyTestResponse,
42
+ DataChannelLatencyTestResult
43
+ } from "../DataChannel/DataChannelLatencyTestResults";
44
+ import { RTCUtils } from '../Util/RTCUtils';
45
+
46
+
47
+ export interface PixelStreamingOverrides {
48
+ /** The DOM elment where Pixel Streaming video and user input event handlers are attached to.
49
+ * You can give an existing DOM element here. If not given, the library will create a new div element
50
+ * that is not attached anywhere. In this case you can later get access to this new element and
51
+ * attach it to your web page. */
52
+ videoElementParent?: HTMLElement;
53
+ }
54
+
55
+ /**
56
+ * The key class for the browser side of a Pixel Streaming application, it includes:
57
+ * WebRTC handling, XR support, input handling, and emitters for lifetime and state change events.
58
+ * Users are encouraged to use this class as is, through composition, or extend it. In any case,
59
+ * this will likely be the core of your Pixel Streaming experience in terms of functionality.
60
+ */
61
+ export class PixelStreaming {
62
+ protected _webRtcController: WebRtcPlayerController;
63
+ protected _webXrController: WebXRController;
64
+ protected _dataChannelLatencyTestController: DataChannelLatencyTestController;
65
+ /**
66
+ * Configuration object. You can read or modify config through this object. Whenever
67
+ * the configuration is changed, the library will emit a `settingsChanged` event.
68
+ */
69
+ public config: Config;
70
+
71
+ private _videoElementParent: HTMLElement;
72
+
73
+ private allowConsoleCommands = false;
74
+
75
+ private onScreenKeyboardHelper: OnScreenKeyboard;
76
+
77
+ private _videoStartTime: number;
78
+ private _inputController: boolean;
79
+
80
+ private _eventEmitter: EventEmitter;
81
+
82
+ /**
83
+ * @param config - A newly instantiated config object
84
+ * @param overrides - Parameters to override default behaviour
85
+ * returns the base Pixel streaming object
86
+ */
87
+ constructor(config: Config, overrides?: PixelStreamingOverrides) {
88
+ this.config = config;
89
+
90
+ if (overrides?.videoElementParent) {
91
+ this._videoElementParent = overrides.videoElementParent;
92
+ }
93
+
94
+ this._eventEmitter = new EventEmitter();
95
+
96
+ this.configureSettings();
97
+
98
+ // setup WebRTC
99
+ this.setWebRtcPlayerController(
100
+ new WebRtcPlayerController(this.config, this)
101
+ );
102
+
103
+ // Onscreen keyboard
104
+ this.onScreenKeyboardHelper = new OnScreenKeyboard(
105
+ this.videoElementParent
106
+ );
107
+ this.onScreenKeyboardHelper.unquantizeAndDenormalizeUnsigned = (
108
+ x: number,
109
+ y: number
110
+ ) =>
111
+ this._webRtcController.requestUnquantizedAndDenormalizeUnsigned(
112
+ x,
113
+ y
114
+ );
115
+ this._activateOnScreenKeyboard = (command: MessageOnScreenKeyboard) =>
116
+ this.onScreenKeyboardHelper.showOnScreenKeyboard(command);
117
+
118
+ this._webXrController = new WebXRController(this._webRtcController);
119
+ }
120
+
121
+ /**
122
+ * Gets the element that contains the video stream element.
123
+ */
124
+ public get videoElementParent(): HTMLElement {
125
+ if (!this._videoElementParent) {
126
+ this._videoElementParent = document.createElement('div');
127
+ this._videoElementParent.id = 'videoElementParent';
128
+ }
129
+ return this._videoElementParent;
130
+ }
131
+
132
+ /**
133
+ * Configure the settings with on change listeners and any additional per experience settings.
134
+ */
135
+ private configureSettings(): void {
136
+ this.config._addOnSettingChangedListener(
137
+ Flags.IsQualityController,
138
+ (wantsQualityController: boolean) => {
139
+ // If the setting has been set to true (either programatically or the user has flicked the toggle)
140
+ // and we aren't currently quality controller, send the request
141
+ if (
142
+ wantsQualityController === true &&
143
+ !this._webRtcController.isQualityController
144
+ ) {
145
+ this._webRtcController.sendRequestQualityControlOwnership();
146
+ }
147
+ }
148
+ );
149
+
150
+ this.config._addOnSettingChangedListener(
151
+ Flags.AFKDetection,
152
+ (isAFKEnabled: boolean) => {
153
+ this._webRtcController.setAfkEnabled(isAFKEnabled);
154
+ }
155
+ );
156
+
157
+ this.config._addOnSettingChangedListener(
158
+ Flags.MatchViewportResolution,
159
+ () => {
160
+ this._webRtcController.videoPlayer.updateVideoStreamSize();
161
+ }
162
+ );
163
+
164
+ this.config._addOnSettingChangedListener(
165
+ Flags.HoveringMouseMode,
166
+ (isHoveringMouse: boolean) => {
167
+ this.config.setFlagLabel(
168
+ Flags.HoveringMouseMode,
169
+ `Control Scheme: ${isHoveringMouse ? 'Hovering' : 'Locked'
170
+ } Mouse`
171
+ );
172
+ this._webRtcController.setMouseInputEnabled(this.config.isFlagEnabled(Flags.MouseInput));
173
+ }
174
+ );
175
+
176
+ // user input
177
+ this.config._addOnSettingChangedListener(
178
+ Flags.KeyboardInput,
179
+ (isEnabled: boolean) => {
180
+ this._webRtcController.setKeyboardInputEnabled(isEnabled);
181
+ }
182
+ );
183
+
184
+ this.config._addOnSettingChangedListener(
185
+ Flags.MouseInput,
186
+ (isEnabled: boolean) => {
187
+ this._webRtcController.setMouseInputEnabled(isEnabled);
188
+ }
189
+ );
190
+
191
+ this.config._addOnSettingChangedListener(
192
+ Flags.TouchInput,
193
+ (isEnabled: boolean) => {
194
+ this._webRtcController.setTouchInputEnabled(isEnabled);
195
+ }
196
+ );
197
+
198
+ this.config._addOnSettingChangedListener(
199
+ Flags.GamepadInput,
200
+ (isEnabled: boolean) => {
201
+ this._webRtcController.setGamePadInputEnabled(isEnabled);
202
+ }
203
+ );
204
+
205
+ // encoder settings
206
+ this.config._addOnNumericSettingChangedListener(
207
+ NumericParameters.MinQP,
208
+ (newValue: number) => {
209
+ Logger.Log(
210
+ Logger.GetStackTrace(),
211
+ '-------- Sending MinQP --------',
212
+ 7
213
+ );
214
+ this._webRtcController.sendEncoderMinQP(newValue);
215
+ Logger.Log(
216
+ Logger.GetStackTrace(),
217
+ '-------------------------------------------',
218
+ 7
219
+ );
220
+ }
221
+ );
222
+
223
+ this.config._addOnNumericSettingChangedListener(
224
+ NumericParameters.MaxQP,
225
+ (newValue: number) => {
226
+ Logger.Log(
227
+ Logger.GetStackTrace(),
228
+ '-------- Sending encoder settings --------',
229
+ 7
230
+ );
231
+ this._webRtcController.sendEncoderMaxQP(newValue);
232
+ Logger.Log(
233
+ Logger.GetStackTrace(),
234
+ '-------------------------------------------',
235
+ 7
236
+ );
237
+ }
238
+ );
239
+
240
+ // WebRTC settings
241
+ this.config._addOnNumericSettingChangedListener(
242
+ NumericParameters.WebRTCMinBitrate,
243
+ (newValue: number) => {
244
+ Logger.Log(
245
+ Logger.GetStackTrace(),
246
+ '-------- Sending web rtc settings --------',
247
+ 7
248
+ );
249
+ this._webRtcController.sendWebRTCMinBitrate(newValue * 1000 /* kbps to bps */);
250
+ Logger.Log(
251
+ Logger.GetStackTrace(),
252
+ '-------------------------------------------',
253
+ 7
254
+ );
255
+ }
256
+ );
257
+
258
+ this.config._addOnNumericSettingChangedListener(
259
+ NumericParameters.WebRTCMaxBitrate,
260
+ (newValue: number) => {
261
+ Logger.Log(
262
+ Logger.GetStackTrace(),
263
+ '-------- Sending web rtc settings --------',
264
+ 7
265
+ );
266
+ this._webRtcController.sendWebRTCMaxBitrate(newValue * 1000 /* kbps to bps */);
267
+ Logger.Log(
268
+ Logger.GetStackTrace(),
269
+ '-------------------------------------------',
270
+ 7
271
+ );
272
+ }
273
+ );
274
+
275
+ this.config._addOnNumericSettingChangedListener(
276
+ NumericParameters.WebRTCFPS,
277
+ (newValue: number) => {
278
+ Logger.Log(
279
+ Logger.GetStackTrace(),
280
+ '-------- Sending web rtc settings --------',
281
+ 7
282
+ );
283
+ this._webRtcController.sendWebRTCFps(newValue);
284
+ Logger.Log(
285
+ Logger.GetStackTrace(),
286
+ '-------------------------------------------',
287
+ 7
288
+ );
289
+ }
290
+ );
291
+
292
+ this.config._addOnOptionSettingChangedListener(
293
+ OptionParameters.PreferredCodec,
294
+ (newValue: string) => {
295
+ if (this._webRtcController) {
296
+ this._webRtcController.setPreferredCodec(newValue);
297
+ }
298
+ }
299
+ );
300
+
301
+ this.config._registerOnChangeEvents(this._eventEmitter);
302
+ }
303
+
304
+ /**
305
+ * Activate the on screen keyboard when receiving the command from the streamer
306
+ * @param command - the keyboard command
307
+ */
308
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
309
+ _activateOnScreenKeyboard(command: MessageOnScreenKeyboard): void {
310
+ throw new Error('Method not implemented.');
311
+ }
312
+
313
+ /**
314
+ * Set the input control ownership
315
+ * @param inputControlOwnership - does the user have input control ownership
316
+ */
317
+ _onInputControlOwnership(inputControlOwnership: boolean): void {
318
+ this._inputController = inputControlOwnership;
319
+ }
320
+
321
+ /**
322
+ * Instantiate the WebRTCPlayerController interface to provide WebRTCPlayerController functionality within this class and set up anything that requires it
323
+ * @param webRtcPlayerController - a WebRtcPlayerController controller instance
324
+ */
325
+ private setWebRtcPlayerController(
326
+ webRtcPlayerController: WebRtcPlayerController
327
+ ) {
328
+ this._webRtcController = webRtcPlayerController;
329
+
330
+ this._webRtcController.setPreferredCodec(
331
+ this.config.getSettingOption(OptionParameters.PreferredCodec)
332
+ .selected
333
+ );
334
+ this._webRtcController.resizePlayerStyle();
335
+
336
+ // connect if auto connect flag is enabled
337
+ this.checkForAutoConnect();
338
+ }
339
+
340
+ /**
341
+ * Connect to signaling server.
342
+ */
343
+ public connect() {
344
+ this._eventEmitter.dispatchEvent(new StreamPreConnectEvent());
345
+ this._webRtcController.connectToSignallingServer();
346
+ }
347
+
348
+ /**
349
+ * Reconnects to the signaling server. If connection is up, disconnects first
350
+ * before establishing a new connection
351
+ */
352
+ public reconnect() {
353
+ this._eventEmitter.dispatchEvent(new StreamReconnectEvent());
354
+ this._webRtcController.tryReconnect("Reconnecting...");
355
+ }
356
+
357
+ /**
358
+ * Disconnect from the signaling server and close open peer connections.
359
+ */
360
+ public disconnect() {
361
+ this._eventEmitter.dispatchEvent(new StreamPreDisconnectEvent());
362
+ this._webRtcController.close();
363
+ }
364
+
365
+ /**
366
+ * Play the stream. Can be called only after a peer connection has been established.
367
+ */
368
+ public play() {
369
+ this._onStreamLoading();
370
+ this._webRtcController.playStream();
371
+ }
372
+
373
+ /**
374
+ * Auto connect if AutoConnect flag is enabled
375
+ */
376
+ private checkForAutoConnect() {
377
+ // set up if the auto play will be used or regular click to start
378
+ console.log(this.config.isFlagEnabled(Flags.AutoConnect), '====ssss');
379
+
380
+ if (this.config.isFlagEnabled(Flags.AutoConnect)) {
381
+ // if autoplaying show an info overlay while while waiting for the connection to begin
382
+ this._onWebRtcAutoConnect();
383
+ this._webRtcController.connectToSignallingServer();
384
+ }
385
+ }
386
+
387
+ /**
388
+ * Will unmute the microphone track which is sent to Unreal Engine.
389
+ * By default, will only unmute an existing mic track.
390
+ *
391
+ * @param forceEnable Can be used for cases when this object wasn't initialized with a mic track.
392
+ * If this parameter is true, the connection will be restarted with a microphone.
393
+ * Warning: this takes some time, as a full renegotiation and reconnection will happen.
394
+ */
395
+ public unmuteMicrophone(forceEnable = false): void {
396
+ // If there's an existing mic track, we just set muted state
397
+ if (this.config.isFlagEnabled('UseMic')) {
398
+ this.setMicrophoneMuted(false);
399
+ return;
400
+ }
401
+
402
+ // If there's no pre-existing mic track, and caller is ok with full reset, we enable and reset
403
+ if (forceEnable) {
404
+ this.config.setFlagEnabled("UseMic", true);
405
+ this.reconnect();
406
+ return;
407
+ }
408
+
409
+ // If we prefer not to force a reconnection, just warn the user that this operation didn't happen
410
+ Logger.Warning(
411
+ Logger.GetStackTrace(),
412
+ 'Trying to unmute mic, but PixelStreaming was initialized with no microphone track. Call with forceEnable == true to re-connect with a mic track.'
413
+ );
414
+ }
415
+
416
+ public muteMicrophone(): void {
417
+ if (this.config.isFlagEnabled('UseMic')) {
418
+ this.setMicrophoneMuted(true);
419
+ return;
420
+ }
421
+
422
+ // If there wasn't a mic track, just let user know there's nothing to mute
423
+ Logger.Info(
424
+ Logger.GetStackTrace(),
425
+ 'Trying to mute mic, but PixelStreaming has no microphone track, so sending sound is already disabled.'
426
+ );
427
+ }
428
+
429
+ private setMicrophoneMuted(mute: boolean): void {
430
+ for (const transceiver of this._webRtcController?.peerConnectionController?.peerConnection?.getTransceivers() ?? []) {
431
+ if (RTCUtils.canTransceiverSendAudio(transceiver)) {
432
+ transceiver.sender.track.enabled = !mute;
433
+ }
434
+ }
435
+ }
436
+
437
+ /**
438
+ * Emit an event on auto connecting
439
+ */
440
+ _onWebRtcAutoConnect() {
441
+ this._eventEmitter.dispatchEvent(new WebRtcAutoConnectEvent());
442
+ }
443
+
444
+ /**
445
+ * Set up functionality to happen when receiving a webRTC answer
446
+ */
447
+ _onWebRtcSdp() {
448
+ this._eventEmitter.dispatchEvent(new WebRtcSdpEvent());
449
+ }
450
+
451
+ /**
452
+ * Emits a StreamLoading event
453
+ */
454
+ _onStreamLoading() {
455
+ this._eventEmitter.dispatchEvent(new StreamLoadingEvent());
456
+ }
457
+
458
+ /**
459
+ * Event fired when the video is disconnected - emits given eventString or an override
460
+ * message from webRtcController if one has been set
461
+ * @param eventString - a string describing why the connection closed
462
+ * @param allowClickToReconnect - true if we want to allow the user to retry the connection with a click
463
+ */
464
+ _onDisconnect(eventString: string, allowClickToReconnect: boolean) {
465
+ this._eventEmitter.dispatchEvent(
466
+ new WebRtcDisconnectedEvent({
467
+ eventString: eventString,
468
+ allowClickToReconnect: allowClickToReconnect
469
+ })
470
+ );
471
+ }
472
+
473
+ /**
474
+ * Handles when Web Rtc is connecting
475
+ */
476
+ _onWebRtcConnecting() {
477
+ this._eventEmitter.dispatchEvent(new WebRtcConnectingEvent());
478
+ }
479
+
480
+ /**
481
+ * Handles when Web Rtc has connected
482
+ */
483
+ _onWebRtcConnected() {
484
+ this._eventEmitter.dispatchEvent(new WebRtcConnectedEvent());
485
+ }
486
+
487
+ /**
488
+ * Handles when Web Rtc fails to connect
489
+ */
490
+ _onWebRtcFailed() {
491
+ this._eventEmitter.dispatchEvent(new WebRtcFailedEvent());
492
+ }
493
+
494
+ /**
495
+ * Handle when the Video has been Initialized
496
+ */
497
+ _onVideoInitialized() {
498
+ this._eventEmitter.dispatchEvent(new VideoInitializedEvent());
499
+ this._videoStartTime = Date.now();
500
+ }
501
+
502
+ /**
503
+ * Set up functionality to happen when receiving latency test results
504
+ * @param latency - latency test results object
505
+ */
506
+ _onLatencyTestResult(latencyTimings: LatencyTestResults) {
507
+ this._eventEmitter.dispatchEvent(
508
+ new LatencyTestResultEvent({ latencyTimings })
509
+ );
510
+ }
511
+
512
+ _onDataChannelLatencyTestResponse(response: DataChannelLatencyTestResponse) {
513
+ this._eventEmitter.dispatchEvent(
514
+ new DataChannelLatencyTestResponseEvent({ response })
515
+ );
516
+ }
517
+
518
+ /**
519
+ * Set up functionality to happen when receiving video statistics
520
+ * @param videoStats - video statistics as a aggregate stats object
521
+ */
522
+ _onVideoStats(videoStats: AggregatedStats) {
523
+ // Duration
524
+ if (!this._videoStartTime || this._videoStartTime === undefined) {
525
+ this._videoStartTime = Date.now();
526
+ }
527
+ videoStats.handleSessionStatistics(
528
+ this._videoStartTime,
529
+ this._inputController,
530
+ this._webRtcController.videoAvgQp
531
+ );
532
+
533
+ this._eventEmitter.dispatchEvent(
534
+ new StatsReceivedEvent({ aggregatedStats: videoStats })
535
+ );
536
+ }
537
+
538
+ /**
539
+ * Set up functionality to happen when calculating the average video encoder qp
540
+ * @param QP - the quality number of the stream
541
+ */
542
+ _onVideoEncoderAvgQP(QP: number) {
543
+ this._eventEmitter.dispatchEvent(
544
+ new VideoEncoderAvgQPEvent({ avgQP: QP })
545
+ );
546
+ }
547
+
548
+ /**
549
+ * Set up functionality to happen when receiving and handling initial settings for the UE app
550
+ * @param settings - initial UE app settings
551
+ */
552
+ _onInitialSettings(settings: InitialSettings) {
553
+ this._eventEmitter.dispatchEvent(
554
+ new InitialSettingsEvent({ settings })
555
+ );
556
+ if (settings.PixelStreamingSettings) {
557
+ this.allowConsoleCommands =
558
+ settings.PixelStreamingSettings.AllowPixelStreamingCommands ?? false;
559
+ if (this.allowConsoleCommands === false) {
560
+ Logger.Info(
561
+ Logger.GetStackTrace(),
562
+ '-AllowPixelStreamingCommands=false, sending arbitrary console commands from browser to UE is disabled.'
563
+ );
564
+ }
565
+ }
566
+
567
+ const useUrlParams = this.config.useUrlParams;
568
+ const urlParams = new URLSearchParams(window.location.search);
569
+ if (settings.EncoderSettings) {
570
+ this.config.setNumericSetting(
571
+ NumericParameters.MinQP,
572
+ // If a setting is set in the URL, make sure we respect that value as opposed to what the application sends us
573
+ (useUrlParams && urlParams.has(NumericParameters.MinQP))
574
+ ? Number.parseInt(urlParams.get(NumericParameters.MinQP))
575
+ : settings.EncoderSettings.MinQP
576
+ );
577
+
578
+
579
+ this.config.setNumericSetting(
580
+ NumericParameters.MaxQP,
581
+ (useUrlParams && urlParams.has(NumericParameters.MaxQP))
582
+ ? Number.parseInt(urlParams.get(NumericParameters.MaxQP))
583
+ : settings.EncoderSettings.MaxQP
584
+ );
585
+ }
586
+ if (settings.WebRTCSettings) {
587
+ this.config.setNumericSetting(
588
+ NumericParameters.WebRTCMinBitrate,
589
+ (useUrlParams && urlParams.has(NumericParameters.WebRTCMinBitrate))
590
+ ? Number.parseInt(urlParams.get(NumericParameters.WebRTCMinBitrate))
591
+ : settings.WebRTCSettings.MinBitrate / 1000 /* bps to kbps */
592
+ );
593
+ this.config.setNumericSetting(
594
+ NumericParameters.WebRTCMaxBitrate,
595
+ (useUrlParams && urlParams.has(NumericParameters.WebRTCMaxBitrate))
596
+ ? Number.parseInt(urlParams.get(NumericParameters.WebRTCMaxBitrate))
597
+ : settings.WebRTCSettings.MaxBitrate / 1000 /* bps to kbps */
598
+
599
+ );
600
+ this.config.setNumericSetting(
601
+ NumericParameters.WebRTCFPS,
602
+ (useUrlParams && urlParams.has(NumericParameters.WebRTCFPS))
603
+ ? Number.parseInt(urlParams.get(NumericParameters.WebRTCFPS))
604
+ : settings.WebRTCSettings.FPS
605
+ );
606
+ }
607
+ }
608
+
609
+ /**
610
+ * Set up functionality to happen when setting quality control ownership of a stream
611
+ * @param hasQualityOwnership - does this user have quality ownership of the stream true / false
612
+ */
613
+ _onQualityControlOwnership(hasQualityOwnership: boolean) {
614
+ this.config.setFlagEnabled(
615
+ Flags.IsQualityController,
616
+ hasQualityOwnership
617
+ );
618
+ }
619
+
620
+ _onPlayerCount(playerCount: number) {
621
+ this._eventEmitter.dispatchEvent(
622
+ new PlayerCountEvent({ count: playerCount })
623
+ );
624
+ }
625
+
626
+ /**
627
+ * Request a connection latency test.
628
+ * NOTE: There are plans to refactor all request* functions. Expect changes if you use this!
629
+ * @returns
630
+ */
631
+ public requestLatencyTest() {
632
+ if (!this._webRtcController.videoPlayer.isVideoReady()) {
633
+ return false;
634
+ }
635
+ this._webRtcController.sendLatencyTest();
636
+ return true;
637
+ }
638
+
639
+ /**
640
+ * 请求数据通道延迟测试。
641
+ * 注意:我们计划重构所有的request*函数。如果您使用它,请期待更改!
642
+ */
643
+ public requestDataChannelLatencyTest(config: DataChannelLatencyTestConfig) {
644
+ if (!this._webRtcController.videoPlayer.isVideoReady()) {
645
+ return false;
646
+ }
647
+ if (!this._dataChannelLatencyTestController) {
648
+ this._dataChannelLatencyTestController = new DataChannelLatencyTestController(
649
+ this._webRtcController.sendDataChannelLatencyTest.bind(this._webRtcController),
650
+ (result: DataChannelLatencyTestResult) => {
651
+ this._eventEmitter.dispatchEvent(new DataChannelLatencyTestResultEvent({ result }))
652
+ });
653
+ this.addEventListener(
654
+ "dataChannelLatencyTestResponse",
655
+ ({ data: { response } }) => {
656
+ this._dataChannelLatencyTestController.receive(response);
657
+ }
658
+ )
659
+ }
660
+ return this._dataChannelLatencyTestController.start(config);
661
+ }
662
+
663
+ /**
664
+ * 请求UE应用显示FPS计数器
665
+ * NOTE: There are plans to refactor all request* functions. Expect changes if you use this!
666
+ * @returns
667
+ */
668
+ public requestShowFps() {
669
+ if (!this._webRtcController.videoPlayer.isVideoReady()) {
670
+ return false;
671
+ }
672
+ this._webRtcController.sendShowFps();
673
+ return true;
674
+ }
675
+
676
+ /**
677
+ * Request for a new IFrame from the UE application.
678
+ * NOTE: There are plans to refactor all request* functions. Expect changes if you use this!
679
+ * @returns
680
+ */
681
+ public requestIframe() {
682
+ if (!this._webRtcController.videoPlayer.isVideoReady()) {
683
+ return false;
684
+ }
685
+ this._webRtcController.sendIframeRequest();
686
+ return true;
687
+ }
688
+
689
+ /**
690
+ * 发送数据到终端应用。数据将通过JSON.stringify()运行,例如字符串
691
+ * 并且可以发送任何可序列化且没有递归的普通JSON对象。
692
+ * @returns true if succeeded, false if rejected
693
+ */
694
+ public emitUIInteraction(descriptor: object | string) {
695
+ if (!this._webRtcController.videoPlayer.isVideoReady()) {
696
+ return false;
697
+ }
698
+ this._webRtcController.emitUIInteraction(descriptor);
699
+ return true;
700
+ }
701
+
702
+ /**
703
+ * Send a command to UE application. Blocks ConsoleCommand descriptors unless UE
704
+ * has signaled that it allows console commands.
705
+ * @returns true if succeeded, false if rejected
706
+ */
707
+ public emitCommand(descriptor: object) {
708
+ if (!this._webRtcController.videoPlayer.isVideoReady()) {
709
+ return false;
710
+ }
711
+ if (!this.allowConsoleCommands && 'ConsoleCommand' in descriptor) {
712
+ return false;
713
+ }
714
+ this._webRtcController.emitCommand(descriptor);
715
+ return true;
716
+ }
717
+
718
+ /**
719
+ * Send a console command to UE application. Only allowed if UE has signaled that it allows
720
+ * console commands.
721
+ * @returns true if succeeded, false if rejected
722
+ */
723
+ public emitConsoleCommand(command: string) {
724
+ if (!this.allowConsoleCommands || !this._webRtcController.videoPlayer.isVideoReady()) {
725
+ return false;
726
+ }
727
+ this._webRtcController.emitConsoleCommand(command);
728
+ return true;
729
+ }
730
+
731
+ /**
732
+ * Add a UE -> browser response event listener
733
+ * @param name - The name of the response handler
734
+ * @param listener - The method to be activated when a message is received
735
+ */
736
+ public addResponseEventListener(
737
+ name: string,
738
+ listener: (response: string) => void
739
+ ) {
740
+ this._webRtcController.responseController.addResponseEventListener(name, listener);
741
+ }
742
+
743
+ /**
744
+ * Remove a UE -> browser response event listener
745
+ * @param name - The name of the response handler
746
+ */
747
+ public removeResponseEventListener(name: string) {
748
+ this._webRtcController.responseController.removeResponseEventListener(name);
749
+ }
750
+
751
+ /**
752
+ * Dispatch a new event.
753
+ * @param e event
754
+ * @returns
755
+ */
756
+ public dispatchEvent(e: PixelStreamingEvent): boolean {
757
+ return this._eventEmitter.dispatchEvent(e);
758
+ }
759
+
760
+ /**
761
+ * Register an event handler.
762
+ * @param type event name
763
+ * @param listener event handler function
764
+ */
765
+ public addEventListener<
766
+ T extends PixelStreamingEvent['type'],
767
+ E extends PixelStreamingEvent & { type: T }
768
+ >(type: T, listener: (e: Event & E) => void) {
769
+ this._eventEmitter.addEventListener(type, listener);
770
+ }
771
+
772
+ /**
773
+ * Remove an event handler.
774
+ * @param type event name
775
+ * @param listener event handler function
776
+ */
777
+ public removeEventListener<
778
+ T extends PixelStreamingEvent['type'],
779
+ E extends PixelStreamingEvent & { type: T }
780
+ >(type: T, listener: (e: Event & E) => void) {
781
+ this._eventEmitter.removeEventListener(type, listener);
782
+ }
783
+
784
+ /**
785
+ * Enable/disable XR mode.
786
+ */
787
+ public toggleXR() {
788
+ this.webXrController.xrClicked();
789
+ }
790
+
791
+ /**
792
+ * Pass in a function to generate a signalling server URL.
793
+ * This function is useful if you need to programmatically construct your signalling server URL.
794
+ * @param signallingUrlBuilderFunc A function that generates a signalling server url.
795
+ */
796
+ public setSignallingUrlBuilder(signallingUrlBuilderFunc: () => string) {
797
+ this._webRtcController.signallingUrlBuilder = signallingUrlBuilderFunc;
798
+ }
799
+
800
+ /**
801
+ * Public getter for the websocket controller. Access to this property allows you to send
802
+ * custom websocket messages.
803
+ */
804
+ public get webSocketController() {
805
+ return this._webRtcController.webSocketController;
806
+ }
807
+
808
+ /**
809
+ * Public getter for the webXrController controller. Used for all XR features.
810
+ */
811
+ public get webXrController() {
812
+ return this._webXrController;
813
+ }
814
+
815
+ public registerMessageHandler(name: string, direction: MessageDirection, handler?: (data: ArrayBuffer | Array<number | string>) => void) {
816
+ if (direction === MessageDirection.FromStreamer && typeof handler === 'undefined') {
817
+ Logger.Warning(Logger.GetStackTrace(), `Unable to register an undefined handler for ${name}`)
818
+ return;
819
+ }
820
+
821
+ if (direction === MessageDirection.ToStreamer && typeof handler === 'undefined') {
822
+ this._webRtcController.streamMessageController.registerMessageHandler(
823
+ direction,
824
+ name,
825
+ (data: Array<number | string>) =>
826
+ this._webRtcController.sendMessageController.sendMessageToStreamer(
827
+ name,
828
+ data
829
+ )
830
+ );
831
+ } else {
832
+ this._webRtcController.streamMessageController.registerMessageHandler(
833
+ direction,
834
+ name,
835
+ (data: ArrayBuffer) => handler(data)
836
+ );
837
+ }
838
+ }
839
+
840
+ public get toStreamerHandlers() {
841
+ return this._webRtcController.streamMessageController.toStreamerHandlers;
842
+ }
843
+
844
+ public isReconnecting() {
845
+ return this._webRtcController.isReconnecting;
846
+ }
847
+ }