@yang__yj/pixelstreaming-core 1.0.0 → 1.0.2

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 (243) 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/dist/lib-pixelstreamingfrontend.esm.js +1 -0
  96. package/dist/lib-pixelstreamingfrontend.js +1 -0
  97. package/jest.config.js +18 -0
  98. package/package.json +47 -18
  99. package/readme.md +15 -0
  100. package/src/AFK/AFKController.test.ts +162 -0
  101. package/src/AFK/AFKController.ts +158 -0
  102. package/src/Config/Config.test.ts +222 -0
  103. package/src/Config/Config.ts +909 -0
  104. package/src/Config/SettingBase.ts +65 -0
  105. package/src/Config/SettingFlag.ts +99 -0
  106. package/src/Config/SettingNumber.ts +111 -0
  107. package/src/Config/SettingOption.ts +124 -0
  108. package/src/Config/SettingText.ts +82 -0
  109. package/src/DataChannel/DataChannelController.ts +138 -0
  110. package/src/DataChannel/DataChannelLatencyTestController.ts +129 -0
  111. package/src/DataChannel/DataChannelLatencyTestResults.ts +67 -0
  112. package/src/DataChannel/DataChannelSender.ts +59 -0
  113. package/src/DataChannel/InitialSettings.ts +61 -0
  114. package/src/DataChannel/LatencyTestResults.ts +76 -0
  115. package/src/FreezeFrame/FreezeFrame.ts +114 -0
  116. package/src/FreezeFrame/FreezeFrameController.ts +114 -0
  117. package/src/Inputs/FakeTouchController.ts +199 -0
  118. package/src/Inputs/GamepadController.ts +300 -0
  119. package/src/Inputs/GamepadTypes.ts +10 -0
  120. package/src/Inputs/HoveringMouseEvents.ts +192 -0
  121. package/src/Inputs/IMouseEvents.ts +64 -0
  122. package/src/Inputs/ITouchController.ts +29 -0
  123. package/src/Inputs/InputClassesFactory.ts +140 -0
  124. package/src/Inputs/KeyboardController.ts +318 -0
  125. package/src/Inputs/LockedMouseEvents.ts +287 -0
  126. package/src/Inputs/MouseButtons.ts +25 -0
  127. package/src/Inputs/MouseController.ts +362 -0
  128. package/src/Inputs/SpecialKeyCodes.ts +16 -0
  129. package/src/Inputs/TouchController.ts +253 -0
  130. package/src/Inputs/XRGamepadController.ts +126 -0
  131. package/src/Logger/Logger.ts +80 -0
  132. package/src/PeerConnectionController/AggregatedStats.ts +311 -0
  133. package/src/PeerConnectionController/CandidatePairStats.ts +17 -0
  134. package/src/PeerConnectionController/CandidateStat.ts +13 -0
  135. package/src/PeerConnectionController/CodecStats.ts +19 -0
  136. package/src/PeerConnectionController/DataChannelStats.ts +17 -0
  137. package/src/PeerConnectionController/InboundRTPStats.ts +154 -0
  138. package/src/PeerConnectionController/InboundTrackStats.ts +34 -0
  139. package/src/PeerConnectionController/OutBoundRTPStats.ts +26 -0
  140. package/src/PeerConnectionController/PeerConnectionController.ts +563 -0
  141. package/src/PeerConnectionController/SessionStats.ts +10 -0
  142. package/src/PeerConnectionController/StreamStats.ts +11 -0
  143. package/src/PixelStreaming/PixelStreaming.test.ts +624 -0
  144. package/src/PixelStreaming/PixelStreaming.ts +847 -0
  145. package/src/UI/OnScreenKeyboard.ts +97 -0
  146. package/src/UeInstanceMessage/ResponseController.ts +47 -0
  147. package/src/UeInstanceMessage/SendMessageController.ts +154 -0
  148. package/src/UeInstanceMessage/StreamMessageController.ts +233 -0
  149. package/src/UeInstanceMessage/ToStreamerMessagesController.ts +62 -0
  150. package/src/Util/CoordinateConverter.ts +289 -0
  151. package/src/Util/EventEmitter.ts +595 -0
  152. package/src/Util/EventListenerTracker.ts +29 -0
  153. package/src/Util/FileUtil.ts +140 -0
  154. package/src/Util/RTCUtils.ts +41 -0
  155. package/src/Util/WebGLUtils.ts +49 -0
  156. package/src/Util/WebXRUtils.ts +25 -0
  157. package/src/VideoPlayer/StreamController.ts +89 -0
  158. package/src/VideoPlayer/VideoPlayer.ts +246 -0
  159. package/src/WebRtcPlayer/WebRtcPlayerController.ts +2221 -0
  160. package/src/WebSockets/MessageReceive.ts +89 -0
  161. package/src/WebSockets/MessageSend.ts +185 -0
  162. package/src/WebSockets/SignallingProtocol.ts +180 -0
  163. package/src/WebSockets/WebSocketController.ts +267 -0
  164. package/src/WebXR/WebXRController.ts +319 -0
  165. package/src/__test__/mockMediaStream.ts +124 -0
  166. package/src/__test__/mockRTCPeerConnection.ts +347 -0
  167. package/src/__test__/mockRTCRtpReceiver.ts +22 -0
  168. package/src/__test__/mockWebSocket.ts +130 -0
  169. package/src/pixelstreamingfrontend.ts +50 -0
  170. package/tsconfig.jest.json +8 -0
  171. package/tsconfig.json +24 -0
  172. package/{library/types → types}/Config/Config.d.ts +5 -4
  173. package/types/DataChannel/DataChannelLatencyTestController.d.ts +26 -0
  174. package/types/DataChannel/DataChannelLatencyTestResults.d.ts +46 -0
  175. package/{library/types → types}/Inputs/HoveringMouseEvents.d.ts +1 -1
  176. package/{library/types → types}/PeerConnectionController/PeerConnectionController.d.ts +1 -1
  177. package/{library/types → types}/PixelStreaming/PixelStreaming.d.ts +31 -6
  178. package/{library/types → types}/UeInstanceMessage/SendMessageController.d.ts +1 -1
  179. package/{library/types → types}/UeInstanceMessage/StreamMessageController.d.ts +3 -5
  180. package/{library/types → types}/Util/EventEmitter.d.ts +40 -3
  181. package/types/Util/RTCUtils.d.ts +8 -0
  182. package/{library/types → types}/VideoPlayer/StreamController.d.ts +3 -3
  183. package/{library/types → types}/VideoPlayer/VideoPlayer.d.ts +2 -0
  184. package/{library/types → types}/WebRtcPlayer/WebRtcPlayerController.d.ts +30 -27
  185. package/{library/types → types}/WebSockets/MessageReceive.d.ts +9 -9
  186. package/{library/types → types}/WebSockets/MessageSend.d.ts +13 -9
  187. package/{library/types → types}/WebSockets/SignallingProtocol.d.ts +3 -3
  188. package/{library/types → types}/WebSockets/WebSocketController.d.ts +16 -12
  189. package/{library/types → types}/pixelstreamingfrontend.d.ts +2 -1
  190. package/webpack.common.js +35 -0
  191. package/webpack.dev.js +35 -0
  192. package/webpack.prod.js +36 -0
  193. package/yang__yj-pixelstreaming-core-1.0.1.tgz +0 -0
  194. package/yang__yj-pixelstreaming-core-1.0.2.tgz +0 -0
  195. package/library/dist/lib-pixelstreamingfrontend.esm.js +0 -1
  196. package/library/dist/lib-pixelstreamingfrontend.js +0 -1
  197. /package/{library/types → types}/AFK/AFKController.d.ts +0 -0
  198. /package/{library/types → types}/Config/SettingBase.d.ts +0 -0
  199. /package/{library/types → types}/Config/SettingFlag.d.ts +0 -0
  200. /package/{library/types → types}/Config/SettingNumber.d.ts +0 -0
  201. /package/{library/types → types}/Config/SettingOption.d.ts +0 -0
  202. /package/{library/types → types}/Config/SettingText.d.ts +0 -0
  203. /package/{library/types → types}/DataChannel/DataChannelController.d.ts +0 -0
  204. /package/{library/types → types}/DataChannel/DataChannelSender.d.ts +0 -0
  205. /package/{library/types → types}/DataChannel/InitialSettings.d.ts +0 -0
  206. /package/{library/types → types}/DataChannel/LatencyTestResults.d.ts +0 -0
  207. /package/{library/types → types}/FreezeFrame/FreezeFrame.d.ts +0 -0
  208. /package/{library/types → types}/FreezeFrame/FreezeFrameController.d.ts +0 -0
  209. /package/{library/types → types}/Inputs/FakeTouchController.d.ts +0 -0
  210. /package/{library/types → types}/Inputs/GamepadController.d.ts +0 -0
  211. /package/{library/types → types}/Inputs/GamepadTypes.d.ts +0 -0
  212. /package/{library/types → types}/Inputs/IMouseEvents.d.ts +0 -0
  213. /package/{library/types → types}/Inputs/ITouchController.d.ts +0 -0
  214. /package/{library/types → types}/Inputs/InputClassesFactory.d.ts +0 -0
  215. /package/{library/types → types}/Inputs/KeyboardController.d.ts +0 -0
  216. /package/{library/types → types}/Inputs/LockedMouseEvents.d.ts +0 -0
  217. /package/{library/types → types}/Inputs/MouseButtons.d.ts +0 -0
  218. /package/{library/types → types}/Inputs/MouseController.d.ts +0 -0
  219. /package/{library/types → types}/Inputs/SpecialKeyCodes.d.ts +0 -0
  220. /package/{library/types → types}/Inputs/TouchController.d.ts +0 -0
  221. /package/{library/types → types}/Inputs/XRGamepadController.d.ts +0 -0
  222. /package/{library/types → types}/Logger/Logger.d.ts +0 -0
  223. /package/{library/types → types}/PeerConnectionController/AggregatedStats.d.ts +0 -0
  224. /package/{library/types → types}/PeerConnectionController/CandidatePairStats.d.ts +0 -0
  225. /package/{library/types → types}/PeerConnectionController/CandidateStat.d.ts +0 -0
  226. /package/{library/types → types}/PeerConnectionController/CodecStats.d.ts +0 -0
  227. /package/{library/types → types}/PeerConnectionController/DataChannelStats.d.ts +0 -0
  228. /package/{library/types → types}/PeerConnectionController/InboundRTPStats.d.ts +0 -0
  229. /package/{library/types → types}/PeerConnectionController/InboundTrackStats.d.ts +0 -0
  230. /package/{library/types → types}/PeerConnectionController/OutBoundRTPStats.d.ts +0 -0
  231. /package/{library/types → types}/PeerConnectionController/SessionStats.d.ts +0 -0
  232. /package/{library/types → types}/PeerConnectionController/StreamStats.d.ts +0 -0
  233. /package/{library/types → types}/UI/OnScreenKeyboard.d.ts +0 -0
  234. /package/{library/types → types}/UeInstanceMessage/ResponseController.d.ts +0 -0
  235. /package/{library/types → types}/UeInstanceMessage/SendDescriptorController.d.ts +0 -0
  236. /package/{library/types → types}/UeInstanceMessage/ToStreamerMessagesController.d.ts +0 -0
  237. /package/{library/types → types}/UeInstanceMessage/TwoWayMap.d.ts +0 -0
  238. /package/{library/types → types}/Util/CoordinateConverter.d.ts +0 -0
  239. /package/{library/types → types}/Util/EventListenerTracker.d.ts +0 -0
  240. /package/{library/types → types}/Util/FileUtil.d.ts +0 -0
  241. /package/{library/types → types}/Util/WebGLUtils.d.ts +0 -0
  242. /package/{library/types → types}/Util/WebXRUtils.d.ts +0 -0
  243. /package/{library/types → types}/WebXR/WebXRController.d.ts +0 -0
@@ -0,0 +1,287 @@
1
+ // Copyright Epic Games, Inc. All Rights Reserved.
2
+
3
+ import { MouseController } from './MouseController';
4
+ import { Logger } from '../Logger/Logger';
5
+ import { IMouseEvents } from './IMouseEvents';
6
+ import { NormalizedQuantizedUnsignedCoord } from '../Util/CoordinateConverter';
7
+ import { ActiveKeys } from './InputClassesFactory';
8
+ import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
9
+ import { EventListenerTracker } from '../Util/EventListenerTracker';
10
+
11
+ /**
12
+ * Handle the mouse locked events
13
+ */
14
+ export class LockedMouseEvents implements IMouseEvents {
15
+ x = 0;
16
+ y = 0;
17
+ coord: NormalizedQuantizedUnsignedCoord;
18
+ videoElementProvider: VideoPlayer;
19
+ mouseController: MouseController;
20
+ activeKeysProvider: ActiveKeys;
21
+ updateMouseMovePositionEvent = (mouseEvent: MouseEvent) => {
22
+ this.updateMouseMovePosition(mouseEvent);
23
+ };
24
+
25
+ // Utility for keeping track of event handlers and unregistering them
26
+ private mouseEventListenerTracker = new EventListenerTracker();
27
+
28
+ /**
29
+ * @param videoElementProvider - Video Player instance
30
+ * @param mouseController - Mouse controller instance
31
+ * @param activeKeysProvider - Active keys provider instance
32
+ * @param playerStyleAttributesProvider - Player style attributes instance
33
+ */
34
+ constructor(
35
+ videoElementProvider: VideoPlayer,
36
+ mouseController: MouseController,
37
+ activeKeysProvider: ActiveKeys
38
+ ) {
39
+ this.videoElementProvider = videoElementProvider;
40
+ this.mouseController = mouseController;
41
+ this.activeKeysProvider = activeKeysProvider;
42
+ const videoElementParent =
43
+ this.videoElementProvider.getVideoParentElement();
44
+ this.x = videoElementParent.getBoundingClientRect().width / 2;
45
+ this.y = videoElementParent.getBoundingClientRect().height / 2;
46
+ this.coord =
47
+ this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(
48
+ this.x,
49
+ this.y
50
+ );
51
+ }
52
+
53
+ /**
54
+ * Unregisters all event handlers
55
+ */
56
+ unregisterMouseEvents() {
57
+ this.mouseEventListenerTracker.unregisterAll();
58
+ }
59
+
60
+ /**
61
+ * Handle when the locked state Changed
62
+ */
63
+ lockStateChange() {
64
+ const videoElementParent =
65
+ this.videoElementProvider.getVideoParentElement();
66
+ const toStreamerHandlers =
67
+ this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
68
+
69
+ if (
70
+ document.pointerLockElement === videoElementParent ||
71
+ document.mozPointerLockElement === videoElementParent
72
+ ) {
73
+ Logger.Log(Logger.GetStackTrace(), 'Pointer locked', 6);
74
+ document.addEventListener(
75
+ 'mousemove',
76
+ this.updateMouseMovePositionEvent,
77
+ false
78
+ );
79
+ this.mouseEventListenerTracker.addUnregisterCallback(
80
+ () => document.removeEventListener(
81
+ 'mousemove',
82
+ this.updateMouseMovePositionEvent,
83
+ false
84
+ )
85
+ );
86
+ } else {
87
+ Logger.Log(
88
+ Logger.GetStackTrace(),
89
+ 'The pointer lock status is now unlocked',
90
+ 6
91
+ );
92
+ // !a new arrow function must not be used here as it will be counted as a new function that cannot be removed
93
+ document.removeEventListener(
94
+ 'mousemove',
95
+ this.updateMouseMovePositionEvent,
96
+ false
97
+ );
98
+
99
+ // If mouse loses focus, send a key up for all of the currently held-down keys
100
+ // This is necessary as when the mouse loses focus, the windows stops listening for events and as such
101
+ // the keyup listener won't get fired
102
+ let activeKeys = this.activeKeysProvider.getActiveKeys();
103
+ const setKeys = new Set(activeKeys);
104
+ const newKeysIterable: Array<number> = [];
105
+
106
+ setKeys.forEach((setKey: number) => {
107
+ newKeysIterable[setKey];
108
+ });
109
+
110
+ newKeysIterable.forEach((uniqueKeycode) => {
111
+ toStreamerHandlers.get('KeyUp')([uniqueKeycode]);
112
+ });
113
+ // Reset the active keys back to nothing
114
+ activeKeys = [];
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Handle the mouse move event, sends the mouse data to the UE Instance
120
+ * @param mouseEvent - Mouse Event
121
+ */
122
+ updateMouseMovePosition(mouseEvent: MouseEvent) {
123
+ if (!this.videoElementProvider.isVideoReady()) {
124
+ return;
125
+ }
126
+ const toStreamerHandlers =
127
+ this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
128
+ const styleWidth =
129
+ this.videoElementProvider.getVideoParentElement().clientWidth;
130
+ const styleHeight =
131
+ this.videoElementProvider.getVideoParentElement().clientHeight;
132
+
133
+ this.x += mouseEvent.movementX;
134
+ this.y += mouseEvent.movementY;
135
+
136
+ if (this.x > styleWidth) {
137
+ this.x -= styleWidth;
138
+ }
139
+ if (this.y > styleHeight) {
140
+ this.y -= styleHeight;
141
+ }
142
+ if (this.x < 0) {
143
+ this.x = styleWidth + this.x;
144
+ }
145
+ if (this.y < 0) {
146
+ this.y = styleHeight - this.y;
147
+ }
148
+
149
+ this.coord =
150
+ this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(
151
+ this.x,
152
+ this.y
153
+ );
154
+ const delta =
155
+ this.mouseController.coordinateConverter.normalizeAndQuantizeSigned(
156
+ mouseEvent.movementX,
157
+ mouseEvent.movementY
158
+ );
159
+ toStreamerHandlers.get('MouseMove')([
160
+ this.coord.x,
161
+ this.coord.y,
162
+ delta.x,
163
+ delta.y
164
+ ]);
165
+ }
166
+
167
+ /**
168
+ * Handle the mouse Down event, sends the mouse data to the UE Instance
169
+ * @param mouseEvent - Mouse Event
170
+ */
171
+ handleMouseDown(mouseEvent: MouseEvent) {
172
+ if (!this.videoElementProvider.isVideoReady()) {
173
+ return;
174
+ }
175
+
176
+ const toStreamerHandlers =
177
+ this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
178
+ toStreamerHandlers.get('MouseDown')([
179
+ mouseEvent.button,
180
+ // We use the store value of this.coord as opposed to the mouseEvent.x/y as the mouseEvent location
181
+ // uses the system cursor location which hasn't moved
182
+ this.coord.x,
183
+ this.coord.y
184
+ ]);
185
+ }
186
+
187
+ /**
188
+ * Handle the mouse Up event, sends the mouse data to the UE Instance
189
+ * @param mouseEvent - Mouse Event
190
+ */
191
+ handleMouseUp(mouseEvent: MouseEvent) {
192
+ if (!this.videoElementProvider.isVideoReady()) {
193
+ return;
194
+ }
195
+ const toStreamerHandlers =
196
+ this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
197
+ toStreamerHandlers.get('MouseUp')([
198
+ mouseEvent.button,
199
+ // We use the store value of this.coord as opposed to the mouseEvent.x/y as the mouseEvent location
200
+ // uses the system cursor location which hasn't moved
201
+ this.coord.x,
202
+ this.coord.y
203
+ ]);
204
+ }
205
+
206
+ /**
207
+ * Handle the mouse wheel event, sends the mouse wheel data to the UE Instance
208
+ * @param wheelEvent - Mouse Event
209
+ */
210
+ handleMouseWheel(wheelEvent: WheelEvent) {
211
+ if (!this.videoElementProvider.isVideoReady()) {
212
+ return;
213
+ }
214
+ const toStreamerHandlers =
215
+ this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
216
+ toStreamerHandlers.get('MouseWheel')([
217
+ wheelEvent.wheelDelta,
218
+ // We use the store value of this.coord as opposed to the mouseEvent.x/y as the mouseEvent location
219
+ // uses the system cursor location which hasn't moved
220
+ this.coord.x,
221
+ this.coord.y
222
+ ]);
223
+ }
224
+
225
+ /**
226
+ * Handle the mouse double click event, sends the mouse data to the UE Instance
227
+ * @param mouseEvent - Mouse Event
228
+ */
229
+ handleMouseDouble(mouseEvent: MouseEvent) {
230
+ if (!this.videoElementProvider.isVideoReady()) {
231
+ return;
232
+ }
233
+ const toStreamerHandlers =
234
+ this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
235
+ toStreamerHandlers.get('MouseDouble')([
236
+ mouseEvent.button,
237
+ // We use the store value of this.coord as opposed to the mouseEvent.x/y as the mouseEvent location
238
+ // uses the system cursor location which hasn't moved
239
+ this.coord.x,
240
+ this.coord.y
241
+ ]);
242
+ }
243
+
244
+ /**
245
+ * Handle the press mouse buttons event, sends the mouse data to the UE Instance
246
+ * @param mouseEvent - Mouse Event
247
+ */
248
+ handlePressMouseButtons(mouseEvent: MouseEvent) {
249
+ if (!this.videoElementProvider.isVideoReady()) {
250
+ return;
251
+ }
252
+ this.mouseController.pressMouseButtons(
253
+ mouseEvent.buttons,
254
+ this.x,
255
+ this.y
256
+ );
257
+ }
258
+
259
+ /**
260
+ * Handle the release mouse buttons event, sends the mouse data to the UE Instance
261
+ * @param mouseEvent - Mouse Event
262
+ */
263
+ handleReleaseMouseButtons(mouseEvent: MouseEvent) {
264
+ if (!this.videoElementProvider.isVideoReady()) {
265
+ return;
266
+ }
267
+ this.mouseController.releaseMouseButtons(
268
+ mouseEvent.buttons,
269
+ this.x,
270
+ this.y
271
+ );
272
+ }
273
+ }
274
+
275
+ /**
276
+ * Extra types for Document and WheelEvent
277
+ */
278
+ declare global {
279
+ interface Document {
280
+ mozPointerLockElement: unknown;
281
+ mozExitPointerLock?(): void;
282
+ }
283
+
284
+ interface WheelEvent {
285
+ wheelDelta: number;
286
+ }
287
+ }
@@ -0,0 +1,25 @@
1
+ // Copyright Epic Games, Inc. All Rights Reserved.
2
+
3
+ /**
4
+ * Mouse Button Data
5
+ * {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button}
6
+ */
7
+ export class MouseButton {
8
+ static mainButton = 0; // Left button.
9
+ static auxiliaryButton = 1; // Wheel button.
10
+ static secondaryButton = 2; // Right button.
11
+ static fourthButton = 3; // Browser Back button.
12
+ static fifthButton = 4; // Browser Forward button.
13
+ }
14
+
15
+ /**
16
+ * Mouse Button Mask Data
17
+ * {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons}
18
+ */
19
+ export class MouseButtonsMask {
20
+ static primaryButton = 1; // Left button.
21
+ static secondaryButton = 2; // Right button.
22
+ static auxiliaryButton = 4; // Wheel button.
23
+ static fourthButton = 8; // Browser Back button.
24
+ static fifthButton = 16; // Browser Forward button.
25
+ }
@@ -0,0 +1,362 @@
1
+ // Copyright Epic Games, Inc. All Rights Reserved.
2
+
3
+ import { MouseButtonsMask, MouseButton } from './MouseButtons';
4
+ import { Logger } from '../Logger/Logger';
5
+ import { StreamMessageController } from '../UeInstanceMessage/StreamMessageController';
6
+ import { CoordinateConverter } from '../Util/CoordinateConverter';
7
+ import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
8
+ import { IMouseEvents } from './IMouseEvents';
9
+ import { LockedMouseEvents } from './LockedMouseEvents';
10
+ import { HoveringMouseEvents } from './HoveringMouseEvents';
11
+ import type { ActiveKeys } from './InputClassesFactory';
12
+ import { EventListenerTracker } from '../Util/EventListenerTracker';
13
+
14
+ /**
15
+ * Handles the Mouse Inputs for the document
16
+ */
17
+ export class MouseController {
18
+ videoElementProvider: VideoPlayer;
19
+ toStreamerMessagesProvider: StreamMessageController;
20
+ coordinateConverter: CoordinateConverter;
21
+ activeKeysProvider: ActiveKeys;
22
+
23
+ // Utility for keeping track of event handlers and unregistering them
24
+ private mouseEventListenerTracker = new EventListenerTracker();
25
+
26
+ /**
27
+ * @param toStreamerMessagesProvider - Stream message instance
28
+ * @param videoElementProvider - Video Player instance
29
+ * @param normalizeAndQuantize - A normalize and quantize instance
30
+ */
31
+ constructor(
32
+ toStreamerMessagesProvider: StreamMessageController,
33
+ videoElementProvider: VideoPlayer,
34
+ coordinateConverter: CoordinateConverter,
35
+ activeKeysProvider: ActiveKeys
36
+ ) {
37
+ this.toStreamerMessagesProvider = toStreamerMessagesProvider;
38
+ this.coordinateConverter = coordinateConverter;
39
+ this.videoElementProvider = videoElementProvider;
40
+ this.activeKeysProvider = activeKeysProvider;
41
+ this.registerMouseEnterAndLeaveEvents();
42
+ }
43
+
44
+ /**
45
+ * Clears all the click events on the current video element parent div
46
+ */
47
+ unregisterMouseEvents() {
48
+ this.mouseEventListenerTracker.unregisterAll();
49
+ }
50
+
51
+ /**
52
+ * Register a locked mouse class
53
+ * @param mouseController - a mouse controller instance
54
+ * @param playerStyleAttributesProvider - a player style attributes instance
55
+ */
56
+ registerLockedMouseEvents(mouseController: MouseController) {
57
+ const videoElementParent =
58
+ this.videoElementProvider.getVideoParentElement() as HTMLDivElement;
59
+ const lockedMouseEvents: IMouseEvents = new LockedMouseEvents(
60
+ this.videoElementProvider,
61
+ mouseController,
62
+ this.activeKeysProvider
63
+ );
64
+
65
+ videoElementParent.requestPointerLock =
66
+ videoElementParent.requestPointerLock ||
67
+ videoElementParent.mozRequestPointerLock;
68
+ document.exitPointerLock =
69
+ document.exitPointerLock || document.mozExitPointerLock;
70
+
71
+ // minor hack to alleviate ios not supporting pointerlock
72
+ if (videoElementParent.requestPointerLock) {
73
+ const onclick = () => {
74
+ videoElementParent.requestPointerLock();
75
+ };
76
+ videoElementParent.addEventListener('click', onclick);
77
+ this.mouseEventListenerTracker.addUnregisterCallback(
78
+ () => videoElementParent.removeEventListener('click', onclick)
79
+ );
80
+ }
81
+
82
+ const lockStateChangeListener = () =>
83
+ lockedMouseEvents.lockStateChange();
84
+ document.addEventListener(
85
+ 'pointerlockchange',
86
+ lockStateChangeListener,
87
+ false
88
+ );
89
+ document.addEventListener(
90
+ 'mozpointerlockchange',
91
+ lockStateChangeListener,
92
+ false
93
+ );
94
+ this.mouseEventListenerTracker.addUnregisterCallback(
95
+ () => document.removeEventListener(
96
+ 'pointerlockchange',
97
+ lockStateChangeListener,
98
+ false
99
+ )
100
+ );
101
+ this.mouseEventListenerTracker.addUnregisterCallback(
102
+ () => document.removeEventListener(
103
+ 'mozpointerlockchange',
104
+ lockStateChangeListener,
105
+ false
106
+ )
107
+ );
108
+
109
+ const onmousedown = (mouseEvent: MouseEvent) =>
110
+ lockedMouseEvents.handleMouseDown(mouseEvent);
111
+ const onmouseup = (mouseEvent: MouseEvent) =>
112
+ lockedMouseEvents.handleMouseUp(mouseEvent);
113
+ const onwheel = (wheelEvent: WheelEvent) =>
114
+ lockedMouseEvents.handleMouseWheel(wheelEvent);
115
+ const ondblclick = (mouseEvent: MouseEvent) =>
116
+ lockedMouseEvents.handleMouseDouble(mouseEvent);
117
+ videoElementParent.addEventListener('mousedown', onmousedown);
118
+ videoElementParent.addEventListener('mouseup', onmouseup);
119
+ videoElementParent.addEventListener('wheel', onwheel);
120
+ videoElementParent.addEventListener('dblclick', ondblclick);
121
+
122
+ this.mouseEventListenerTracker.addUnregisterCallback(
123
+ () => videoElementParent.removeEventListener('mousedown', onmousedown)
124
+ );
125
+ this.mouseEventListenerTracker.addUnregisterCallback(
126
+ () => videoElementParent.removeEventListener('mouseup', onmouseup)
127
+ );
128
+ this.mouseEventListenerTracker.addUnregisterCallback(
129
+ () => videoElementParent.removeEventListener('wheel', onwheel)
130
+ );
131
+ this.mouseEventListenerTracker.addUnregisterCallback(
132
+ () => videoElementParent.removeEventListener('dblclick', ondblclick)
133
+ );
134
+ this.mouseEventListenerTracker.addUnregisterCallback(
135
+ () => lockedMouseEvents.unregisterMouseEvents()
136
+ );
137
+ this.mouseEventListenerTracker.addUnregisterCallback(() => {
138
+ if (
139
+ document.exitPointerLock &&
140
+ (document.pointerLockElement === videoElementParent ||
141
+ document.mozPointerLockElement === videoElementParent)
142
+ ) {
143
+ document.exitPointerLock();
144
+ }
145
+ });
146
+ }
147
+
148
+ /**
149
+ * Register a hovering mouse class
150
+ * @param mouseController - A mouse controller object
151
+ */
152
+ registerHoveringMouseEvents(mouseController: MouseController) {
153
+ const videoElementParent =
154
+ this.videoElementProvider.getVideoParentElement() as HTMLDivElement;
155
+ const hoveringMouseEvents = new HoveringMouseEvents(mouseController);
156
+
157
+ const onmousemove = (mouseEvent: MouseEvent) =>
158
+ hoveringMouseEvents.updateMouseMovePosition(mouseEvent);
159
+ const onmousedown = (mouseEvent: MouseEvent) =>
160
+ hoveringMouseEvents.handleMouseDown(mouseEvent);
161
+ const onmouseup = (mouseEvent: MouseEvent) =>
162
+ hoveringMouseEvents.handleMouseUp(mouseEvent);
163
+ const oncontextmenu = (mouseEvent: MouseEvent) =>
164
+ hoveringMouseEvents.handleContextMenu(mouseEvent);
165
+ const onwheel = (wheelEvent: WheelEvent) =>
166
+ hoveringMouseEvents.handleMouseWheel(wheelEvent);
167
+ const ondblclick = (mouseEvent: MouseEvent) =>
168
+ hoveringMouseEvents.handleMouseDouble(mouseEvent);
169
+ videoElementParent.addEventListener('mousemove', onmousemove);
170
+ videoElementParent.addEventListener('mousedown', onmousedown);
171
+ videoElementParent.addEventListener('mouseup', onmouseup);
172
+ videoElementParent.addEventListener('contextmenu', oncontextmenu);
173
+ videoElementParent.addEventListener('wheel', onwheel);
174
+ videoElementParent.addEventListener('dblclick', ondblclick);
175
+
176
+ this.mouseEventListenerTracker.addUnregisterCallback(
177
+ () => videoElementParent.removeEventListener('mousemove', onmousemove)
178
+ );
179
+ this.mouseEventListenerTracker.addUnregisterCallback(
180
+ () => videoElementParent.removeEventListener('mousedown', onmousedown)
181
+ );
182
+ this.mouseEventListenerTracker.addUnregisterCallback(
183
+ () => videoElementParent.removeEventListener('mouseup', onmouseup)
184
+ );
185
+ this.mouseEventListenerTracker.addUnregisterCallback(
186
+ () => videoElementParent.removeEventListener('contextmenu', oncontextmenu)
187
+ );
188
+ this.mouseEventListenerTracker.addUnregisterCallback(
189
+ () => videoElementParent.removeEventListener('wheel', onwheel)
190
+ );
191
+ this.mouseEventListenerTracker.addUnregisterCallback(
192
+ () => videoElementParent.removeEventListener('dblclick', ondblclick)
193
+ );
194
+ this.mouseEventListenerTracker.addUnregisterCallback(
195
+ () => hoveringMouseEvents.unregisterMouseEvents()
196
+ );
197
+ }
198
+
199
+ /**
200
+ * Set the mouse enter and mouse leave events
201
+ */
202
+ registerMouseEnterAndLeaveEvents() {
203
+ const videoElementParent =
204
+ this.videoElementProvider.getVideoParentElement() as HTMLDivElement;
205
+
206
+ // Handle when the Mouse has entered the element
207
+ const onmouseenter = (event: MouseEvent) => {
208
+ if (!this.videoElementProvider.isVideoReady()) {
209
+ return;
210
+ }
211
+ Logger.Log(Logger.GetStackTrace(), 'Mouse Entered', 6);
212
+ this.sendMouseEnter();
213
+ this.pressMouseButtons(event.buttons, event.x, event.y);
214
+ };
215
+
216
+ // Handles when the mouse has left the element
217
+ const onmouseleave = (event: MouseEvent) => {
218
+ if (!this.videoElementProvider.isVideoReady()) {
219
+ return;
220
+ }
221
+ Logger.Log(Logger.GetStackTrace(), 'Mouse Left', 6);
222
+ this.sendMouseLeave();
223
+ this.releaseMouseButtons(event.buttons, event.x, event.y);
224
+ };
225
+ videoElementParent.addEventListener('mouseenter', onmouseenter);
226
+ videoElementParent.addEventListener('mouseleave', onmouseleave);
227
+
228
+ this.mouseEventListenerTracker.addUnregisterCallback(
229
+ () => videoElementParent.removeEventListener('mouseenter', onmouseenter)
230
+ );
231
+ this.mouseEventListenerTracker.addUnregisterCallback(
232
+ () => videoElementParent.removeEventListener('mouseleave', onmouseleave)
233
+ );
234
+ }
235
+
236
+ /**
237
+ * Handle when a mouse button is released
238
+ * @param buttons - Mouse Button
239
+ * @param X - Mouse pointer X coordinate
240
+ * @param Y - Mouse pointer Y coordinate
241
+ */
242
+ releaseMouseButtons(buttons: number, X: number, Y: number) {
243
+ const coord = this.coordinateConverter.normalizeAndQuantizeUnsigned(
244
+ X,
245
+ Y
246
+ );
247
+ if (buttons & MouseButtonsMask.primaryButton) {
248
+ this.sendMouseUp(MouseButton.mainButton, coord.x, coord.y);
249
+ }
250
+ if (buttons & MouseButtonsMask.secondaryButton) {
251
+ this.sendMouseUp(MouseButton.secondaryButton, coord.x, coord.y);
252
+ }
253
+ if (buttons & MouseButtonsMask.auxiliaryButton) {
254
+ this.sendMouseUp(MouseButton.auxiliaryButton, coord.x, coord.y);
255
+ }
256
+ if (buttons & MouseButtonsMask.fourthButton) {
257
+ this.sendMouseUp(MouseButton.fourthButton, coord.x, coord.y);
258
+ }
259
+ if (buttons & MouseButtonsMask.fifthButton) {
260
+ this.sendMouseUp(MouseButton.fifthButton, coord.x, coord.y);
261
+ }
262
+ }
263
+
264
+ /**
265
+ * Handle when a mouse button is pressed
266
+ * @param buttons - Mouse Button
267
+ * @param X - Mouse pointer X coordinate
268
+ * @param Y - Mouse pointer Y coordinate
269
+ */
270
+ pressMouseButtons(buttons: number, X: number, Y: number) {
271
+ if (!this.videoElementProvider.isVideoReady()) {
272
+ return;
273
+ }
274
+ const coord = this.coordinateConverter.normalizeAndQuantizeUnsigned(
275
+ X,
276
+ Y
277
+ );
278
+ if (buttons & MouseButtonsMask.primaryButton) {
279
+ this.sendMouseDown(MouseButton.mainButton, coord.x, coord.y);
280
+ }
281
+ if (buttons & MouseButtonsMask.secondaryButton) {
282
+ this.sendMouseDown(MouseButton.secondaryButton, coord.x, coord.y);
283
+ }
284
+ if (buttons & MouseButtonsMask.auxiliaryButton) {
285
+ this.sendMouseDown(MouseButton.auxiliaryButton, coord.x, coord.y);
286
+ }
287
+ if (buttons & MouseButtonsMask.fourthButton) {
288
+ this.sendMouseDown(MouseButton.fourthButton, coord.x, coord.y);
289
+ }
290
+ if (buttons & MouseButtonsMask.fifthButton) {
291
+ this.sendMouseDown(MouseButton.fifthButton, coord.x, coord.y);
292
+ }
293
+ }
294
+
295
+ /**
296
+ * Handles mouse enter
297
+ */
298
+ sendMouseEnter() {
299
+ if (!this.videoElementProvider.isVideoReady()) {
300
+ return;
301
+ }
302
+ const toStreamerHandlers =
303
+ this.toStreamerMessagesProvider.toStreamerHandlers;
304
+ toStreamerHandlers.get('MouseEnter')();
305
+ }
306
+
307
+ /**
308
+ * Handles mouse Leave
309
+ */
310
+ sendMouseLeave() {
311
+ if (!this.videoElementProvider.isVideoReady()) {
312
+ return;
313
+ }
314
+ const toStreamerHandlers =
315
+ this.toStreamerMessagesProvider.toStreamerHandlers;
316
+ toStreamerHandlers.get('MouseLeave')();
317
+ }
318
+
319
+ /**
320
+ * Handles when a mouse button is pressed down
321
+ * @param button - Mouse Button Pressed
322
+ * @param X - Mouse X Coordinate
323
+ * @param Y - Mouse Y Coordinate
324
+ */
325
+ sendMouseDown(button: number, X: number, Y: number) {
326
+ if (!this.videoElementProvider.isVideoReady()) {
327
+ return;
328
+ }
329
+ Logger.Log(
330
+ Logger.GetStackTrace(),
331
+ `mouse button ${button} down at (${X}, ${Y})`,
332
+ 6
333
+ );
334
+ const toStreamerHandlers =
335
+ this.toStreamerMessagesProvider.toStreamerHandlers;
336
+ toStreamerHandlers.get('MouseDown')([button, X, Y]);
337
+ }
338
+
339
+ /**
340
+ * Handles when a mouse button is pressed up
341
+ * @param button - Mouse Button Pressed
342
+ * @param X - Mouse X Coordinate
343
+ * @param Y - Mouse Y Coordinate
344
+ */
345
+ sendMouseUp(button: number, X: number, Y: number) {
346
+ if (!this.videoElementProvider.isVideoReady()) {
347
+ return;
348
+ }
349
+ Logger.Log(
350
+ Logger.GetStackTrace(),
351
+ `mouse button ${button} up at (${X}, ${Y})`,
352
+ 6
353
+ );
354
+ const coord = this.coordinateConverter.normalizeAndQuantizeUnsigned(
355
+ X,
356
+ Y
357
+ );
358
+ const toStreamerHandlers =
359
+ this.toStreamerMessagesProvider.toStreamerHandlers;
360
+ toStreamerHandlers.get('MouseUp')([button, coord.x, coord.y]);
361
+ }
362
+ }
@@ -0,0 +1,16 @@
1
+ // Copyright Epic Games, Inc. All Rights Reserved.
2
+
3
+ /**
4
+ * Registers the Special Key codes
5
+ * Must be kept in sync with JavaScriptKeyCodeToFKey C++ array.
6
+ * The index of the entry in the array is the special key code given below.
7
+ */
8
+ export class SpecialKeyCodes {
9
+ static backSpace = 8;
10
+ static shift = 16;
11
+ static control = 17;
12
+ static alt = 18;
13
+ static rightShift = 253;
14
+ static rightControl = 254;
15
+ static rightAlt = 255;
16
+ }