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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/.eslintrc.js +1 -1
  2. package/.prettierrc.json +1 -0
  3. package/dist/lib-pixelstreamingfrontend.esm.js +1 -1
  4. package/dist/lib-pixelstreamingfrontend.js +1 -1
  5. package/package.json +6 -5
  6. package/src/AFK/AFKController.ts +10 -32
  7. package/src/Config/Config.ts +179 -201
  8. package/src/Config/SettingBase.ts +61 -2
  9. package/src/Config/SettingFlag.ts +10 -48
  10. package/src/Config/SettingNumber.ts +10 -28
  11. package/src/Config/SettingOption.ts +13 -46
  12. package/src/Config/SettingText.ts +9 -37
  13. package/src/DataChannel/DataChannelController.ts +6 -26
  14. package/src/DataChannel/DataChannelLatencyTestController.ts +38 -33
  15. package/src/DataChannel/DataChannelLatencyTestResults.ts +8 -10
  16. package/src/DataChannel/DataChannelSender.ts +5 -15
  17. package/src/DataChannel/LatencyTestResults.ts +5 -15
  18. package/src/FreezeFrame/FreezeFrame.ts +7 -19
  19. package/src/FreezeFrame/FreezeFrameController.ts +3 -14
  20. package/src/Inputs/GamepadController.ts +123 -221
  21. package/src/Inputs/GamepadTypes.ts +23 -0
  22. package/src/Inputs/IInputController.ts +17 -0
  23. package/src/Inputs/InputClassesFactory.ts +38 -45
  24. package/src/Inputs/KeyCodes.ts +114 -0
  25. package/src/Inputs/KeyboardController.ts +49 -232
  26. package/src/Inputs/MouseController.ts +71 -297
  27. package/src/Inputs/MouseControllerHovering.ts +118 -0
  28. package/src/Inputs/MouseControllerLocked.ts +194 -0
  29. package/src/Inputs/TouchController.ts +49 -105
  30. package/src/Inputs/TouchControllerFake.ts +132 -0
  31. package/src/Inputs/XRGamepadController.ts +35 -44
  32. package/src/PeerConnectionController/AggregatedStats.ts +26 -54
  33. package/src/PeerConnectionController/CandidatePairStats.ts +1 -1
  34. package/src/PeerConnectionController/CandidateStat.ts +1 -1
  35. package/src/PeerConnectionController/PeerConnectionController.ts +177 -162
  36. package/src/PixelStreaming/PixelStreaming.ts +174 -226
  37. package/src/UI/OnScreenKeyboard.ts +14 -9
  38. package/src/UeInstanceMessage/ResponseController.ts +6 -15
  39. package/src/UeInstanceMessage/SendMessageController.ts +16 -18
  40. package/src/UeInstanceMessage/StreamMessageController.ts +3 -12
  41. package/src/UeInstanceMessage/ToStreamerMessagesController.ts +3 -9
  42. package/src/Util/EventEmitter.ts +17 -22
  43. package/src/Util/FileUtil.ts +11 -34
  44. package/src/Util/IURLSearchParams.ts +25 -0
  45. package/src/Util/InputCoordTranslator.ts +73 -0
  46. package/src/Util/RTCUtils.ts +23 -15
  47. package/src/VideoPlayer/StreamController.ts +6 -23
  48. package/src/VideoPlayer/VideoPlayer.ts +9 -30
  49. package/src/WebRtcPlayer/WebRtcPlayerController.ts +328 -690
  50. package/src/WebXR/WebXRController.ts +82 -94
  51. package/src/pixelstreamingfrontend.ts +6 -10
  52. package/types/AFK/AFKController.d.ts +0 -1
  53. package/types/Config/Config.d.ts +6 -5
  54. package/types/Config/SettingBase.d.ts +13 -0
  55. package/types/Config/SettingFlag.d.ts +1 -10
  56. package/types/Config/SettingNumber.d.ts +1 -5
  57. package/types/Config/SettingOption.d.ts +1 -10
  58. package/types/Config/SettingText.d.ts +1 -9
  59. package/types/DataChannel/DataChannelLatencyTestController.d.ts +1 -1
  60. package/types/Inputs/GamepadController.d.ts +22 -46
  61. package/types/Inputs/GamepadTypes.d.ts +7 -0
  62. package/types/Inputs/IInputController.d.ts +16 -0
  63. package/types/Inputs/InputClassesFactory.d.ts +7 -8
  64. package/types/Inputs/KeyCodes.d.ts +5 -0
  65. package/types/Inputs/KeyboardController.d.ts +17 -45
  66. package/types/Inputs/MouseController.d.ts +33 -68
  67. package/types/Inputs/MouseControllerHovering.d.ts +26 -0
  68. package/types/Inputs/MouseControllerLocked.d.ts +31 -0
  69. package/types/Inputs/TouchController.d.ts +19 -44
  70. package/types/Inputs/TouchControllerFake.d.ts +29 -0
  71. package/types/Inputs/XRGamepadController.d.ts +0 -7
  72. package/types/PeerConnectionController/PeerConnectionController.d.ts +4 -1
  73. package/types/PixelStreaming/PixelStreaming.d.ts +14 -2
  74. package/types/UI/OnScreenKeyboard.d.ts +2 -2
  75. package/types/Util/EventEmitter.d.ts +1 -1
  76. package/types/Util/IURLSearchParams.d.ts +9 -0
  77. package/types/Util/InputCoordTranslator.d.ts +29 -0
  78. package/types/VideoPlayer/StreamController.d.ts +0 -2
  79. package/types/WebRtcPlayer/WebRtcPlayerController.d.ts +19 -17
  80. package/types/pixelstreamingfrontend.d.ts +1 -1
  81. package/src/Inputs/FakeTouchController.ts +0 -199
  82. package/src/Inputs/HoveringMouseEvents.ts +0 -192
  83. package/src/Inputs/IMouseEvents.ts +0 -64
  84. package/src/Inputs/ITouchController.ts +0 -29
  85. package/src/Inputs/LockedMouseEvents.ts +0 -287
  86. package/src/Util/CoordinateConverter.ts +0 -290
  87. package/src/Util/EventListenerTracker.ts +0 -29
  88. package/types/Inputs/FakeTouchController.d.ts +0 -61
  89. package/types/Inputs/HoveringMouseEvents.d.ts +0 -56
  90. package/types/Inputs/IMouseEvents.d.ts +0 -53
  91. package/types/Inputs/ITouchController.d.ts +0 -24
  92. package/types/Inputs/LockedMouseEvents.d.ts +0 -80
  93. package/types/Util/CoordinateConverter.d.ts +0 -100
  94. package/types/Util/EventListenerTracker.d.ts +0 -14
@@ -1,15 +1,18 @@
1
1
  // Copyright Epic Games, Inc. All Rights Reserved.
2
2
 
3
- import { FakeTouchController } from './FakeTouchController';
4
3
  import { KeyboardController } from './KeyboardController';
5
4
  import { MouseController } from './MouseController';
5
+ import { MouseControllerLocked } from './MouseControllerLocked';
6
+ import { MouseControllerHovering } from './MouseControllerHovering';
6
7
  import { TouchController } from './TouchController';
7
- import { GamePadController } from './GamepadController';
8
+ import { TouchControllerFake } from './TouchControllerFake';
9
+ import { GamepadController } from './GamepadController';
8
10
  import { Config, ControlSchemeType } from '../Config/Config';
9
11
  import { Logger } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.5';
10
- import { CoordinateConverter } from '../Util/CoordinateConverter';
12
+ import { InputCoordTranslator } from '../Util/InputCoordTranslator';
11
13
  import { StreamMessageController } from '../UeInstanceMessage/StreamMessageController';
12
14
  import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
15
+ import { IInputController } from './IInputController';
13
16
 
14
17
  /**
15
18
  * Class for making and setting up input class types
@@ -17,7 +20,7 @@ import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
17
20
  export class InputClassesFactory {
18
21
  toStreamerMessagesProvider: StreamMessageController;
19
22
  videoElementProvider: VideoPlayer;
20
- coordinateConverter: CoordinateConverter;
23
+ coordinateConverter: InputCoordTranslator;
21
24
  activeKeys: ActiveKeys = new ActiveKeys();
22
25
 
23
26
  /**
@@ -28,7 +31,7 @@ export class InputClassesFactory {
28
31
  constructor(
29
32
  toStreamerMessagesProvider: StreamMessageController,
30
33
  videoElementProvider: VideoPlayer,
31
- coordinateConverter: CoordinateConverter
34
+ coordinateConverter: InputCoordTranslator
32
35
  ) {
33
36
  this.toStreamerMessagesProvider = toStreamerMessagesProvider;
34
37
  this.videoElementProvider = videoElementProvider;
@@ -39,13 +42,13 @@ export class InputClassesFactory {
39
42
  * Registers browser key events.
40
43
  */
41
44
  registerKeyBoard(config: Config) {
42
- Logger.Log(Logger.GetStackTrace(), 'Register Keyboard Events', 7);
45
+ Logger.Info('Register Keyboard Events');
43
46
  const keyboardController = new KeyboardController(
44
47
  this.toStreamerMessagesProvider,
45
48
  config,
46
49
  this.activeKeys
47
50
  );
48
- keyboardController.registerKeyBoardEvents();
51
+ keyboardController.register();
49
52
  return keyboardController;
50
53
  }
51
54
 
@@ -54,30 +57,25 @@ export class InputClassesFactory {
54
57
  * @param controlScheme - if the mouse is either hovering or locked
55
58
  */
56
59
  registerMouse(controlScheme: ControlSchemeType) {
57
- Logger.Log(Logger.GetStackTrace(), 'Register Mouse Events', 7);
58
- const mouseController = new MouseController(
59
- this.toStreamerMessagesProvider,
60
- this.videoElementProvider,
61
- this.coordinateConverter,
62
- this.activeKeys
63
- );
64
-
65
- switch (controlScheme) {
66
- case ControlSchemeType.LockedMouse:
67
- mouseController.registerLockedMouseEvents(mouseController);
68
- break;
69
- case ControlSchemeType.HoveringMouse:
70
- mouseController.registerHoveringMouseEvents(mouseController);
71
- break;
72
- default:
73
- Logger.Info(
74
- Logger.GetStackTrace(),
75
- 'unknown Control Scheme Type Defaulting to Locked Mouse Events'
76
- );
77
- mouseController.registerLockedMouseEvents(mouseController);
78
- break;
60
+ Logger.Info('Register Mouse Events');
61
+ let mouseController: MouseController;
62
+ if (controlScheme == ControlSchemeType.HoveringMouse) {
63
+ mouseController = new MouseControllerHovering(
64
+ this.toStreamerMessagesProvider,
65
+ this.videoElementProvider,
66
+ this.coordinateConverter,
67
+ this.activeKeys
68
+ );
69
+ } else {
70
+ mouseController = new MouseControllerLocked(
71
+ this.toStreamerMessagesProvider,
72
+ this.videoElementProvider,
73
+ this.coordinateConverter,
74
+ this.activeKeys
75
+ );
79
76
  }
80
77
 
78
+ mouseController.register();
81
79
  return mouseController;
82
80
  }
83
81
 
@@ -85,39 +83,34 @@ export class InputClassesFactory {
85
83
  * register touch events
86
84
  * @param fakeMouseTouch - the faked mouse touch event
87
85
  */
88
- registerTouch(
89
- fakeMouseTouch: boolean,
90
- videoElementParentClientRect: DOMRect
91
- ) {
92
- Logger.Log(Logger.GetStackTrace(), 'Registering Touch', 6);
86
+ registerTouch(fakeMouseTouch: boolean) {
87
+ Logger.Info('Registering Touch');
88
+ let touchController: IInputController;
93
89
  if (fakeMouseTouch) {
94
- const fakeTouchController = new FakeTouchController(
90
+ touchController = new TouchControllerFake(
95
91
  this.toStreamerMessagesProvider,
96
92
  this.videoElementProvider,
97
93
  this.coordinateConverter
98
94
  );
99
- fakeTouchController.setVideoElementParentClientRect(
100
- videoElementParentClientRect
101
- );
102
- return fakeTouchController;
103
95
  } else {
104
- return new TouchController(
96
+ touchController = new TouchController(
105
97
  this.toStreamerMessagesProvider,
106
98
  this.videoElementProvider,
107
99
  this.coordinateConverter
108
100
  );
109
101
  }
102
+ touchController.register();
103
+ return touchController;
110
104
  }
111
105
 
112
106
  /**
113
107
  * registers a gamepad
114
108
  */
115
109
  registerGamePad() {
116
- Logger.Log(Logger.GetStackTrace(), 'Register Game Pad', 7);
117
- const gamePadController = new GamePadController(
118
- this.toStreamerMessagesProvider
119
- );
120
- return gamePadController;
110
+ Logger.Info('Register Game Pad');
111
+ const gamepadController = new GamepadController(this.toStreamerMessagesProvider);
112
+ gamepadController.register();
113
+ return gamepadController;
121
114
  }
122
115
  }
123
116
 
@@ -0,0 +1,114 @@
1
+ // Copyright Epic Games, Inc. All Rights Reserved.
2
+
3
+ interface ICodeToKeyCode {
4
+ [key: string]: number;
5
+ }
6
+
7
+ /*
8
+ * New browser APIs have moved away from KeyboardEvent.keyCode to KeyboardEvent.Code.
9
+ * For details see: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#constants_for_keycode_value
10
+ * We still use old KeyboardEvent.keyCode integers in the UE C++ side, so we need a way to map the new
11
+ * string-based KeyboardEvent.Code to the old integers.
12
+ */
13
+ export const CodeToKeyCode: ICodeToKeyCode = Object.freeze({
14
+ Escape: 27,
15
+ Digit0: 48,
16
+ Digit1: 49,
17
+ Digit2: 50,
18
+ Digit3: 51,
19
+ Digit4: 52,
20
+ Digit5: 53,
21
+ Digit6: 54,
22
+ Digit7: 55,
23
+ Digit8: 56,
24
+ Digit9: 57,
25
+ Minus: 173,
26
+ Equal: 187,
27
+ Backspace: 8,
28
+ Tab: 9,
29
+ KeyQ: 81,
30
+ KeyW: 87,
31
+ KeyE: 69,
32
+ KeyR: 82,
33
+ KeyT: 84,
34
+ KeyY: 89,
35
+ KeyU: 85,
36
+ KeyI: 73,
37
+ KeyO: 79,
38
+ KeyP: 80,
39
+ BracketLeft: 219,
40
+ BracketRight: 221,
41
+ Enter: 13,
42
+ ControlLeft: 17,
43
+ KeyA: 65,
44
+ KeyS: 83,
45
+ KeyD: 68,
46
+ KeyF: 70,
47
+ KeyG: 71,
48
+ KeyH: 72,
49
+ KeyJ: 74,
50
+ KeyK: 75,
51
+ KeyL: 76,
52
+ Semicolon: 186,
53
+ Quote: 222,
54
+ Backquote: 192,
55
+ ShiftLeft: 16,
56
+ Backslash: 220,
57
+ KeyZ: 90,
58
+ KeyX: 88,
59
+ KeyC: 67,
60
+ KeyV: 86,
61
+ KeyB: 66,
62
+ KeyN: 78,
63
+ KeyM: 77,
64
+ Comma: 188,
65
+ Period: 190,
66
+ Slash: 191,
67
+ ShiftRight: 253,
68
+ AltLeft: 18,
69
+ Space: 32,
70
+ CapsLock: 20,
71
+ F1: 112,
72
+ F2: 113,
73
+ F3: 114,
74
+ F4: 115,
75
+ F5: 116,
76
+ F6: 117,
77
+ F7: 118,
78
+ F8: 119,
79
+ F9: 120,
80
+ F10: 121,
81
+ F11: 122,
82
+ F12: 123,
83
+ Pause: 19,
84
+ ScrollLock: 145,
85
+ NumpadDivide: 111,
86
+ NumpadMultiply: 106,
87
+ NumpadSubtract: 109,
88
+ NumpadAdd: 107,
89
+ NumpadDecimal: 110,
90
+ Numpad9: 105,
91
+ Numpad8: 104,
92
+ Numpad7: 103,
93
+ Numpad6: 102,
94
+ Numpad5: 101,
95
+ Numpad4: 100,
96
+ Numpad3: 99,
97
+ Numpad2: 98,
98
+ Numpad1: 97,
99
+ Numpad0: 96,
100
+ NumLock: 144,
101
+ ControlRight: 254,
102
+ AltRight: 255,
103
+ Home: 36,
104
+ End: 35,
105
+ ArrowUp: 38,
106
+ ArrowLeft: 37,
107
+ ArrowRight: 39,
108
+ ArrowDown: 40,
109
+ PageUp: 33,
110
+ PageDown: 34,
111
+ Insert: 45,
112
+ Delete: 46,
113
+ ContextMenu: 93
114
+ });
@@ -5,206 +5,57 @@ import { Logger } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.5';
5
5
  import { ActiveKeys } from './InputClassesFactory';
6
6
  import { StreamMessageController } from '../UeInstanceMessage/StreamMessageController';
7
7
  import { Config, Flags } from '../Config/Config';
8
- import { EventListenerTracker } from '../Util/EventListenerTracker';
9
-
10
- interface ICodeToKeyCode {
11
- [key: string]: number;
12
- }
8
+ import { IInputController } from './IInputController';
9
+ import { CodeToKeyCode } from './KeyCodes';
13
10
 
14
11
  /**
15
12
  * Handles the Keyboard Inputs for the document
16
13
  */
17
- export class KeyboardController {
18
- toStreamerMessagesProvider: StreamMessageController;
19
- activeKeysProvider: ActiveKeys;
14
+ export class KeyboardController implements IInputController {
15
+ streamMessageController: StreamMessageController;
16
+ activeKeys: ActiveKeys;
20
17
  config: Config;
21
18
 
22
- // Utility for keeping track of event handlers and to unregister them.
23
- private keyboardEventListenerTracker = new EventListenerTracker();
24
-
25
- /*
26
- * New browser APIs have moved away from KeyboardEvent.keyCode to KeyboardEvent.Code.
27
- * For details see: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#constants_for_keycode_value
28
- * We still use old KeyboardEvent.keyCode integers in the UE C++ side, so we need a way to map the new
29
- * string-based KeyboardEvent.Code to the old integers.
30
- */
31
- CodeToKeyCode: ICodeToKeyCode = {
32
- Escape: 27,
33
- Digit0: 48,
34
- Digit1: 49,
35
- Digit2: 50,
36
- Digit3: 51,
37
- Digit4: 52,
38
- Digit5: 53,
39
- Digit6: 54,
40
- Digit7: 55,
41
- Digit8: 56,
42
- Digit9: 57,
43
- Minus: 173,
44
- Equal: 187,
45
- Backspace: 8,
46
- Tab: 9,
47
- KeyQ: 81,
48
- KeyW: 87,
49
- KeyE: 69,
50
- KeyR: 82,
51
- KeyT: 84,
52
- KeyY: 89,
53
- KeyU: 85,
54
- KeyI: 73,
55
- KeyO: 79,
56
- KeyP: 80,
57
- BracketLeft: 219,
58
- BracketRight: 221,
59
- Enter: 13,
60
- ControlLeft: 17,
61
- KeyA: 65,
62
- KeyS: 83,
63
- KeyD: 68,
64
- KeyF: 70,
65
- KeyG: 71,
66
- KeyH: 72,
67
- KeyJ: 74,
68
- KeyK: 75,
69
- KeyL: 76,
70
- Semicolon: 186,
71
- Quote: 222,
72
- Backquote: 192,
73
- ShiftLeft: 16,
74
- Backslash: 220,
75
- KeyZ: 90,
76
- KeyX: 88,
77
- KeyC: 67,
78
- KeyV: 86,
79
- KeyB: 66,
80
- KeyN: 78,
81
- KeyM: 77,
82
- Comma: 188,
83
- Period: 190,
84
- Slash: 191,
85
- ShiftRight: 253,
86
- AltLeft: 18,
87
- Space: 32,
88
- CapsLock: 20,
89
- F1: 112,
90
- F2: 113,
91
- F3: 114,
92
- F4: 115,
93
- F5: 116,
94
- F6: 117,
95
- F7: 118,
96
- F8: 119,
97
- F9: 120,
98
- F10: 121,
99
- F11: 122,
100
- F12: 123,
101
- Pause: 19,
102
- ScrollLock: 145,
103
- NumpadDivide: 111,
104
- NumpadMultiply: 106,
105
- NumpadSubtract: 109,
106
- NumpadAdd: 107,
107
- NumpadDecimal: 110,
108
- Numpad9: 105,
109
- Numpad8: 104,
110
- Numpad7: 103,
111
- Numpad6: 102,
112
- Numpad5: 101,
113
- Numpad4: 100,
114
- Numpad3: 99,
115
- Numpad2: 98,
116
- Numpad1: 97,
117
- Numpad0: 96,
118
- NumLock: 144,
119
- ControlRight: 254,
120
- AltRight: 255,
121
- Home: 36,
122
- End: 35,
123
- ArrowUp: 38,
124
- ArrowLeft: 37,
125
- ArrowRight: 39,
126
- ArrowDown: 40,
127
- PageUp: 33,
128
- PageDown: 34,
129
- Insert: 45,
130
- Delete: 46,
131
- ContextMenu: 93
132
- };
19
+ onKeyDownListener: (event: KeyboardEvent) => void;
20
+ onKeyUpListener: (event: KeyboardEvent) => void;
21
+ onKeyPressListener: (event: KeyboardEvent) => void;
22
+ onCompositionEndListener: (event: KeyboardEvent) => void;
133
23
 
134
- /**
135
- * @param toStreamerMessagesProvider Stream message provider class object
136
- * @param config The applications configuration. We're interested in the suppress browser keys option
137
- * @param activeKeysProvider Active keys provider class object
138
- */
139
- constructor(
140
- toStreamerMessagesProvider: StreamMessageController,
141
- config: Config,
142
- activeKeysProvider: ActiveKeys
143
- ) {
144
- this.toStreamerMessagesProvider = toStreamerMessagesProvider;
24
+ constructor(streamMessageController: StreamMessageController, config: Config, activeKeys: ActiveKeys) {
25
+ this.streamMessageController = streamMessageController;
145
26
  this.config = config;
146
- this.activeKeysProvider = activeKeysProvider;
147
- }
148
-
149
- /**
150
- * Registers document keyboard events with the controller
151
- */
152
- registerKeyBoardEvents() {
153
- const compositionEndHandler = (ev: CompositionEvent) => this.handleOnCompositionEnd(ev);
154
- const keyDownHandler = (ev: KeyboardEvent) => this.handleOnKeyDown(ev);
155
- const keyUpHandler = (ev: KeyboardEvent) => this.handleOnKeyUp(ev);
156
- const keyPressHandler = (ev: KeyboardEvent) => this.handleOnKeyPress(ev);
27
+ this.activeKeys = activeKeys;
157
28
 
158
- document.addEventListener("compositionend", compositionEndHandler);
159
- document.addEventListener("keydown", keyDownHandler);
160
- document.addEventListener("keyup", keyUpHandler);
29
+ this.onKeyDownListener = this.handleOnKeyDown.bind(this);
30
+ this.onKeyUpListener = this.handleOnKeyUp.bind(this);
31
+ this.onKeyPressListener = this.handleOnKeyPress.bind(this);
32
+ this.onCompositionEndListener = this.handleOnCompositionEnd.bind(this);
33
+ }
161
34
 
35
+ register() {
36
+ document.addEventListener('compositionend', this.onCompositionEndListener);
37
+ document.addEventListener('keydown', this.onKeyDownListener);
38
+ document.addEventListener('keyup', this.onKeyUpListener);
162
39
  //This has been deprecated as at Jun 13 2021
163
- document.addEventListener("keypress", keyPressHandler);
164
-
165
- this.keyboardEventListenerTracker.addUnregisterCallback(
166
- () => document.removeEventListener("compositionend", compositionEndHandler)
167
- );
168
- this.keyboardEventListenerTracker.addUnregisterCallback(
169
- () => document.removeEventListener("keydown", keyDownHandler)
170
- );
171
- this.keyboardEventListenerTracker.addUnregisterCallback(
172
- () => document.removeEventListener("keyup", keyUpHandler)
173
- );
174
- this.keyboardEventListenerTracker.addUnregisterCallback(
175
- () => document.removeEventListener("keypress", keyPressHandler)
176
- );
40
+ document.addEventListener('keypress', this.onKeyPressListener);
177
41
  }
178
42
 
179
- /**
180
- * Unregister document keyboard events.
181
- */
182
- unregisterKeyBoardEvents() {
183
- this.keyboardEventListenerTracker.unregisterAll();
43
+ unregister() {
44
+ document.removeEventListener('compositionend', this.onCompositionEndListener);
45
+ document.removeEventListener('keydown', this.onKeyDownListener);
46
+ document.removeEventListener('keyup', this.onKeyUpListener);
47
+ document.removeEventListener('keypress', this.onKeyPressListener);
184
48
  }
185
49
 
186
- /**
187
- * Handles When a key is down
188
- * @param keyboardEvent - Keyboard event
189
- */
190
- handleOnKeyDown(keyboardEvent: KeyboardEvent) {
50
+ private handleOnKeyDown(keyboardEvent: KeyboardEvent) {
191
51
  const keyCode = this.getKeycode(keyboardEvent);
192
52
  if (!keyCode || keyCode === 229) {
193
53
  return;
194
54
  }
195
55
 
196
- Logger.Log(
197
- Logger.GetStackTrace(),
198
- `key down ${keyCode}, repeat = ${keyboardEvent.repeat}`,
199
- 6
200
- );
201
- const toStreamerHandlers =
202
- this.toStreamerMessagesProvider.toStreamerHandlers;
203
- toStreamerHandlers.get('KeyDown')([
204
- this.getKeycode(keyboardEvent),
205
- keyboardEvent.repeat ? 1 : 0
206
- ]);
207
- const activeKeys = this.activeKeysProvider.getActiveKeys();
56
+ const toStreamerHandlers = this.streamMessageController.toStreamerHandlers;
57
+ toStreamerHandlers.get('KeyDown')([this.getKeycode(keyboardEvent), keyboardEvent.repeat ? 1 : 0]);
58
+ const activeKeys = this.activeKeys.getActiveKeys();
208
59
  activeKeys.push(keyCode);
209
60
  // Backspace is not considered a keypress in JavaScript but we need it
210
61
  // to be so characters may be deleted in a UE text entry field.
@@ -216,66 +67,39 @@ export class KeyboardController {
216
67
  );
217
68
  }
218
69
 
219
- if (
220
- this.config.isFlagEnabled(Flags.SuppressBrowserKeys) &&
221
- this.isKeyCodeBrowserKey(keyCode)
222
- ) {
70
+ if (this.config.isFlagEnabled(Flags.SuppressBrowserKeys) && this.isKeyCodeBrowserKey(keyCode)) {
223
71
  keyboardEvent.preventDefault();
224
72
  }
225
73
  }
226
74
 
227
- /**
228
- * handles when a key is up
229
- * @param keyboardEvent - Keyboard event
230
- */
231
- handleOnKeyUp(keyboardEvent: KeyboardEvent) {
75
+ private handleOnKeyUp(keyboardEvent: KeyboardEvent) {
232
76
  const keyCode = this.getKeycode(keyboardEvent);
233
77
  if (!keyCode) {
234
78
  return;
235
79
  }
236
80
 
237
- Logger.Log(Logger.GetStackTrace(), `key up ${keyCode}`, 6);
238
- const toStreamerHandlers =
239
- this.toStreamerMessagesProvider.toStreamerHandlers;
240
- toStreamerHandlers.get('KeyUp')([ keyCode ]);
81
+ const toStreamerHandlers = this.streamMessageController.toStreamerHandlers;
82
+ toStreamerHandlers.get('KeyUp')([keyCode]);
241
83
 
242
- if (
243
- this.config.isFlagEnabled(Flags.SuppressBrowserKeys) &&
244
- this.isKeyCodeBrowserKey(keyCode)
245
- ) {
84
+ if (this.config.isFlagEnabled(Flags.SuppressBrowserKeys) && this.isKeyCodeBrowserKey(keyCode)) {
246
85
  keyboardEvent.preventDefault();
247
86
  }
248
87
  }
249
88
 
250
- /**
251
- * Handles when a key is press
252
- * @param keyboard - Keyboard Event
253
- */
254
- handleOnKeyPress(keyboard: KeyboardEvent) {
255
- if (!('charCode' in keyboard)) {
256
- Logger.Warning(
257
- Logger.GetStackTrace(),
258
- 'KeyboardEvent.charCode is deprecated in this browser, cannot send key press.'
259
- );
89
+ private handleOnKeyPress(keyboardEvent: KeyboardEvent) {
90
+ const keyCode = this.getKeycode(keyboardEvent);
91
+ if (!keyCode) {
260
92
  return;
261
93
  }
262
94
 
263
- const charCode = keyboard.charCode;
264
- Logger.Log(Logger.GetStackTrace(), `key press ${charCode}`, 6);
265
-
266
- const toStreamerHandlers =
267
- this.toStreamerMessagesProvider.toStreamerHandlers;
268
- toStreamerHandlers.get('KeyPress')([charCode]);
95
+ const toStreamerHandlers = this.streamMessageController.toStreamerHandlers;
96
+ toStreamerHandlers.get('KeyPress')([keyCode]);
269
97
  }
270
98
 
271
- /**
272
- * Handle whenever composition ends (eg chinese simplified)
273
- * @param compositionEvent - the composition event
274
- */
275
- handleOnCompositionEnd(compositionEvent: CompositionEvent) {
99
+ private handleOnCompositionEnd(compositionEvent: CompositionEvent) {
276
100
  if (compositionEvent.data && compositionEvent.data.length) {
277
101
  compositionEvent.data.split('').forEach((char) => {
278
- // This keydown, keypress, keyup flow is required to mimic the way characters are
102
+ // This keydown, keypress, keyup flow is required to mimic the way characters are
279
103
  // normally triggered
280
104
  this.handleOnKeyDown(
281
105
  new KeyboardEvent('keydown', {
@@ -304,17 +128,16 @@ export class KeyboardController {
304
128
  * @param keyboardEvent - Key board Event
305
129
  * @returns - the key code of the Key
306
130
  */
307
- getKeycode(keyboardEvent: KeyboardEvent) {
131
+ private getKeycode(keyboardEvent: KeyboardEvent) {
308
132
  // If we don't have keyCode property because browser API is deprecated then use KeyboardEvent.code instead.
309
133
  // See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#constants_for_keycode_value
310
134
  if (!('keyCode' in keyboardEvent)) {
311
135
  // Convert KeyboardEvent.code string into integer-based key code for backwards compatibility reasons.
312
136
  const event = keyboardEvent as KeyboardEvent;
313
- if (event.code in this.CodeToKeyCode) {
314
- return this.CodeToKeyCode[event.code];
137
+ if (event.code in CodeToKeyCode) {
138
+ return CodeToKeyCode[event.code];
315
139
  } else {
316
140
  Logger.Warning(
317
- Logger.GetStackTrace(),
318
141
  `Keyboard code of ${event.code} is not supported in our mapping, ignoring this key.`
319
142
  );
320
143
  return null;
@@ -323,20 +146,14 @@ export class KeyboardController {
323
146
 
324
147
  // If we made it here KeyboardEvent.keyCode is still supported so we can safely use it.
325
148
 
326
- if (
327
- keyboardEvent.keyCode === SpecialKeyCodes.shift &&
328
- keyboardEvent.code === 'ShiftRight'
329
- ) {
149
+ if (keyboardEvent.keyCode === SpecialKeyCodes.shift && keyboardEvent.code === 'ShiftRight') {
330
150
  return SpecialKeyCodes.rightShift;
331
151
  } else if (
332
152
  keyboardEvent.keyCode === SpecialKeyCodes.control &&
333
153
  keyboardEvent.code === 'ControlRight'
334
154
  ) {
335
155
  return SpecialKeyCodes.rightControl;
336
- } else if (
337
- keyboardEvent.keyCode === SpecialKeyCodes.alt &&
338
- keyboardEvent.code === 'AltRight'
339
- ) {
156
+ } else if (keyboardEvent.keyCode === SpecialKeyCodes.alt && keyboardEvent.code === 'AltRight') {
340
157
  return SpecialKeyCodes.rightAlt;
341
158
  } else {
342
159
  return keyboardEvent.keyCode;
@@ -347,7 +164,7 @@ export class KeyboardController {
347
164
  * Browser keys do not have a charCode so we only need to test keyCode.
348
165
  * @param keyCode - the browser keycode number
349
166
  */
350
- isKeyCodeBrowserKey(keyCode: number) {
167
+ private isKeyCodeBrowserKey(keyCode: number) {
351
168
  // Function keys or tab key are considered "browser keys" that we may wish to suppress by preventing them being process by browser.
352
169
  return (keyCode >= 112 && keyCode <= 123) || keyCode === 9;
353
170
  }