@epicgames-ps/lib-pixelstreamingfrontend-ue5.5 0.1.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. package/.eslintrc.js +1 -1
  2. package/.prettierrc.json +1 -0
  3. package/dist/commonjs/AFK/AFKController.js +110 -0
  4. package/dist/commonjs/AFK/AFKController.js.map +1 -0
  5. package/dist/commonjs/Config/Config.js +560 -0
  6. package/dist/commonjs/Config/Config.js.map +1 -0
  7. package/dist/commonjs/Config/SettingBase.js +99 -0
  8. package/dist/commonjs/Config/SettingBase.js.map +1 -0
  9. package/dist/commonjs/Config/SettingFlag.js +50 -0
  10. package/dist/commonjs/Config/SettingFlag.js.map +1 -0
  11. package/dist/commonjs/Config/SettingNumber.js +84 -0
  12. package/dist/commonjs/Config/SettingNumber.js.map +1 -0
  13. package/dist/commonjs/Config/SettingOption.js +85 -0
  14. package/dist/commonjs/Config/SettingOption.js.map +1 -0
  15. package/dist/commonjs/Config/SettingText.js +43 -0
  16. package/dist/commonjs/Config/SettingText.js.map +1 -0
  17. package/dist/commonjs/DataChannel/DataChannelController.js +107 -0
  18. package/dist/commonjs/DataChannel/DataChannelController.js.map +1 -0
  19. package/dist/commonjs/DataChannel/DataChannelLatencyTestController.js +95 -0
  20. package/dist/commonjs/DataChannel/DataChannelLatencyTestController.js.map +1 -0
  21. package/dist/commonjs/DataChannel/DataChannelLatencyTestResults.js +19 -0
  22. package/dist/commonjs/DataChannel/DataChannelLatencyTestResults.js.map +1 -0
  23. package/dist/commonjs/DataChannel/DataChannelSender.js +44 -0
  24. package/dist/commonjs/DataChannel/DataChannelSender.js.map +1 -0
  25. package/dist/commonjs/DataChannel/InitialSettings.js +42 -0
  26. package/dist/commonjs/DataChannel/InitialSettings.js.map +1 -0
  27. package/dist/commonjs/DataChannel/LatencyTestResults.js +61 -0
  28. package/dist/commonjs/DataChannel/LatencyTestResults.js.map +1 -0
  29. package/dist/commonjs/FreezeFrame/FreezeFrame.js +94 -0
  30. package/dist/commonjs/FreezeFrame/FreezeFrame.js.map +1 -0
  31. package/dist/commonjs/FreezeFrame/FreezeFrameController.js +96 -0
  32. package/dist/commonjs/FreezeFrame/FreezeFrameController.js.map +1 -0
  33. package/dist/commonjs/Inputs/GamepadController.js +189 -0
  34. package/dist/commonjs/Inputs/GamepadController.js.map +1 -0
  35. package/dist/commonjs/Inputs/GamepadTypes.js +22 -0
  36. package/dist/commonjs/Inputs/GamepadTypes.js.map +1 -0
  37. package/dist/commonjs/Inputs/IInputController.js +3 -0
  38. package/dist/commonjs/Inputs/IInputController.js.map +1 -0
  39. package/dist/commonjs/Inputs/InputClassesFactory.js +97 -0
  40. package/dist/commonjs/Inputs/InputClassesFactory.js.map +1 -0
  41. package/dist/commonjs/Inputs/KeyCodes.js +113 -0
  42. package/dist/commonjs/Inputs/KeyCodes.js.map +1 -0
  43. package/dist/commonjs/Inputs/KeyboardController.js +138 -0
  44. package/dist/commonjs/Inputs/KeyboardController.js.map +1 -0
  45. package/dist/commonjs/Inputs/MouseButtons.js +29 -0
  46. package/dist/commonjs/Inputs/MouseButtons.js.map +1 -0
  47. package/dist/commonjs/Inputs/MouseController.js +98 -0
  48. package/dist/commonjs/Inputs/MouseController.js.map +1 -0
  49. package/dist/commonjs/Inputs/MouseControllerHovering.js +94 -0
  50. package/dist/commonjs/Inputs/MouseControllerHovering.js.map +1 -0
  51. package/dist/commonjs/Inputs/MouseControllerLocked.js +154 -0
  52. package/dist/commonjs/Inputs/MouseControllerLocked.js.map +1 -0
  53. package/dist/commonjs/Inputs/SpecialKeyCodes.js +20 -0
  54. package/dist/commonjs/Inputs/SpecialKeyCodes.js.map +1 -0
  55. package/dist/commonjs/Inputs/TouchController.js +124 -0
  56. package/dist/commonjs/Inputs/TouchController.js.map +1 -0
  57. package/dist/commonjs/Inputs/TouchControllerFake.js +92 -0
  58. package/dist/commonjs/Inputs/TouchControllerFake.js.map +1 -0
  59. package/dist/commonjs/Inputs/XRGamepadController.js +125 -0
  60. package/dist/commonjs/Inputs/XRGamepadController.js.map +1 -0
  61. package/dist/commonjs/PeerConnectionController/AggregatedStats.js +253 -0
  62. package/dist/commonjs/PeerConnectionController/AggregatedStats.js.map +1 -0
  63. package/dist/commonjs/PeerConnectionController/CandidatePairStats.js +11 -0
  64. package/dist/commonjs/PeerConnectionController/CandidatePairStats.js.map +1 -0
  65. package/dist/commonjs/PeerConnectionController/CandidateStat.js +11 -0
  66. package/dist/commonjs/PeerConnectionController/CandidateStat.js.map +1 -0
  67. package/dist/commonjs/PeerConnectionController/CodecStats.js +11 -0
  68. package/dist/commonjs/PeerConnectionController/CodecStats.js.map +1 -0
  69. package/dist/commonjs/PeerConnectionController/DataChannelStats.js +11 -0
  70. package/dist/commonjs/PeerConnectionController/DataChannelStats.js.map +1 -0
  71. package/dist/commonjs/PeerConnectionController/InboundRTPStats.js +23 -0
  72. package/dist/commonjs/PeerConnectionController/InboundRTPStats.js.map +1 -0
  73. package/dist/commonjs/PeerConnectionController/InboundTrackStats.js +11 -0
  74. package/dist/commonjs/PeerConnectionController/InboundTrackStats.js.map +1 -0
  75. package/dist/commonjs/PeerConnectionController/OutBoundRTPStats.js +17 -0
  76. package/dist/commonjs/PeerConnectionController/OutBoundRTPStats.js.map +1 -0
  77. package/dist/commonjs/PeerConnectionController/PeerConnectionController.js +585 -0
  78. package/dist/commonjs/PeerConnectionController/PeerConnectionController.js.map +1 -0
  79. package/dist/commonjs/PeerConnectionController/SessionStats.js +11 -0
  80. package/dist/commonjs/PeerConnectionController/SessionStats.js.map +1 -0
  81. package/dist/commonjs/PeerConnectionController/StreamStats.js +11 -0
  82. package/dist/commonjs/PeerConnectionController/StreamStats.js.map +1 -0
  83. package/dist/commonjs/PixelStreaming/PixelStreaming.js +608 -0
  84. package/dist/commonjs/PixelStreaming/PixelStreaming.js.map +1 -0
  85. package/dist/commonjs/UI/OnScreenKeyboard.js +83 -0
  86. package/dist/commonjs/UI/OnScreenKeyboard.js.map +1 -0
  87. package/dist/commonjs/UeInstanceMessage/ResponseController.js +39 -0
  88. package/dist/commonjs/UeInstanceMessage/ResponseController.js.map +1 -0
  89. package/dist/commonjs/UeInstanceMessage/SendMessageController.js +121 -0
  90. package/dist/commonjs/UeInstanceMessage/SendMessageController.js.map +1 -0
  91. package/dist/commonjs/UeInstanceMessage/StreamMessageController.js +211 -0
  92. package/dist/commonjs/UeInstanceMessage/StreamMessageController.js.map +1 -0
  93. package/dist/commonjs/UeInstanceMessage/ToStreamerMessagesController.js +50 -0
  94. package/dist/commonjs/UeInstanceMessage/ToStreamerMessagesController.js.map +1 -0
  95. package/dist/commonjs/Util/EventEmitter.js +387 -0
  96. package/dist/commonjs/Util/EventEmitter.js.map +1 -0
  97. package/dist/commonjs/Util/FileUtil.js +109 -0
  98. package/dist/commonjs/Util/FileUtil.js.map +1 -0
  99. package/dist/commonjs/Util/IURLSearchParams.js +26 -0
  100. package/dist/commonjs/Util/IURLSearchParams.js.map +1 -0
  101. package/dist/commonjs/Util/InputCoordTranslator.js +50 -0
  102. package/dist/commonjs/Util/InputCoordTranslator.js.map +1 -0
  103. package/dist/commonjs/Util/RTCUtils.js +41 -0
  104. package/dist/commonjs/Util/RTCUtils.js.map +1 -0
  105. package/dist/commonjs/VideoPlayer/StreamController.js +68 -0
  106. package/dist/commonjs/VideoPlayer/StreamController.js.map +1 -0
  107. package/dist/commonjs/VideoPlayer/VideoPlayer.js +178 -0
  108. package/dist/commonjs/VideoPlayer/VideoPlayer.js.map +1 -0
  109. package/dist/commonjs/WebRtcPlayer/WebRtcPlayerController.js +1224 -0
  110. package/dist/commonjs/WebRtcPlayer/WebRtcPlayerController.js.map +1 -0
  111. package/dist/commonjs/WebXR/WebXRController.js +361 -0
  112. package/dist/commonjs/WebXR/WebXRController.js.map +1 -0
  113. package/dist/commonjs/pixelstreamingfrontend.js +71 -0
  114. package/dist/commonjs/pixelstreamingfrontend.js.map +1 -0
  115. package/dist/esm/AFK/AFKController.js +106 -0
  116. package/dist/esm/AFK/AFKController.js.map +1 -0
  117. package/dist/esm/Config/Config.js +552 -0
  118. package/dist/esm/Config/Config.js.map +1 -0
  119. package/dist/esm/Config/SettingBase.js +95 -0
  120. package/dist/esm/Config/SettingBase.js.map +1 -0
  121. package/dist/esm/Config/SettingFlag.js +46 -0
  122. package/dist/esm/Config/SettingFlag.js.map +1 -0
  123. package/dist/esm/Config/SettingNumber.js +80 -0
  124. package/dist/esm/Config/SettingNumber.js.map +1 -0
  125. package/dist/esm/Config/SettingOption.js +81 -0
  126. package/dist/esm/Config/SettingOption.js.map +1 -0
  127. package/dist/esm/Config/SettingText.js +39 -0
  128. package/dist/esm/Config/SettingText.js.map +1 -0
  129. package/dist/esm/DataChannel/DataChannelController.js +103 -0
  130. package/dist/esm/DataChannel/DataChannelController.js.map +1 -0
  131. package/dist/esm/DataChannel/DataChannelLatencyTestController.js +91 -0
  132. package/dist/esm/DataChannel/DataChannelLatencyTestController.js.map +1 -0
  133. package/dist/esm/DataChannel/DataChannelLatencyTestResults.js +15 -0
  134. package/dist/esm/DataChannel/DataChannelLatencyTestResults.js.map +1 -0
  135. package/dist/esm/DataChannel/DataChannelSender.js +40 -0
  136. package/dist/esm/DataChannel/DataChannelSender.js.map +1 -0
  137. package/dist/esm/DataChannel/InitialSettings.js +35 -0
  138. package/dist/esm/DataChannel/InitialSettings.js.map +1 -0
  139. package/dist/esm/DataChannel/LatencyTestResults.js +57 -0
  140. package/dist/esm/DataChannel/LatencyTestResults.js.map +1 -0
  141. package/dist/esm/FreezeFrame/FreezeFrame.js +90 -0
  142. package/dist/esm/FreezeFrame/FreezeFrame.js.map +1 -0
  143. package/dist/esm/FreezeFrame/FreezeFrameController.js +92 -0
  144. package/dist/esm/FreezeFrame/FreezeFrameController.js.map +1 -0
  145. package/dist/esm/Inputs/GamepadController.js +185 -0
  146. package/dist/esm/Inputs/GamepadController.js.map +1 -0
  147. package/dist/esm/Inputs/GamepadTypes.js +18 -0
  148. package/dist/esm/Inputs/GamepadTypes.js.map +1 -0
  149. package/dist/esm/Inputs/IInputController.js +2 -0
  150. package/dist/esm/Inputs/IInputController.js.map +1 -0
  151. package/dist/esm/Inputs/InputClassesFactory.js +92 -0
  152. package/dist/esm/Inputs/InputClassesFactory.js.map +1 -0
  153. package/dist/esm/Inputs/KeyCodes.js +110 -0
  154. package/dist/esm/Inputs/KeyCodes.js.map +1 -0
  155. package/dist/esm/Inputs/KeyboardController.js +134 -0
  156. package/dist/esm/Inputs/KeyboardController.js.map +1 -0
  157. package/dist/esm/Inputs/MouseButtons.js +24 -0
  158. package/dist/esm/Inputs/MouseButtons.js.map +1 -0
  159. package/dist/esm/Inputs/MouseController.js +94 -0
  160. package/dist/esm/Inputs/MouseController.js.map +1 -0
  161. package/dist/esm/Inputs/MouseControllerHovering.js +90 -0
  162. package/dist/esm/Inputs/MouseControllerHovering.js.map +1 -0
  163. package/dist/esm/Inputs/MouseControllerLocked.js +150 -0
  164. package/dist/esm/Inputs/MouseControllerLocked.js.map +1 -0
  165. package/dist/esm/Inputs/SpecialKeyCodes.js +16 -0
  166. package/dist/esm/Inputs/SpecialKeyCodes.js.map +1 -0
  167. package/dist/esm/Inputs/TouchController.js +120 -0
  168. package/dist/esm/Inputs/TouchController.js.map +1 -0
  169. package/dist/esm/Inputs/TouchControllerFake.js +88 -0
  170. package/dist/esm/Inputs/TouchControllerFake.js.map +1 -0
  171. package/dist/esm/Inputs/XRGamepadController.js +121 -0
  172. package/dist/esm/Inputs/XRGamepadController.js.map +1 -0
  173. package/dist/esm/PeerConnectionController/AggregatedStats.js +249 -0
  174. package/dist/esm/PeerConnectionController/AggregatedStats.js.map +1 -0
  175. package/dist/esm/PeerConnectionController/CandidatePairStats.js +7 -0
  176. package/dist/esm/PeerConnectionController/CandidatePairStats.js.map +1 -0
  177. package/dist/esm/PeerConnectionController/CandidateStat.js +7 -0
  178. package/dist/esm/PeerConnectionController/CandidateStat.js.map +1 -0
  179. package/dist/esm/PeerConnectionController/CodecStats.js +7 -0
  180. package/dist/esm/PeerConnectionController/CodecStats.js.map +1 -0
  181. package/dist/esm/PeerConnectionController/DataChannelStats.js +7 -0
  182. package/dist/esm/PeerConnectionController/DataChannelStats.js.map +1 -0
  183. package/dist/esm/PeerConnectionController/InboundRTPStats.js +17 -0
  184. package/dist/esm/PeerConnectionController/InboundRTPStats.js.map +1 -0
  185. package/dist/esm/PeerConnectionController/InboundTrackStats.js +7 -0
  186. package/dist/esm/PeerConnectionController/InboundTrackStats.js.map +1 -0
  187. package/dist/esm/PeerConnectionController/OutBoundRTPStats.js +12 -0
  188. package/dist/esm/PeerConnectionController/OutBoundRTPStats.js.map +1 -0
  189. package/dist/esm/PeerConnectionController/PeerConnectionController.js +581 -0
  190. package/dist/esm/PeerConnectionController/PeerConnectionController.js.map +1 -0
  191. package/dist/esm/PeerConnectionController/SessionStats.js +7 -0
  192. package/dist/esm/PeerConnectionController/SessionStats.js.map +1 -0
  193. package/dist/esm/PeerConnectionController/StreamStats.js +7 -0
  194. package/dist/esm/PeerConnectionController/StreamStats.js.map +1 -0
  195. package/dist/esm/PixelStreaming/PixelStreaming.js +604 -0
  196. package/dist/esm/PixelStreaming/PixelStreaming.js.map +1 -0
  197. package/dist/esm/UI/OnScreenKeyboard.js +79 -0
  198. package/dist/esm/UI/OnScreenKeyboard.js.map +1 -0
  199. package/dist/esm/UeInstanceMessage/ResponseController.js +35 -0
  200. package/dist/esm/UeInstanceMessage/ResponseController.js.map +1 -0
  201. package/dist/esm/UeInstanceMessage/SendMessageController.js +117 -0
  202. package/dist/esm/UeInstanceMessage/SendMessageController.js.map +1 -0
  203. package/dist/esm/UeInstanceMessage/StreamMessageController.js +206 -0
  204. package/dist/esm/UeInstanceMessage/StreamMessageController.js.map +1 -0
  205. package/dist/esm/UeInstanceMessage/ToStreamerMessagesController.js +46 -0
  206. package/dist/esm/UeInstanceMessage/ToStreamerMessagesController.js.map +1 -0
  207. package/dist/esm/Util/EventEmitter.js +346 -0
  208. package/dist/esm/Util/EventEmitter.js.map +1 -0
  209. package/dist/esm/Util/FileUtil.js +104 -0
  210. package/dist/esm/Util/FileUtil.js.map +1 -0
  211. package/dist/esm/Util/IURLSearchParams.js +22 -0
  212. package/dist/esm/Util/IURLSearchParams.js.map +1 -0
  213. package/dist/esm/Util/InputCoordTranslator.js +46 -0
  214. package/dist/esm/Util/InputCoordTranslator.js.map +1 -0
  215. package/dist/esm/Util/RTCUtils.js +37 -0
  216. package/dist/esm/Util/RTCUtils.js.map +1 -0
  217. package/dist/esm/VideoPlayer/StreamController.js +64 -0
  218. package/dist/esm/VideoPlayer/StreamController.js.map +1 -0
  219. package/dist/esm/VideoPlayer/VideoPlayer.js +174 -0
  220. package/dist/esm/VideoPlayer/VideoPlayer.js.map +1 -0
  221. package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js +1220 -0
  222. package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js.map +1 -0
  223. package/dist/esm/WebXR/WebXRController.js +357 -0
  224. package/dist/esm/WebXR/WebXRController.js.map +1 -0
  225. package/dist/esm/pixelstreamingfrontend.js +25 -0
  226. package/dist/esm/pixelstreamingfrontend.js.map +1 -0
  227. package/{types → dist/types}/AFK/AFKController.d.ts +38 -39
  228. package/{types → dist/types}/Config/Config.d.ts +220 -219
  229. package/{types → dist/types}/Config/SettingBase.d.ts +43 -30
  230. package/{types → dist/types}/Config/SettingFlag.d.ts +24 -33
  231. package/{types → dist/types}/Config/SettingNumber.d.ts +41 -45
  232. package/{types → dist/types}/Config/SettingOption.d.ts +41 -43
  233. package/{types → dist/types}/Config/SettingText.d.ts +21 -29
  234. package/{types → dist/types}/DataChannel/DataChannelController.d.ts +59 -59
  235. package/{types → dist/types}/DataChannel/DataChannelLatencyTestController.d.ts +25 -26
  236. package/{types → dist/types}/DataChannel/DataChannelLatencyTestResults.d.ts +46 -46
  237. package/{types → dist/types}/DataChannel/DataChannelSender.d.ts +21 -21
  238. package/{types → dist/types}/DataChannel/InitialSettings.d.ts +44 -44
  239. package/{types → dist/types}/DataChannel/LatencyTestResults.d.ts +31 -31
  240. package/{types → dist/types}/FreezeFrame/FreezeFrame.d.ts +36 -36
  241. package/{types → dist/types}/FreezeFrame/FreezeFrameController.d.ts +37 -37
  242. package/dist/types/Inputs/GamepadController.d.ts +61 -0
  243. package/dist/types/Inputs/GamepadTypes.d.ts +15 -0
  244. package/dist/types/Inputs/IInputController.d.ts +16 -0
  245. package/{types → dist/types}/Inputs/InputClassesFactory.d.ts +53 -54
  246. package/dist/types/Inputs/KeyCodes.d.ts +5 -0
  247. package/dist/types/Inputs/KeyboardController.d.ts +34 -0
  248. package/{types → dist/types}/Inputs/MouseButtons.d.ts +22 -22
  249. package/dist/types/Inputs/MouseController.d.ts +40 -0
  250. package/dist/types/Inputs/MouseControllerHovering.d.ts +26 -0
  251. package/dist/types/Inputs/MouseControllerLocked.d.ts +31 -0
  252. package/{types → dist/types}/Inputs/SpecialKeyCodes.d.ts +14 -14
  253. package/dist/types/Inputs/TouchController.d.ts +28 -0
  254. package/dist/types/Inputs/TouchControllerFake.d.ts +29 -0
  255. package/{types → dist/types}/Inputs/XRGamepadController.d.ts +15 -22
  256. package/{types → dist/types}/PeerConnectionController/AggregatedStats.d.ts +82 -84
  257. package/{types → dist/types}/PeerConnectionController/CandidatePairStats.d.ts +22 -22
  258. package/{types → dist/types}/PeerConnectionController/CandidateStat.d.ts +13 -13
  259. package/{types → dist/types}/PeerConnectionController/CodecStats.d.ts +14 -14
  260. package/{types → dist/types}/PeerConnectionController/DataChannelStats.d.ts +15 -15
  261. package/{types → dist/types}/PeerConnectionController/InboundRTPStats.d.ts +141 -141
  262. package/{types → dist/types}/PeerConnectionController/InboundTrackStats.d.ts +32 -32
  263. package/{types → dist/types}/PeerConnectionController/OutBoundRTPStats.d.ts +23 -23
  264. package/{types → dist/types}/PeerConnectionController/PeerConnectionController.d.ts +143 -140
  265. package/{types → dist/types}/PeerConnectionController/SessionStats.d.ts +8 -8
  266. package/{types → dist/types}/PeerConnectionController/StreamStats.d.ts +9 -9
  267. package/{types → dist/types}/PixelStreaming/PixelStreaming.d.ts +271 -259
  268. package/{types → dist/types}/UI/OnScreenKeyboard.d.ts +30 -30
  269. package/{types → dist/types}/UeInstanceMessage/ResponseController.d.ts +19 -19
  270. package/{types → dist/types}/UeInstanceMessage/SendMessageController.d.ts +18 -18
  271. package/{types → dist/types}/UeInstanceMessage/StreamMessageController.d.ts +29 -29
  272. package/{types → dist/types}/UeInstanceMessage/ToStreamerMessagesController.d.ts +32 -32
  273. package/{types → dist/types}/Util/EventEmitter.d.ts +429 -429
  274. package/{types → dist/types}/Util/FileUtil.d.ts +32 -32
  275. package/dist/types/Util/IURLSearchParams.d.ts +9 -0
  276. package/dist/types/Util/InputCoordTranslator.d.ts +29 -0
  277. package/{types → dist/types}/Util/RTCUtils.d.ts +8 -8
  278. package/{types → dist/types}/VideoPlayer/StreamController.d.ts +22 -24
  279. package/{types → dist/types}/VideoPlayer/VideoPlayer.d.ts +78 -78
  280. package/{types → dist/types}/WebRtcPlayer/WebRtcPlayerController.d.ts +379 -377
  281. package/{types → dist/types}/WebXR/WebXRController.d.ts +42 -42
  282. package/{types → dist/types}/pixelstreamingfrontend.d.ts +23 -22
  283. package/package.json +14 -17
  284. package/readme.md +9 -1
  285. package/src/AFK/AFKController.ts +10 -32
  286. package/src/Config/Config.ts +232 -205
  287. package/src/Config/SettingBase.ts +61 -2
  288. package/src/Config/SettingFlag.ts +10 -48
  289. package/src/Config/SettingNumber.ts +23 -33
  290. package/src/Config/SettingOption.ts +41 -56
  291. package/src/Config/SettingText.ts +9 -37
  292. package/src/DataChannel/DataChannelController.ts +6 -26
  293. package/src/DataChannel/DataChannelLatencyTestController.ts +43 -38
  294. package/src/DataChannel/DataChannelLatencyTestResults.ts +8 -10
  295. package/src/DataChannel/DataChannelSender.ts +5 -15
  296. package/src/DataChannel/LatencyTestResults.ts +5 -15
  297. package/src/FreezeFrame/FreezeFrame.ts +7 -19
  298. package/src/FreezeFrame/FreezeFrameController.ts +3 -14
  299. package/src/Inputs/GamepadController.ts +123 -221
  300. package/src/Inputs/GamepadTypes.ts +23 -0
  301. package/src/Inputs/IInputController.ts +17 -0
  302. package/src/Inputs/InputClassesFactory.ts +38 -45
  303. package/src/Inputs/KeyCodes.ts +114 -0
  304. package/src/Inputs/KeyboardController.ts +49 -232
  305. package/src/Inputs/MouseController.ts +71 -297
  306. package/src/Inputs/MouseControllerHovering.ts +118 -0
  307. package/src/Inputs/MouseControllerLocked.ts +194 -0
  308. package/src/Inputs/TouchController.ts +49 -105
  309. package/src/Inputs/TouchControllerFake.ts +132 -0
  310. package/src/Inputs/XRGamepadController.ts +35 -44
  311. package/src/PeerConnectionController/AggregatedStats.ts +46 -75
  312. package/src/PeerConnectionController/CandidatePairStats.ts +1 -1
  313. package/src/PeerConnectionController/CandidateStat.ts +1 -1
  314. package/src/PeerConnectionController/PeerConnectionController.ts +214 -170
  315. package/src/PixelStreaming/PixelStreaming.ts +174 -226
  316. package/src/UI/OnScreenKeyboard.ts +14 -9
  317. package/src/UeInstanceMessage/ResponseController.ts +6 -15
  318. package/src/UeInstanceMessage/SendMessageController.ts +16 -18
  319. package/src/UeInstanceMessage/StreamMessageController.ts +3 -12
  320. package/src/UeInstanceMessage/ToStreamerMessagesController.ts +3 -9
  321. package/src/Util/EventEmitter.ts +17 -22
  322. package/src/Util/FileUtil.ts +11 -34
  323. package/src/Util/IURLSearchParams.ts +25 -0
  324. package/src/Util/InputCoordTranslator.ts +73 -0
  325. package/src/Util/RTCUtils.ts +23 -15
  326. package/src/VideoPlayer/StreamController.ts +6 -23
  327. package/src/VideoPlayer/VideoPlayer.ts +9 -30
  328. package/src/WebRtcPlayer/WebRtcPlayerController.ts +328 -690
  329. package/src/WebXR/WebXRController.ts +82 -94
  330. package/src/pixelstreamingfrontend.ts +8 -6
  331. package/tsconfig.cjs.json +9 -0
  332. package/tsconfig.esm.json +7 -0
  333. package/tsconfig.json +4 -6
  334. package/dist/lib-pixelstreamingfrontend.esm.js +0 -1
  335. package/dist/lib-pixelstreamingfrontend.js +0 -1
  336. package/src/Inputs/FakeTouchController.ts +0 -199
  337. package/src/Inputs/HoveringMouseEvents.ts +0 -192
  338. package/src/Inputs/IMouseEvents.ts +0 -64
  339. package/src/Inputs/ITouchController.ts +0 -29
  340. package/src/Inputs/LockedMouseEvents.ts +0 -287
  341. package/src/Util/CoordinateConverter.ts +0 -290
  342. package/src/Util/EventListenerTracker.ts +0 -29
  343. package/types/Inputs/FakeTouchController.d.ts +0 -61
  344. package/types/Inputs/GamepadController.d.ts +0 -85
  345. package/types/Inputs/GamepadTypes.d.ts +0 -8
  346. package/types/Inputs/HoveringMouseEvents.d.ts +0 -56
  347. package/types/Inputs/IMouseEvents.d.ts +0 -53
  348. package/types/Inputs/ITouchController.d.ts +0 -24
  349. package/types/Inputs/KeyboardController.d.ts +0 -62
  350. package/types/Inputs/LockedMouseEvents.d.ts +0 -80
  351. package/types/Inputs/MouseController.d.ts +0 -75
  352. package/types/Inputs/TouchController.d.ts +0 -53
  353. package/types/Util/CoordinateConverter.d.ts +0 -100
  354. package/types/Util/EventListenerTracker.d.ts +0 -14
  355. package/webpack.common.js +0 -35
  356. package/webpack.dev.js +0 -35
  357. package/webpack.prod.js +0 -36
@@ -0,0 +1,1224 @@
1
+ "use strict";
2
+ // Copyright Epic Games, Inc. All Rights Reserved.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.WebRtcPlayerController = void 0;
5
+ const lib_pixelstreamingcommon_ue5_5_1 = require("@epicgames-ps/lib-pixelstreamingcommon-ue5.5");
6
+ const StreamController_1 = require("../VideoPlayer/StreamController");
7
+ const FreezeFrameController_1 = require("../FreezeFrame/FreezeFrameController");
8
+ const AFKController_1 = require("../AFK/AFKController");
9
+ const DataChannelController_1 = require("../DataChannel/DataChannelController");
10
+ const PeerConnectionController_1 = require("../PeerConnectionController/PeerConnectionController");
11
+ const Config_1 = require("../Config/Config");
12
+ const InitialSettings_1 = require("../DataChannel/InitialSettings");
13
+ const LatencyTestResults_1 = require("../DataChannel/LatencyTestResults");
14
+ const FileUtil_1 = require("../Util/FileUtil");
15
+ const InputClassesFactory_1 = require("../Inputs/InputClassesFactory");
16
+ const VideoPlayer_1 = require("../VideoPlayer/VideoPlayer");
17
+ const StreamMessageController_1 = require("../UeInstanceMessage/StreamMessageController");
18
+ const ResponseController_1 = require("../UeInstanceMessage/ResponseController");
19
+ const SendMessageController_1 = require("../UeInstanceMessage/SendMessageController");
20
+ const ToStreamerMessagesController_1 = require("../UeInstanceMessage/ToStreamerMessagesController");
21
+ const DataChannelSender_1 = require("../DataChannel/DataChannelSender");
22
+ const InputCoordTranslator_1 = require("../Util/InputCoordTranslator");
23
+ const EventEmitter_1 = require("../Util/EventEmitter");
24
+ const IURLSearchParams_1 = require("../Util/IURLSearchParams");
25
+ /**
26
+ * Entry point for the WebRTC Player
27
+ */
28
+ class WebRtcPlayerController {
29
+ /**
30
+ *
31
+ * @param config - the frontend config object
32
+ * @param pixelStreaming - the PixelStreaming object
33
+ */
34
+ constructor(config, pixelStreaming) {
35
+ this.shouldShowPlayOverlay = true;
36
+ this.autoJoinTimer = undefined;
37
+ this.config = config;
38
+ this.pixelStreaming = pixelStreaming;
39
+ this.responseController = new ResponseController_1.ResponseController();
40
+ this.file = new FileUtil_1.FileTemplate();
41
+ this.sdpConstraints = {
42
+ offerToReceiveAudio: true,
43
+ offerToReceiveVideo: true
44
+ };
45
+ // set up the afk logic class and connect up its method for closing the signaling server
46
+ this.afkController = new AFKController_1.AFKController(this.config, this.pixelStreaming, this.onAfkTriggered.bind(this));
47
+ this.afkController.onAFKTimedOutCallback = () => {
48
+ this.closeSignalingServer('You have been disconnected due to inactivity.', false);
49
+ };
50
+ this.freezeFrameController = new FreezeFrameController_1.FreezeFrameController(this.pixelStreaming.videoElementParent);
51
+ this.videoPlayer = new VideoPlayer_1.VideoPlayer(this.pixelStreaming.videoElementParent, this.config);
52
+ this.videoPlayer.onVideoInitialized = () => this.handleVideoInitialized();
53
+ // When in match viewport resolution mode, when the browser viewport is resized we send a resize command back to UE.
54
+ this.videoPlayer.onMatchViewportResolutionCallback = (width, height) => {
55
+ const descriptor = {
56
+ 'Resolution.Width': width,
57
+ 'Resolution.Height': height
58
+ };
59
+ this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify(descriptor)]);
60
+ };
61
+ // Every time video player is resized in browser we need to reinitialize the mouse coordinate conversion and freeze frame sizing logic.
62
+ this.videoPlayer.onResizePlayerCallback = () => {
63
+ this.setUpMouseAndFreezeFrame();
64
+ };
65
+ this.streamController = new StreamController_1.StreamController(this.videoPlayer);
66
+ this.coordinateConverter = new InputCoordTranslator_1.InputCoordTranslator();
67
+ this.sendrecvDataChannelController = new DataChannelController_1.DataChannelController();
68
+ this.recvDataChannelController = new DataChannelController_1.DataChannelController();
69
+ this.registerDataChannelEventEmitters(this.sendrecvDataChannelController);
70
+ this.registerDataChannelEventEmitters(this.recvDataChannelController);
71
+ this.dataChannelSender = new DataChannelSender_1.DataChannelSender(this.sendrecvDataChannelController);
72
+ this.dataChannelSender.resetAfkWarningTimerOnDataSend = () => this.afkController.resetAfkWarningTimer();
73
+ this.streamMessageController = new StreamMessageController_1.StreamMessageController();
74
+ // set up websocket methods
75
+ this.transport = new lib_pixelstreamingcommon_ue5_5_1.WebSocketTransport();
76
+ this.protocol = new lib_pixelstreamingcommon_ue5_5_1.SignallingProtocol(this.transport);
77
+ this.protocol.addListener(lib_pixelstreamingcommon_ue5_5_1.Messages.config.typeName, (msg) => this.handleOnConfigMessage(msg));
78
+ this.protocol.addListener(lib_pixelstreamingcommon_ue5_5_1.Messages.streamerList.typeName, (msg) => this.handleStreamerListMessage(msg));
79
+ this.protocol.addListener(lib_pixelstreamingcommon_ue5_5_1.Messages.streamerIdChanged.typeName, (msg) => this.handleStreamerIDChangedMessage(msg));
80
+ this.protocol.addListener(lib_pixelstreamingcommon_ue5_5_1.Messages.playerCount.typeName, (msg) => {
81
+ const playerCountMessage = msg;
82
+ this.pixelStreaming._onPlayerCount(playerCountMessage.count);
83
+ });
84
+ this.protocol.addListener(lib_pixelstreamingcommon_ue5_5_1.Messages.answer.typeName, (msg) => this.handleWebRtcAnswer(msg));
85
+ this.protocol.addListener(lib_pixelstreamingcommon_ue5_5_1.Messages.offer.typeName, (msg) => this.handleWebRtcOffer(msg));
86
+ this.protocol.addListener(lib_pixelstreamingcommon_ue5_5_1.Messages.peerDataChannels.typeName, (msg) => this.handleWebRtcSFUPeerDatachannels(msg));
87
+ this.protocol.addListener(lib_pixelstreamingcommon_ue5_5_1.Messages.iceCandidate.typeName, (msg) => {
88
+ const iceCandidateMessage = msg;
89
+ this.handleIceCandidate(iceCandidateMessage.candidate);
90
+ });
91
+ this.protocol.transport.addListener('open', () => {
92
+ const message = lib_pixelstreamingcommon_ue5_5_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_5_1.Messages.listStreamers);
93
+ this.protocol.sendMessage(message);
94
+ this.reconnectAttempt = 0;
95
+ this.isReconnecting = false;
96
+ });
97
+ this.protocol.transport.addListener('error', () => {
98
+ // dont really need to do anything here since the close event should follow.
99
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Error(`Got a transport error.`);
100
+ });
101
+ this.protocol.transport.addListener('close', (event) => {
102
+ // when we refresh the page during a stream we get the going away code.
103
+ // in that case we don't want to reconnect since we're navigating away.
104
+ // https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code
105
+ // lists all the codes.
106
+ const CODE_GOING_AWAY = 1001;
107
+ const maxReconnectAttempts = this.config.getNumericSettingValue(Config_1.NumericParameters.MaxReconnectAttempts);
108
+ const attemptsLeft = this.reconnectAttempt < maxReconnectAttempts;
109
+ const reconnectEnabled = this.forceReconnect || (this.enableAutoReconnect && maxReconnectAttempts > 0 && attemptsLeft);
110
+ const willTryReconnect = reconnectEnabled && event.code != CODE_GOING_AWAY;
111
+ const allowClickToReconnect = !willTryReconnect;
112
+ const disconnectMessage = this.disconnectMessage ? this.disconnectMessage : event.reason;
113
+ this.forceReconnect = false;
114
+ this.pixelStreaming._onDisconnect(disconnectMessage, allowClickToReconnect);
115
+ this.afkController.stopAfkWarningTimer();
116
+ // stop sending stats on interval if we have closed our connection
117
+ if (this.statsTimerHandle && this.statsTimerHandle !== undefined) {
118
+ window.clearInterval(this.statsTimerHandle);
119
+ }
120
+ // reset the stream quality icon.
121
+ this.setVideoEncoderAvgQP(0);
122
+ // unregister all input device event handlers on disconnect
123
+ this.setTouchInputEnabled(false);
124
+ this.setMouseInputEnabled(false);
125
+ this.setKeyboardInputEnabled(false);
126
+ this.setGamePadInputEnabled(false);
127
+ if (willTryReconnect) {
128
+ // need a small delay here to prevent reconnect spamming
129
+ setTimeout(() => {
130
+ this.reconnectAttempt++;
131
+ this.doReconnect(event.reason);
132
+ }, 2000);
133
+ }
134
+ });
135
+ // set up the final webRtc player controller methods from within our application so a connection can be activated
136
+ this.sendMessageController = new SendMessageController_1.SendMessageController(this.dataChannelSender, this.streamMessageController);
137
+ this.toStreamerMessagesController = new ToStreamerMessagesController_1.ToStreamerMessagesController(this.sendMessageController);
138
+ this.registerMessageHandlers();
139
+ this.streamMessageController.populateDefaultProtocol();
140
+ this.inputClassesFactory = new InputClassesFactory_1.InputClassesFactory(this.streamMessageController, this.videoPlayer, this.coordinateConverter);
141
+ this.isUsingSFU = false;
142
+ this.isQualityController = false;
143
+ this.preferredCodec = '';
144
+ this.enableAutoReconnect = true;
145
+ this.forceReconnect = false;
146
+ this.reconnectAttempt = 0;
147
+ this.isReconnecting = false;
148
+ this.config._addOnOptionSettingChangedListener(Config_1.OptionParameters.StreamerId, (streamerid) => {
149
+ if (streamerid === undefined || streamerid === '') {
150
+ return;
151
+ }
152
+ // close the current peer connection and create a new one
153
+ this.peerConnectionController.peerConnection.close();
154
+ this.peerConnectionController.createPeerConnection(this.peerConfig, this.preferredCodec);
155
+ this.subscribedStream = streamerid;
156
+ const message = lib_pixelstreamingcommon_ue5_5_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_5_1.Messages.subscribe, { streamerId: streamerid });
157
+ this.protocol.sendMessage(message);
158
+ });
159
+ this.setVideoEncoderAvgQP(-1);
160
+ this.signallingUrlBuilder = () => {
161
+ const signallingServerUrl = this.config.getTextSettingValue(Config_1.TextParameters.SignallingServerUrl);
162
+ return signallingServerUrl;
163
+ };
164
+ }
165
+ /**
166
+ * Make a request to UnquantizedAndDenormalizeUnsigned coordinates
167
+ * @param x x axis coordinate
168
+ * @param y y axis coordinate
169
+ */
170
+ requestUnquantizedAndDenormalizeUnsigned(x, y) {
171
+ return this.coordinateConverter.untranslateUnsigned(x, y);
172
+ }
173
+ /**
174
+ * Handles when a message is received
175
+ * @param event - Message Event
176
+ */
177
+ handleOnMessage(event) {
178
+ const message = new Uint8Array(event.data);
179
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Message incoming:' + message);
180
+ //try {
181
+ const messageType = this.streamMessageController.fromStreamerMessages.get(message[0]);
182
+ this.streamMessageController.fromStreamerHandlers.get(messageType)(event.data);
183
+ //} catch (e) {
184
+ //Logger.Error(Logger.GetStackTrace(), `Custom data channel message with message type that is unknown to the Pixel Streaming protocol. Does your PixelStreamingProtocol need updating? The message type was: ${message[0]}`);
185
+ //}
186
+ }
187
+ /**
188
+ * Register message all handlers
189
+ */
190
+ registerMessageHandlers() {
191
+ // From Streamer
192
+ // Message events from the streamer have a data type of ArrayBuffer as we force this type in the DatachannelController
193
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'QualityControlOwnership', (data) => this.onQualityControlOwnership(data));
194
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'Response', (data) => this.responseController.onResponse(data));
195
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'Command', (data) => {
196
+ this.onCommand(data);
197
+ });
198
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'FreezeFrame', (data) => this.onFreezeFrameMessage(data));
199
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'UnfreezeFrame', () => this.invalidateFreezeFrameAndEnableVideo());
200
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'VideoEncoderAvgQP', (data) => this.handleVideoEncoderAvgQP(data));
201
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'LatencyTest', (data) => this.handleLatencyTestResult(data));
202
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'DataChannelLatencyTest', (data) => this.handleDataChannelLatencyTestResponse(data));
203
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'InitialSettings', (data) => this.handleInitialSettings(data));
204
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'FileExtension', (data) => this.onFileExtension(data));
205
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'FileMimeType', (data) => this.onFileMimeType(data));
206
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'FileContents', (data) => this.onFileContents(data));
207
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'TestEcho', () => {
208
+ /* Do nothing */
209
+ });
210
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'InputControlOwnership', (data) => this.onInputControlOwnership(data));
211
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'GamepadResponse', (data) => this.onGamepadResponse(data));
212
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.FromStreamer, 'Protocol', (data) => this.onProtocolMessage(data));
213
+ // To Streamer
214
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'IFrameRequest', () => this.sendMessageController.sendMessageToStreamer('IFrameRequest'));
215
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'RequestQualityControl', () => this.sendMessageController.sendMessageToStreamer('RequestQualityControl'));
216
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'FpsRequest', () => this.sendMessageController.sendMessageToStreamer('FpsRequest'));
217
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'AverageBitrateRequest', () => this.sendMessageController.sendMessageToStreamer('AverageBitrateRequest'));
218
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'StartStreaming', () => this.sendMessageController.sendMessageToStreamer('StartStreaming'));
219
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'StopStreaming', () => this.sendMessageController.sendMessageToStreamer('StopStreaming'));
220
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'LatencyTest', (data) => this.sendMessageController.sendMessageToStreamer('LatencyTest', data));
221
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'RequestInitialSettings', () => this.sendMessageController.sendMessageToStreamer('RequestInitialSettings'));
222
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'TestEcho', () => {
223
+ /* Do nothing */
224
+ });
225
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'UIInteraction', (data) => this.sendMessageController.sendMessageToStreamer('UIInteraction', data));
226
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'Command', (data) => this.sendMessageController.sendMessageToStreamer('Command', data));
227
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'TextboxEntry', (data) => this.sendMessageController.sendMessageToStreamer('TextboxEntry', data));
228
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'KeyDown', (data) => this.sendMessageController.sendMessageToStreamer('KeyDown', data));
229
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'KeyUp', (data) => this.sendMessageController.sendMessageToStreamer('KeyUp', data));
230
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'KeyPress', (data) => this.sendMessageController.sendMessageToStreamer('KeyPress', data));
231
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'MouseEnter', (data) => this.sendMessageController.sendMessageToStreamer('MouseEnter', data));
232
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'MouseLeave', (data) => this.sendMessageController.sendMessageToStreamer('MouseLeave', data));
233
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'MouseDown', (data) => this.sendMessageController.sendMessageToStreamer('MouseDown', data));
234
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'MouseUp', (data) => this.sendMessageController.sendMessageToStreamer('MouseUp', data));
235
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'MouseMove', (data) => this.sendMessageController.sendMessageToStreamer('MouseMove', data));
236
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'MouseWheel', (data) => this.sendMessageController.sendMessageToStreamer('MouseWheel', data));
237
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'MouseDouble', (data) => this.sendMessageController.sendMessageToStreamer('MouseDouble', data));
238
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'TouchStart', (data) => this.sendMessageController.sendMessageToStreamer('TouchStart', data));
239
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'TouchEnd', (data) => this.sendMessageController.sendMessageToStreamer('TouchEnd', data));
240
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'TouchMove', (data) => this.sendMessageController.sendMessageToStreamer('TouchMove', data));
241
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'GamepadConnected', () => this.sendMessageController.sendMessageToStreamer('GamepadConnected'));
242
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'GamepadButtonPressed', (data) => this.sendMessageController.sendMessageToStreamer('GamepadButtonPressed', data));
243
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'GamepadButtonReleased', (data) => this.sendMessageController.sendMessageToStreamer('GamepadButtonReleased', data));
244
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'GamepadAnalog', (data) => this.sendMessageController.sendMessageToStreamer('GamepadAnalog', data));
245
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'GamepadDisconnected', (data) => this.sendMessageController.sendMessageToStreamer('GamepadDisconnected', data));
246
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'XREyeViews', (data) => this.sendMessageController.sendMessageToStreamer('XREyeViews', data));
247
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'XRHMDTransform', (data) => this.sendMessageController.sendMessageToStreamer('XRHMDTransform', data));
248
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'XRControllerTransform', (data) => this.sendMessageController.sendMessageToStreamer('XRControllerTransform', data));
249
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'XRSystem', (data) => this.sendMessageController.sendMessageToStreamer('XRSystem', data));
250
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'XRButtonTouched', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonTouched', data));
251
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'XRButtonTouchReleased', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonTouchReleased', data));
252
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'XRButtonPressed', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonPressed', data));
253
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'XRButtonReleased', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonReleased', data));
254
+ this.streamMessageController.registerMessageHandler(StreamMessageController_1.MessageDirection.ToStreamer, 'XRAnalog', (data) => this.sendMessageController.sendMessageToStreamer('XRAnalog', data));
255
+ }
256
+ /**
257
+ * Activate the logic associated with a command from UE
258
+ * @param message
259
+ */
260
+ onCommand(message) {
261
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('DataChannelReceiveMessageType.Command');
262
+ const commandAsString = new TextDecoder('utf-16').decode(message.slice(1));
263
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Data Channel Command: ' + commandAsString);
264
+ const command = JSON.parse(commandAsString);
265
+ if (command.command === 'onScreenKeyboard') {
266
+ this.pixelStreaming._activateOnScreenKeyboard(command);
267
+ }
268
+ }
269
+ /**
270
+ * Handles a protocol message received from the streamer
271
+ * @param message the message data from the streamer
272
+ */
273
+ onProtocolMessage(message) {
274
+ try {
275
+ const protocolString = new TextDecoder('utf-16').decode(message.slice(1));
276
+ const protocolJSON = JSON.parse(protocolString);
277
+ if (!Object.prototype.hasOwnProperty.call(protocolJSON, 'Direction')) {
278
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Error('Malformed protocol received. Ensure the protocol message contains a direction');
279
+ }
280
+ const direction = protocolJSON.Direction;
281
+ delete protocolJSON.Direction;
282
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Received new ${direction == StreamMessageController_1.MessageDirection.FromStreamer ? 'FromStreamer' : 'ToStreamer'} protocol. Updating existing protocol...`);
283
+ Object.keys(protocolJSON).forEach((messageType) => {
284
+ const message = protocolJSON[messageType];
285
+ switch (direction) {
286
+ case StreamMessageController_1.MessageDirection.ToStreamer:
287
+ // Check that the message contains all the relevant params
288
+ if (!Object.prototype.hasOwnProperty.call(message, 'id')) {
289
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Error(`ToStreamer->${messageType} protocol definition was malformed as it didn't contain at least an id\n
290
+ Definition was: ${JSON.stringify(message, null, 2)}`);
291
+ // return in a forEach is equivalent to a continue in a normal for loop
292
+ return;
293
+ }
294
+ // UE5.1 and UE5.2 don't send a structure for these message types, but they actually do have a structure so ignore updating them
295
+ if (messageType === 'UIInteraction' ||
296
+ messageType === 'Command' ||
297
+ messageType === 'LatencyTest') {
298
+ return;
299
+ }
300
+ if (this.streamMessageController.toStreamerHandlers.get(messageType)) {
301
+ // If we've registered a handler for this message type we can add it to our supported messages. ie registerMessageHandler(...)
302
+ this.streamMessageController.toStreamerMessages.set(messageType, message);
303
+ }
304
+ else {
305
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Error(`There was no registered handler for "${messageType}" - try adding one using registerMessageHandler(MessageDirection.ToStreamer, "${messageType}", myHandler)`);
306
+ }
307
+ break;
308
+ case StreamMessageController_1.MessageDirection.FromStreamer:
309
+ // Check that the message contains all the relevant params
310
+ if (!Object.prototype.hasOwnProperty.call(message, 'id')) {
311
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Error(`FromStreamer->${messageType} protocol definition was malformed as it didn't contain at least an id\n
312
+ Definition was: ${JSON.stringify(message, null, 2)}`);
313
+ // return in a forEach is equivalent to a continue in a normal for loop
314
+ return;
315
+ }
316
+ if (this.streamMessageController.fromStreamerHandlers.get(messageType)) {
317
+ // If we've registered a handler for this message type. ie registerMessageHandler(...)
318
+ this.streamMessageController.fromStreamerMessages.set(message.id, messageType);
319
+ }
320
+ else {
321
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Error(`There was no registered handler for "${message}" - try adding one using registerMessageHandler(MessageDirection.FromStreamer, "${messageType}", myHandler)`);
322
+ }
323
+ break;
324
+ default:
325
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Error(`Unknown direction: ${direction}`);
326
+ }
327
+ });
328
+ // Once the protocol has been received, we can send our control messages
329
+ this.toStreamerMessagesController.SendRequestInitialSettings();
330
+ this.toStreamerMessagesController.SendRequestQualityControl();
331
+ }
332
+ catch (e) {
333
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(e);
334
+ }
335
+ }
336
+ /**
337
+ * Handles an input control message when it is received from the streamer
338
+ * @param message The input control message
339
+ */
340
+ onInputControlOwnership(message) {
341
+ const view = new Uint8Array(message);
342
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('DataChannelReceiveMessageType.InputControlOwnership');
343
+ const inputControlOwnership = new Boolean(view[1]).valueOf();
344
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Received input controller message - will your input control the stream: ${inputControlOwnership}`);
345
+ this.pixelStreaming._onInputControlOwnership(inputControlOwnership);
346
+ }
347
+ /**
348
+ *
349
+ * @param message
350
+ */
351
+ onGamepadResponse(message) {
352
+ const responseString = new TextDecoder('utf-16').decode(message.slice(1));
353
+ const responseJSON = JSON.parse(responseString);
354
+ this.gamePadController.onGamepadResponseReceived(responseJSON.controllerId);
355
+ }
356
+ onAfkTriggered() {
357
+ this.afkController.onAfkClick();
358
+ // if the stream is paused play it, if we can
359
+ if (this.videoPlayer.isPaused() && this.videoPlayer.hasVideoSource()) {
360
+ this.playStream();
361
+ }
362
+ }
363
+ /**
364
+ * Set whether we should timeout when afk.
365
+ * @param afkEnabled If true we timeout when idle for some given amount of time.
366
+ */
367
+ setAfkEnabled(afkEnabled) {
368
+ if (afkEnabled) {
369
+ this.onAfkTriggered();
370
+ }
371
+ else {
372
+ this.afkController.stopAfkWarningTimer();
373
+ }
374
+ }
375
+ /**
376
+ * Attempt a reconnection to the signalling server. Manual trigger
377
+ */
378
+ tryReconnect(message) {
379
+ this.forceReconnect = true;
380
+ this.doReconnect(message);
381
+ }
382
+ /**
383
+ * Does the actual reconnect work. Used by the auto reconnect feature to skip the manual flag.
384
+ */
385
+ doReconnect(message) {
386
+ // if there is no webSocketController return immediately or this will not work
387
+ if (!this.protocol) {
388
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('This player has no protocol connection.');
389
+ return;
390
+ }
391
+ this.isReconnecting = true;
392
+ // if the connection is open, first close it and force a reconnect.
393
+ if (this.protocol.isConnected()) {
394
+ if (!this.forceReconnect) {
395
+ message = `${message} Reconnecting.`;
396
+ }
397
+ this.closeSignalingServer(message, true);
398
+ }
399
+ else {
400
+ this.pixelStreaming._onWebRtcAutoConnect();
401
+ this.connectToSignallingServer();
402
+ }
403
+ }
404
+ /**
405
+ * Loads a freeze frame if it is required otherwise shows the play overlay
406
+ */
407
+ loadFreezeFrameOrShowPlayOverlay() {
408
+ this.pixelStreaming.dispatchEvent(new EventEmitter_1.LoadFreezeFrameEvent({
409
+ shouldShowPlayOverlay: this.shouldShowPlayOverlay,
410
+ isValid: this.freezeFrameController.valid,
411
+ jpegData: this.freezeFrameController.jpeg
412
+ }));
413
+ if (this.shouldShowPlayOverlay === true) {
414
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('showing play overlay');
415
+ this.resizePlayerStyle();
416
+ }
417
+ else {
418
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('showing freeze frame');
419
+ this.freezeFrameController.showFreezeFrame();
420
+ }
421
+ setTimeout(() => {
422
+ this.videoPlayer.setVideoEnabled(false);
423
+ }, this.freezeFrameController.freezeFrameDelay);
424
+ }
425
+ /**
426
+ * Process the freeze frame and load it
427
+ * @param message The freeze frame data in bytes
428
+ */
429
+ onFreezeFrameMessage(message) {
430
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('DataChannelReceiveMessageType.FreezeFrame');
431
+ const view = new Uint8Array(message);
432
+ this.freezeFrameController.processFreezeFrameMessage(view, () => this.loadFreezeFrameOrShowPlayOverlay());
433
+ }
434
+ /**
435
+ * Enable the video after hiding a freeze frame
436
+ */
437
+ invalidateFreezeFrameAndEnableVideo() {
438
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('DataChannelReceiveMessageType.FreezeFrame');
439
+ setTimeout(() => {
440
+ this.pixelStreaming.dispatchEvent(new EventEmitter_1.HideFreezeFrameEvent());
441
+ this.freezeFrameController.hideFreezeFrame();
442
+ }, this.freezeFrameController.freezeFrameDelay);
443
+ if (this.videoPlayer.getVideoElement()) {
444
+ this.videoPlayer.setVideoEnabled(true);
445
+ }
446
+ }
447
+ /**
448
+ * Prep datachannel data for processing file extension
449
+ * @param data the file extension data
450
+ */
451
+ onFileExtension(data) {
452
+ const view = new Uint8Array(data);
453
+ FileUtil_1.FileUtil.setExtensionFromBytes(view, this.file);
454
+ }
455
+ /**
456
+ * Prep datachannel data for processing the file mime type
457
+ * @param data the file mime type data
458
+ */
459
+ onFileMimeType(data) {
460
+ const view = new Uint8Array(data);
461
+ FileUtil_1.FileUtil.setMimeTypeFromBytes(view, this.file);
462
+ }
463
+ /**
464
+ * Prep datachannel data for processing the file contents
465
+ * @param data the file contents data
466
+ */
467
+ onFileContents(data) {
468
+ const view = new Uint8Array(data);
469
+ FileUtil_1.FileUtil.setContentsFromBytes(view, this.file);
470
+ }
471
+ /**
472
+ * Plays the stream audio and video source and sets up other pieces while the stream starts
473
+ */
474
+ playStream() {
475
+ if (!this.videoPlayer.getVideoElement()) {
476
+ const message = 'Could not play video stream because the video player was not initialized correctly.';
477
+ this.pixelStreaming.dispatchEvent(new EventEmitter_1.PlayStreamErrorEvent({ message }));
478
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Error(message);
479
+ // close the connection
480
+ this.closeSignalingServer('Stream not initialized correctly', false);
481
+ return;
482
+ }
483
+ if (!this.videoPlayer.hasVideoSource()) {
484
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Warning('Cannot play stream, the video element has no srcObject to play.');
485
+ return;
486
+ }
487
+ this.setTouchInputEnabled(this.config.isFlagEnabled(Config_1.Flags.TouchInput));
488
+ this.pixelStreaming.dispatchEvent(new EventEmitter_1.PlayStreamEvent());
489
+ if (this.streamController.audioElement.srcObject) {
490
+ const startMuted = this.config.isFlagEnabled(Config_1.Flags.StartVideoMuted);
491
+ this.streamController.audioElement.muted = startMuted;
492
+ if (startMuted) {
493
+ this.playVideo();
494
+ }
495
+ else {
496
+ this.streamController.audioElement
497
+ .play()
498
+ .then(() => {
499
+ this.playVideo();
500
+ })
501
+ .catch((onRejectedReason) => {
502
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(onRejectedReason);
503
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay.');
504
+ this.pixelStreaming.dispatchEvent(new EventEmitter_1.PlayStreamRejectedEvent({
505
+ reason: onRejectedReason
506
+ }));
507
+ });
508
+ }
509
+ }
510
+ else {
511
+ this.playVideo();
512
+ }
513
+ this.shouldShowPlayOverlay = false;
514
+ this.freezeFrameController.showFreezeFrame();
515
+ }
516
+ /**
517
+ * Plays the video stream
518
+ */
519
+ playVideo() {
520
+ // handle play() with promise as it is an asynchronous call
521
+ this.videoPlayer.play().catch((onRejectedReason) => {
522
+ if (this.streamController.audioElement.srcObject) {
523
+ this.streamController.audioElement.pause();
524
+ }
525
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(onRejectedReason);
526
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay.');
527
+ this.pixelStreaming.dispatchEvent(new EventEmitter_1.PlayStreamRejectedEvent({ reason: onRejectedReason }));
528
+ });
529
+ }
530
+ /**
531
+ * Enable the video to play automatically if enableAutoplay is true
532
+ */
533
+ autoPlayVideoOrSetUpPlayOverlay() {
534
+ if (this.config.isFlagEnabled(Config_1.Flags.AutoPlayVideo)) {
535
+ // attempt to play the video
536
+ this.playStream();
537
+ }
538
+ this.resizePlayerStyle();
539
+ }
540
+ /**
541
+ * Connect to the Signaling server
542
+ */
543
+ connectToSignallingServer() {
544
+ this.locallyClosed = false;
545
+ this.enableAutoReconnect = true;
546
+ this.disconnectMessage = null;
547
+ const signallingUrl = this.signallingUrlBuilder();
548
+ this.protocol.connect(signallingUrl);
549
+ }
550
+ /**
551
+ * This will start the handshake to the signalling server
552
+ * @param peerConfig - RTC Configuration Options from the Signaling server
553
+ * @remark RTC Peer Connection on Ice Candidate event have it handled by handle Send Ice Candidate
554
+ */
555
+ startSession(peerConfig) {
556
+ this.peerConfig = peerConfig;
557
+ // check for forcing turn
558
+ if (this.config.isFlagEnabled(Config_1.Flags.ForceTURN)) {
559
+ // check for a turn server
560
+ const hasTurnServer = this.checkTurnServerAvailability(peerConfig);
561
+ // close and error if turn is forced and there is no turn server
562
+ if (!hasTurnServer) {
563
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('No turn server was found in the Peer Connection Options. TURN cannot be forced, closing connection. Please use STUN instead');
564
+ this.closeSignalingServer('TURN cannot be forced, closing connection. Please use STUN instead.', false);
565
+ return;
566
+ }
567
+ }
568
+ // set up the peer connection controller
569
+ this.peerConnectionController = new PeerConnectionController_1.PeerConnectionController(this.peerConfig, this.config, this.preferredCodec);
570
+ // set up peer connection controller video stats
571
+ this.peerConnectionController.onVideoStats = (event) => this.handleVideoStats(event);
572
+ /* When the Peer Connection wants to send an offer have it handled */
573
+ this.peerConnectionController.onSendWebRTCOffer = (offer) => this.handleSendWebRTCOffer(offer);
574
+ /* When the Peer Connection wants to send an answer have it handled */
575
+ this.peerConnectionController.onSendWebRTCAnswer = (offer) => this.handleSendWebRTCAnswer(offer);
576
+ /* When the Peer Connection ice candidate is added have it handled */
577
+ this.peerConnectionController.onPeerIceCandidate = (peerConnectionIceEvent) => this.handleSendIceCandidate(peerConnectionIceEvent);
578
+ /* When the Peer Connection has a data channel created for it by the browser, handle it */
579
+ this.peerConnectionController.onDataChannel = (datachannelEvent) => this.handleDataChannel(datachannelEvent);
580
+ // set up webRtc text overlays
581
+ this.peerConnectionController.showTextOverlayConnecting = () => this.pixelStreaming._onWebRtcConnecting();
582
+ this.peerConnectionController.showTextOverlaySetupFailure = () => this.pixelStreaming._onWebRtcFailed();
583
+ let webRtcConnectedSent = false;
584
+ this.peerConnectionController.onIceConnectionStateChange = () => {
585
+ // Browsers emit "connected" when getting first connection and "completed" when finishing
586
+ // candidate checking. However, sometimes browsers can skip "connected" and only emit "completed".
587
+ // Therefore need to check both cases and emit onWebRtcConnected only once on the first hit.
588
+ if (!webRtcConnectedSent &&
589
+ ['connected', 'completed'].includes(this.peerConnectionController.peerConnection.iceConnectionState)) {
590
+ this.pixelStreaming._onWebRtcConnected();
591
+ webRtcConnectedSent = true;
592
+ }
593
+ };
594
+ /* RTC Peer Connection on Track event -> handle on track */
595
+ this.peerConnectionController.onTrack = (trackEvent) => this.streamController.handleOnTrack(trackEvent);
596
+ }
597
+ /**
598
+ * Checks the peer connection options for a turn server and returns true or false
599
+ */
600
+ checkTurnServerAvailability(options) {
601
+ // if iceServers is empty return false this should not be the general use case but is here incase
602
+ if (!options.iceServers) {
603
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('A turn sever was not found');
604
+ return false;
605
+ }
606
+ // loop through the ice servers to check for a turn url
607
+ for (const iceServer of options.iceServers) {
608
+ for (const url of iceServer.urls) {
609
+ if (url.includes('turn')) {
610
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`A turn sever was found at ${url}`);
611
+ return true;
612
+ }
613
+ }
614
+ }
615
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('A turn sever was not found');
616
+ return false;
617
+ }
618
+ /**
619
+ * Handles when a Config Message is received contains the Peer Connection Options required (STUN and TURN Server Info)
620
+ * @param messageConfig - Config Message received from the signaling server
621
+ */
622
+ handleOnConfigMessage(messageConfig) {
623
+ this.resizePlayerStyle();
624
+ // Tell the WebRtcController to start a session with the peer options sent from the signaling server
625
+ this.startSession(messageConfig.peerConnectionOptions);
626
+ }
627
+ /**
628
+ * Handles when the signalling server gives us the list of streamer ids.
629
+ */
630
+ handleStreamerListMessage(messageStreamerList) {
631
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Got streamer list ${messageStreamerList.ids}`);
632
+ let wantedStreamerId = '';
633
+ // get the current selected streamer id option
634
+ const streamerIDOption = this.config.getSettingOption(Config_1.OptionParameters.StreamerId);
635
+ const existingSelection = streamerIDOption.selected.toString().trim();
636
+ if (existingSelection) {
637
+ // default to selected option if it exists
638
+ wantedStreamerId = streamerIDOption.selected;
639
+ }
640
+ // add the streamers to the UI
641
+ const settingOptions = [...messageStreamerList.ids]; // copy the original messageStreamerList.ids
642
+ settingOptions.unshift(''); // add an empty option at the top
643
+ this.config.setOptionSettingOptions(Config_1.OptionParameters.StreamerId, settingOptions);
644
+ let autoSelectedStreamerId = '';
645
+ const waitForStreamer = this.config.isFlagEnabled(Config_1.Flags.WaitForStreamer);
646
+ const reconnectLimit = this.config.getNumericSettingValue(Config_1.NumericParameters.MaxReconnectAttempts);
647
+ const reconnectDelay = this.config.getNumericSettingValue(Config_1.NumericParameters.StreamerAutoJoinInterval);
648
+ // first we figure out a wanted streamer id through various means
649
+ const useUrlParams = this.config.useUrlParams;
650
+ const urlParams = new IURLSearchParams_1.IURLSearchParams(window.location.search);
651
+ if (useUrlParams && urlParams.has(Config_1.OptionParameters.StreamerId)) {
652
+ // if we've set the streamer id on the url we only want that streamer id
653
+ wantedStreamerId = urlParams.get(Config_1.OptionParameters.StreamerId);
654
+ }
655
+ else if (this.subscribedStream) {
656
+ // we were previously subscribed to a streamer, we want that
657
+ wantedStreamerId = this.subscribedStream;
658
+ }
659
+ // now lets see if we can pick it.
660
+ if (wantedStreamerId && messageStreamerList.ids.includes(wantedStreamerId)) {
661
+ // if the wanted stream is in the list. we pick that
662
+ autoSelectedStreamerId = wantedStreamerId;
663
+ }
664
+ else if ((!wantedStreamerId || !waitForStreamer) && messageStreamerList.ids.length == 1) {
665
+ // otherwise, if we're not waiting for the wanted streamer and there's only one streamer, connect to it
666
+ autoSelectedStreamerId = messageStreamerList.ids[0];
667
+ }
668
+ // if we found a streamer id to auto select, select it
669
+ if (autoSelectedStreamerId) {
670
+ this.reconnectAttempt = 0;
671
+ this.isReconnecting = false;
672
+ this.config.setOptionSettingValue(Config_1.OptionParameters.StreamerId, autoSelectedStreamerId);
673
+ }
674
+ else {
675
+ // no auto selected streamer.
676
+ // if we're waiting for a streamer then try reconnecting
677
+ if (waitForStreamer) {
678
+ if (this.reconnectAttempt < reconnectLimit) {
679
+ // still reconnects available
680
+ this.reconnectAttempt++;
681
+ this.isReconnecting = true;
682
+ setTimeout(() => {
683
+ this.protocol.sendMessage(lib_pixelstreamingcommon_ue5_5_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_5_1.Messages.listStreamers));
684
+ }, reconnectDelay);
685
+ }
686
+ else {
687
+ // We've exhausted our reconnect attempts, return to main screen
688
+ this.reconnectAttempt = 0;
689
+ this.isReconnecting = false;
690
+ this.enableAutoReconnect = false;
691
+ }
692
+ }
693
+ }
694
+ // dispatch this event finally
695
+ this.pixelStreaming.dispatchEvent(new EventEmitter_1.StreamerListMessageEvent({
696
+ messageStreamerList,
697
+ autoSelectedStreamerId,
698
+ wantedStreamerId
699
+ }));
700
+ }
701
+ handleStreamerIDChangedMessage(streamerIDChangedMessage) {
702
+ const newID = streamerIDChangedMessage.newID;
703
+ // need to edit the selected streamer in the settings list
704
+ const streamerListOptions = this.config.getSettingOption(Config_1.OptionParameters.StreamerId);
705
+ // temporarily prevent onChange from firing (it would try to subscribe to the streamer again)
706
+ const oldOnChange = streamerListOptions.onChange;
707
+ streamerListOptions.onChange = () => { };
708
+ // change the selected entry.
709
+ const streamerList = streamerListOptions.options;
710
+ for (let i = 0; i < streamerList.length; ++i) {
711
+ if (streamerList[i] == this.subscribedStream) {
712
+ streamerList[i] = newID;
713
+ break;
714
+ }
715
+ }
716
+ // update the list
717
+ streamerListOptions.options = streamerList;
718
+ // update the selected entry
719
+ streamerListOptions.selected = newID;
720
+ // restore the old change notifier.
721
+ streamerListOptions.onChange = oldOnChange;
722
+ // remember which stream we're subscribe to
723
+ this.subscribedStream = streamerIDChangedMessage.newID;
724
+ // notify any listeners
725
+ this.pixelStreaming.dispatchEvent(new EventEmitter_1.StreamerIDChangedMessageEvent({
726
+ newID
727
+ }));
728
+ }
729
+ /**
730
+ * Handle the RTC Answer from the signaling server
731
+ * @param Answer - Answer SDP from the peer.
732
+ */
733
+ handleWebRtcAnswer(Answer) {
734
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Got answer sdp ${Answer.sdp}`);
735
+ const sdpAnswer = {
736
+ sdp: Answer.sdp,
737
+ type: 'answer'
738
+ };
739
+ this.peerConnectionController.receiveAnswer(sdpAnswer);
740
+ this.handlePostWebrtcNegotiation();
741
+ }
742
+ /**
743
+ * Handle the RTC offer from a WebRTC peer (received through the signalling server).
744
+ * @param Offer - Offer SDP from the peer.
745
+ */
746
+ handleWebRtcOffer(Offer) {
747
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Got offer sdp ${Offer.sdp}`);
748
+ this.isUsingSFU = Offer.sfu ? Offer.sfu : false;
749
+ if (this.isUsingSFU) {
750
+ // Disable negotiating with the sfu as the sfu only supports one codec at a time
751
+ this.peerConnectionController.preferredCodec = '';
752
+ }
753
+ const sdpOffer = {
754
+ sdp: Offer.sdp,
755
+ type: 'offer'
756
+ };
757
+ this.peerConnectionController.receiveOffer(sdpOffer, this.config);
758
+ this.handlePostWebrtcNegotiation();
759
+ }
760
+ /**
761
+ * Handle when the SFU provides the peer with its data channels
762
+ * @param DataChannels - The message from the SFU containing the data channels ids
763
+ */
764
+ handleWebRtcSFUPeerDatachannels(DataChannels) {
765
+ const SendOptions = {
766
+ ordered: true,
767
+ negotiated: true,
768
+ id: DataChannels.sendStreamId
769
+ };
770
+ const unidirectional = DataChannels.sendStreamId != DataChannels.recvStreamId;
771
+ this.sendrecvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection, unidirectional ? 'send-datachannel' : 'datachannel', SendOptions);
772
+ if (unidirectional) {
773
+ const RecvOptions = {
774
+ ordered: true,
775
+ negotiated: true,
776
+ id: DataChannels.recvStreamId
777
+ };
778
+ this.recvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection, 'recv-datachannel', RecvOptions);
779
+ this.recvDataChannelController.handleOnOpen = () => this.protocol.sendMessage(lib_pixelstreamingcommon_ue5_5_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_5_1.Messages.peerDataChannelsReady));
780
+ // If we're uni-directional, only the recv data channel should handle incoming messages
781
+ this.recvDataChannelController.handleOnMessage = (ev) => this.handleOnMessage(ev);
782
+ }
783
+ else {
784
+ // else our primary datachannel is send/recv so it can handle incoming messages
785
+ this.sendrecvDataChannelController.handleOnMessage = (ev) => this.handleOnMessage(ev);
786
+ }
787
+ }
788
+ handlePostWebrtcNegotiation() {
789
+ // start the afk warning timer as PS is now running
790
+ this.afkController.startAfkWarningTimer();
791
+ // show the overlay that we have negotiated a connection
792
+ this.pixelStreaming._onWebRtcSdp();
793
+ if (this.statsTimerHandle && this.statsTimerHandle !== undefined) {
794
+ window.clearInterval(this.statsTimerHandle);
795
+ }
796
+ this.statsTimerHandle = window.setInterval(() => this.getStats(), 1000);
797
+ /* */
798
+ this.setMouseInputEnabled(this.config.isFlagEnabled(Config_1.Flags.MouseInput));
799
+ this.setKeyboardInputEnabled(this.config.isFlagEnabled(Config_1.Flags.KeyboardInput));
800
+ this.setGamePadInputEnabled(this.config.isFlagEnabled(Config_1.Flags.GamepadInput));
801
+ }
802
+ /**
803
+ * When an ice Candidate is received from the Signaling server add it to the Peer Connection Client
804
+ * @param iceCandidate - Ice Candidate from Server
805
+ */
806
+ handleIceCandidate(iceCandidate) {
807
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Web RTC Controller: onWebRtcIce');
808
+ const candidate = new RTCIceCandidate(iceCandidate);
809
+ this.peerConnectionController.handleOnIce(candidate);
810
+ }
811
+ /**
812
+ * Send the ice Candidate to the signaling server via websocket
813
+ * @param iceEvent - RTC Peer ConnectionIceEvent) {
814
+ */
815
+ handleSendIceCandidate(iceEvent) {
816
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('OnIceCandidate');
817
+ if (iceEvent.candidate && iceEvent.candidate.candidate) {
818
+ this.protocol.sendMessage(lib_pixelstreamingcommon_ue5_5_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_5_1.Messages.iceCandidate, { candidate: iceEvent.candidate }));
819
+ }
820
+ }
821
+ /**
822
+ * Send the ice Candidate to the signaling server via websocket
823
+ * @param iceEvent - RTC Peer ConnectionIceEvent) {
824
+ */
825
+ handleDataChannel(datachannelEvent) {
826
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Data channel created for us by browser as we are a receiving peer.');
827
+ this.sendrecvDataChannelController.dataChannel = datachannelEvent.channel;
828
+ // Data channel was created for us, so we just need to setup its callbacks and array type
829
+ this.sendrecvDataChannelController.setupDataChannel();
830
+ this.sendrecvDataChannelController.handleOnMessage = (ev) => this.handleOnMessage(ev);
831
+ }
832
+ /**
833
+ * Send the RTC Offer Session to the Signaling server via websocket
834
+ * @param offer - RTC Session Description
835
+ */
836
+ handleSendWebRTCOffer(offer) {
837
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Sending the offer to the Server');
838
+ const extraParams = {
839
+ sdp: offer.sdp,
840
+ minBitrateBps: 1000 * this.config.getNumericSettingValue(Config_1.NumericParameters.WebRTCMinBitrate),
841
+ maxBitrateBps: 1000 * this.config.getNumericSettingValue(Config_1.NumericParameters.WebRTCMaxBitrate)
842
+ };
843
+ this.protocol.sendMessage(lib_pixelstreamingcommon_ue5_5_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_5_1.Messages.offer, extraParams));
844
+ }
845
+ /**
846
+ * Send the RTC Offer Session to the Signaling server via websocket
847
+ * @param answer - RTC Session Description
848
+ */
849
+ handleSendWebRTCAnswer(answer) {
850
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Sending the answer to the Server');
851
+ const extraParams = {
852
+ sdp: answer.sdp,
853
+ minBitrateBps: 1000 * this.config.getNumericSettingValue(Config_1.NumericParameters.WebRTCMinBitrate),
854
+ maxBitrateBps: 1000 * this.config.getNumericSettingValue(Config_1.NumericParameters.WebRTCMaxBitrate)
855
+ };
856
+ this.protocol.sendMessage(lib_pixelstreamingcommon_ue5_5_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_5_1.Messages.answer, extraParams));
857
+ if (this.isUsingSFU) {
858
+ this.protocol.sendMessage(lib_pixelstreamingcommon_ue5_5_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_5_1.Messages.dataChannelRequest));
859
+ }
860
+ }
861
+ /**
862
+ * Set the freeze frame overlay to the player div
863
+ */
864
+ setUpMouseAndFreezeFrame() {
865
+ // Calculating and normalizing positions depends on the width and height of the player.
866
+ const playerElement = this.videoPlayer.getVideoParentElement();
867
+ const videoElement = this.videoPlayer.getVideoElement();
868
+ this.coordinateConverter.reconfigure({ width: playerElement.clientWidth, height: playerElement.clientHeight }, { width: videoElement.videoWidth, height: videoElement.videoHeight });
869
+ this.freezeFrameController.freezeFrame.resize();
870
+ }
871
+ /**
872
+ * Close the Connection to the signaling server
873
+ */
874
+ closeSignalingServer(message, allowReconnect) {
875
+ var _a;
876
+ this.locallyClosed = true;
877
+ this.enableAutoReconnect = allowReconnect;
878
+ this.disconnectMessage = message;
879
+ (_a = this.protocol) === null || _a === void 0 ? void 0 : _a.disconnect(1000, message);
880
+ }
881
+ /**
882
+ * Close the peer connection
883
+ */
884
+ closePeerConnection() {
885
+ var _a;
886
+ (_a = this.peerConnectionController) === null || _a === void 0 ? void 0 : _a.close();
887
+ }
888
+ /**
889
+ * Close all connections
890
+ */
891
+ close() {
892
+ this.closeSignalingServer('', false);
893
+ this.closePeerConnection();
894
+ }
895
+ /**
896
+ * Fires a Video Stats Event in the RTC Peer Connection
897
+ */
898
+ getStats() {
899
+ this.peerConnectionController.generateStats();
900
+ }
901
+ /**
902
+ * Send a Latency Test Request to the UE Instance
903
+ */
904
+ sendLatencyTest() {
905
+ this.latencyStartTime = Date.now();
906
+ this.streamMessageController.toStreamerHandlers.get('LatencyTest')([
907
+ JSON.stringify({
908
+ StartTime: this.latencyStartTime
909
+ })
910
+ ]);
911
+ }
912
+ /**
913
+ * Send a Data Channel Latency Test Request to the UE Instance
914
+ */
915
+ sendDataChannelLatencyTest(descriptor) {
916
+ this.streamMessageController.toStreamerHandlers.get('DataChannelLatencyTest')([
917
+ JSON.stringify(descriptor)
918
+ ]);
919
+ }
920
+ /**
921
+ * Send the MinQP encoder setting to the UE Instance.
922
+ * @param minQP - The lower bound for QP when encoding
923
+ * valid values are (1-51) where:
924
+ * 1 = Best quality but highest bitrate.
925
+ * 51 = Worst quality but lowest bitrate.
926
+ * By default the minQP is 1 meaning the encoder is free
927
+ * to aim for the best quality it can on the given network link.
928
+ */
929
+ sendEncoderMinQP(minQP) {
930
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`MinQP=${minQP}\n`);
931
+ if (minQP != null) {
932
+ this.streamMessageController.toStreamerHandlers.get('Command')([
933
+ JSON.stringify({
934
+ 'Encoder.MinQP': minQP
935
+ })
936
+ ]);
937
+ }
938
+ }
939
+ /**
940
+ * Send the MaxQP encoder setting to the UE Instance.
941
+ * @param maxQP - The upper bound for QP when encoding
942
+ * valid values are (1-51) where:
943
+ * 1 = Best quality but highest bitrate.
944
+ * 51 = Worst quality but lowest bitrate.
945
+ * By default the maxQP is 51 meaning the encoder is free
946
+ * to drop quality as low as needed on the given network link.
947
+ */
948
+ sendEncoderMaxQP(maxQP) {
949
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`MaxQP=${maxQP}\n`);
950
+ if (maxQP != null) {
951
+ this.streamMessageController.toStreamerHandlers.get('Command')([
952
+ JSON.stringify({
953
+ 'Encoder.MaxQP': maxQP
954
+ })
955
+ ]);
956
+ }
957
+ }
958
+ /**
959
+ * Send the { WebRTC.MinBitrate: SomeNumber }} command to UE to set
960
+ * the minimum bitrate that we allow WebRTC to use
961
+ * (note setting this too high in poor networks can be problematic).
962
+ * @param minBitrate - The minimum bitrate we would like WebRTC to not fall below.
963
+ */
964
+ sendWebRTCMinBitrate(minBitrate) {
965
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`WebRTC Min Bitrate=${minBitrate}`);
966
+ if (minBitrate != null) {
967
+ this.streamMessageController.toStreamerHandlers.get('Command')([
968
+ JSON.stringify({
969
+ 'WebRTC.MinBitrate': minBitrate
970
+ })
971
+ ]);
972
+ }
973
+ }
974
+ /**
975
+ * Send the { WebRTC.MaxBitrate: SomeNumber }} command to UE to set
976
+ * the minimum bitrate that we allow WebRTC to use
977
+ * (note setting this too low could result in blocky video).
978
+ * @param minBitrate - The minimum bitrate we would like WebRTC to not fall below.
979
+ */
980
+ sendWebRTCMaxBitrate(maxBitrate) {
981
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`WebRTC Max Bitrate=${maxBitrate}`);
982
+ if (maxBitrate != null) {
983
+ this.streamMessageController.toStreamerHandlers.get('Command')([
984
+ JSON.stringify({
985
+ 'WebRTC.MaxBitrate': maxBitrate
986
+ })
987
+ ]);
988
+ }
989
+ }
990
+ /**
991
+ * Send the { WebRTC.Fps: SomeNumber }} UE 5.0+
992
+ * and { WebRTC.MaxFps } UE 4.27 command to set
993
+ * the maximum fps we would like WebRTC to stream at.
994
+ * @param fps - The maximum stream fps.
995
+ */
996
+ sendWebRTCFps(fps) {
997
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`WebRTC FPS=${fps}`);
998
+ if (fps != null) {
999
+ this.streamMessageController.toStreamerHandlers.get('Command')([
1000
+ JSON.stringify({ 'WebRTC.Fps': fps })
1001
+ ]);
1002
+ /* TODO: Remove when UE 4.27 unsupported. */
1003
+ this.streamMessageController.toStreamerHandlers.get('Command')([
1004
+ JSON.stringify({ 'WebRTC.MaxFps': fps })
1005
+ ]);
1006
+ }
1007
+ }
1008
+ /**
1009
+ * Sends the UI Descriptor `stat fps` to the UE Instance
1010
+ */
1011
+ sendShowFps() {
1012
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('---- Sending show stat to UE ----');
1013
+ this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify({ 'stat.fps': '' })]);
1014
+ }
1015
+ /**
1016
+ * Send an Iframe request to the streamer
1017
+ */
1018
+ sendIframeRequest() {
1019
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('---- Sending Request for an IFrame ----');
1020
+ this.streamMessageController.toStreamerHandlers.get('IFrameRequest')();
1021
+ }
1022
+ /**
1023
+ * Send a UIInteraction message
1024
+ */
1025
+ emitUIInteraction(descriptor) {
1026
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('---- Sending custom UIInteraction message ----');
1027
+ this.streamMessageController.toStreamerHandlers.get('UIInteraction')([JSON.stringify(descriptor)]);
1028
+ }
1029
+ /**
1030
+ * Send a Command message
1031
+ */
1032
+ emitCommand(descriptor) {
1033
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('---- Sending custom Command message ----');
1034
+ this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify(descriptor)]);
1035
+ }
1036
+ /**
1037
+ * Send a console command message
1038
+ */
1039
+ emitConsoleCommand(command) {
1040
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('---- Sending custom Command:ConsoleCommand message ----');
1041
+ this.streamMessageController.toStreamerHandlers.get('Command')([
1042
+ JSON.stringify({
1043
+ ConsoleCommand: command
1044
+ })
1045
+ ]);
1046
+ }
1047
+ /**
1048
+ * Sends a request to the UE Instance to have ownership of Quality
1049
+ */
1050
+ sendRequestQualityControlOwnership() {
1051
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('---- Sending Request to Control Quality ----');
1052
+ this.toStreamerMessagesController.SendRequestQualityControl();
1053
+ }
1054
+ /**
1055
+ * Handles when a Latency Test Result are received from the UE Instance
1056
+ * @param message - Latency Test Timings
1057
+ */
1058
+ handleLatencyTestResult(message) {
1059
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('DataChannelReceiveMessageType.latencyTest');
1060
+ const latencyAsString = new TextDecoder('utf-16').decode(message.slice(1));
1061
+ const latencyTestResults = new LatencyTestResults_1.LatencyTestResults();
1062
+ Object.assign(latencyTestResults, JSON.parse(latencyAsString));
1063
+ latencyTestResults.processFields();
1064
+ latencyTestResults.testStartTimeMs = this.latencyStartTime;
1065
+ latencyTestResults.browserReceiptTimeMs = Date.now();
1066
+ latencyTestResults.latencyExcludingDecode = ~~(latencyTestResults.browserReceiptTimeMs - latencyTestResults.testStartTimeMs);
1067
+ latencyTestResults.testDuration = ~~(latencyTestResults.TransmissionTimeMs - latencyTestResults.ReceiptTimeMs);
1068
+ latencyTestResults.networkLatency = ~~(latencyTestResults.latencyExcludingDecode - latencyTestResults.testDuration);
1069
+ if (latencyTestResults.frameDisplayDeltaTimeMs && latencyTestResults.browserReceiptTimeMs) {
1070
+ latencyTestResults.endToEndLatency = ~~(latencyTestResults.frameDisplayDeltaTimeMs +
1071
+ latencyTestResults.networkLatency,
1072
+ +latencyTestResults.CaptureToSendMs);
1073
+ }
1074
+ this.pixelStreaming._onLatencyTestResult(latencyTestResults);
1075
+ }
1076
+ /**
1077
+ * Handles when a Data Channel Latency Test Response is received from the UE Instance
1078
+ * @param message - Data Channel Latency Test Response
1079
+ */
1080
+ handleDataChannelLatencyTestResponse(message) {
1081
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('DataChannelReceiveMessageType.dataChannelLatencyResponse');
1082
+ const responseAsString = new TextDecoder('utf-16').decode(message.slice(1));
1083
+ const latencyTestResponse = JSON.parse(responseAsString);
1084
+ this.pixelStreaming._onDataChannelLatencyTestResponse(latencyTestResponse);
1085
+ }
1086
+ /**
1087
+ * Handles when the Encoder and Web RTC Settings are received from the UE Instance
1088
+ * @param message - Initial Encoder and Web RTC Settings
1089
+ */
1090
+ handleInitialSettings(message) {
1091
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('DataChannelReceiveMessageType.InitialSettings');
1092
+ const payloadAsString = new TextDecoder('utf-16').decode(message.slice(1));
1093
+ const parsedInitialSettings = JSON.parse(payloadAsString);
1094
+ const initialSettings = new InitialSettings_1.InitialSettings();
1095
+ if (parsedInitialSettings.Encoder) {
1096
+ initialSettings.EncoderSettings = parsedInitialSettings.Encoder;
1097
+ }
1098
+ if (parsedInitialSettings.WebRTC) {
1099
+ initialSettings.WebRTCSettings = parsedInitialSettings.WebRTC;
1100
+ }
1101
+ if (parsedInitialSettings.PixelStreaming) {
1102
+ initialSettings.PixelStreamingSettings = parsedInitialSettings.PixelStreaming;
1103
+ }
1104
+ if (parsedInitialSettings.ConfigOptions &&
1105
+ parsedInitialSettings.ConfigOptions.DefaultToHover !== undefined) {
1106
+ this.config.setFlagEnabled(Config_1.Flags.HoveringMouseMode, !!parsedInitialSettings.ConfigOptions.DefaultToHover);
1107
+ }
1108
+ initialSettings.ueCompatible();
1109
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(payloadAsString);
1110
+ this.pixelStreaming._onInitialSettings(initialSettings);
1111
+ }
1112
+ /**
1113
+ * Handles when the Quantization Parameter are received from the UE Instance
1114
+ * @param message - Encoders Quantization Parameter
1115
+ */
1116
+ handleVideoEncoderAvgQP(message) {
1117
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('DataChannelReceiveMessageType.VideoEncoderAvgQP');
1118
+ const AvgQP = Number(new TextDecoder('utf-16').decode(message.slice(1)));
1119
+ this.setVideoEncoderAvgQP(AvgQP);
1120
+ }
1121
+ /**
1122
+ * Handles when the video element has been loaded with a srcObject
1123
+ */
1124
+ handleVideoInitialized() {
1125
+ this.pixelStreaming._onVideoInitialized();
1126
+ // either autoplay the video or set up the play overlay
1127
+ this.autoPlayVideoOrSetUpPlayOverlay();
1128
+ this.resizePlayerStyle();
1129
+ this.videoPlayer.updateVideoStreamSize();
1130
+ }
1131
+ /**
1132
+ * Flag set if the user has Quality Ownership
1133
+ * @param message - Does the current client have Quality Ownership
1134
+ */
1135
+ onQualityControlOwnership(message) {
1136
+ const view = new Uint8Array(message);
1137
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info('DataChannelReceiveMessageType.QualityControlOwnership');
1138
+ this.isQualityController = new Boolean(view[1]).valueOf();
1139
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Received quality controller message, will control quality: ${this.isQualityController}`);
1140
+ this.pixelStreaming._onQualityControlOwnership(this.isQualityController);
1141
+ }
1142
+ /**
1143
+ * Handles when the Aggregated stats are Collected
1144
+ * @param stats - Aggregated Stats
1145
+ */
1146
+ handleVideoStats(stats) {
1147
+ this.pixelStreaming._onVideoStats(stats);
1148
+ }
1149
+ /**
1150
+ * To Resize the Video Player element
1151
+ */
1152
+ resizePlayerStyle() {
1153
+ this.videoPlayer.resizePlayerStyle();
1154
+ }
1155
+ setPreferredCodec(codec) {
1156
+ this.preferredCodec = codec;
1157
+ if (this.peerConnectionController) {
1158
+ this.peerConnectionController.preferredCodec = codec;
1159
+ this.peerConnectionController.updateCodecSelection = false;
1160
+ }
1161
+ }
1162
+ setVideoEncoderAvgQP(avgQP) {
1163
+ this.videoAvgQp = avgQP;
1164
+ this.pixelStreaming._onVideoEncoderAvgQP(this.videoAvgQp);
1165
+ }
1166
+ /**
1167
+ * enables/disables keyboard event listeners
1168
+ */
1169
+ setKeyboardInputEnabled(isEnabled) {
1170
+ var _a;
1171
+ (_a = this.keyboardController) === null || _a === void 0 ? void 0 : _a.unregister();
1172
+ if (isEnabled) {
1173
+ this.keyboardController = this.inputClassesFactory.registerKeyBoard(this.config);
1174
+ }
1175
+ }
1176
+ /**
1177
+ * enables/disables mouse event listeners
1178
+ */
1179
+ setMouseInputEnabled(isEnabled) {
1180
+ var _a;
1181
+ (_a = this.mouseController) === null || _a === void 0 ? void 0 : _a.unregister();
1182
+ if (isEnabled) {
1183
+ const mouseMode = this.config.isFlagEnabled(Config_1.Flags.HoveringMouseMode)
1184
+ ? Config_1.ControlSchemeType.HoveringMouse
1185
+ : Config_1.ControlSchemeType.LockedMouse;
1186
+ this.mouseController = this.inputClassesFactory.registerMouse(mouseMode);
1187
+ }
1188
+ }
1189
+ /**
1190
+ * enables/disables touch event listeners
1191
+ */
1192
+ setTouchInputEnabled(isEnabled) {
1193
+ var _a;
1194
+ (_a = this.touchController) === null || _a === void 0 ? void 0 : _a.unregister();
1195
+ if (isEnabled) {
1196
+ this.touchController = this.inputClassesFactory.registerTouch(this.config.isFlagEnabled(Config_1.Flags.FakeMouseWithTouches));
1197
+ }
1198
+ }
1199
+ /**
1200
+ * enables/disables game pad event listeners
1201
+ */
1202
+ setGamePadInputEnabled(isEnabled) {
1203
+ var _a;
1204
+ (_a = this.gamePadController) === null || _a === void 0 ? void 0 : _a.unregister();
1205
+ if (isEnabled) {
1206
+ this.gamePadController = this.inputClassesFactory.registerGamePad();
1207
+ }
1208
+ }
1209
+ registerDataChannelEventEmitters(dataChannel) {
1210
+ dataChannel.onOpen = (label, event) => this.pixelStreaming.dispatchEvent(new EventEmitter_1.DataChannelOpenEvent({ label, event }));
1211
+ dataChannel.onClose = (label, event) => this.pixelStreaming.dispatchEvent(new EventEmitter_1.DataChannelCloseEvent({ label, event }));
1212
+ dataChannel.onError = (label, event) => this.pixelStreaming.dispatchEvent(new EventEmitter_1.DataChannelErrorEvent({ label, event }));
1213
+ }
1214
+ registerMessageHandler(name, direction, handler) {
1215
+ if (direction === StreamMessageController_1.MessageDirection.FromStreamer && typeof handler === 'undefined') {
1216
+ lib_pixelstreamingcommon_ue5_5_1.Logger.Warning(`Unable to register handler for ${name} as no handler was passed`);
1217
+ }
1218
+ this.streamMessageController.registerMessageHandler(direction, name, (data) => typeof handler === 'undefined' && direction === StreamMessageController_1.MessageDirection.ToStreamer
1219
+ ? this.sendMessageController.sendMessageToStreamer(name, data)
1220
+ : handler(data));
1221
+ }
1222
+ }
1223
+ exports.WebRtcPlayerController = WebRtcPlayerController;
1224
+ //# sourceMappingURL=WebRtcPlayerController.js.map