@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
@@ -14,7 +14,6 @@ import { FreezeFrameController } from '../FreezeFrame/FreezeFrameController';
14
14
  import { AFKController } from '../AFK/AFKController';
15
15
  import { DataChannelController } from '../DataChannel/DataChannelController';
16
16
  import { PeerConnectionController } from '../PeerConnectionController/PeerConnectionController';
17
- import { KeyboardController } from '../Inputs/KeyboardController';
18
17
  import { AggregatedStats } from '../PeerConnectionController/AggregatedStats';
19
18
  import {
20
19
  Config,
@@ -24,29 +23,18 @@ import {
24
23
  OptionParameters,
25
24
  NumericParameters
26
25
  } from '../Config/Config';
27
- import {
28
- InitialSettings,
29
- } from '../DataChannel/InitialSettings';
26
+ import { InitialSettings } from '../DataChannel/InitialSettings';
30
27
  import { LatencyTestResults } from '../DataChannel/LatencyTestResults';
31
28
  import { FileTemplate, FileUtil } from '../Util/FileUtil';
32
29
  import { InputClassesFactory } from '../Inputs/InputClassesFactory';
33
30
  import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
34
- import {
35
- StreamMessageController,
36
- MessageDirection
37
- } from '../UeInstanceMessage/StreamMessageController';
31
+ import { StreamMessageController, MessageDirection } from '../UeInstanceMessage/StreamMessageController';
38
32
  import { ResponseController } from '../UeInstanceMessage/ResponseController';
39
33
  import { SendMessageController } from '../UeInstanceMessage/SendMessageController';
40
34
  import { ToStreamerMessagesController } from '../UeInstanceMessage/ToStreamerMessagesController';
41
- import { MouseController } from '../Inputs/MouseController';
42
- import { GamePadController } from '../Inputs/GamepadController';
43
35
  import { DataChannelSender } from '../DataChannel/DataChannelSender';
44
- import {
45
- CoordinateConverter,
46
- UnquantizedDenormalizedUnsignedCoord
47
- } from '../Util/CoordinateConverter';
36
+ import { InputCoordTranslator, UntranslatedCoordUnsigned } from '../Util/InputCoordTranslator';
48
37
  import { PixelStreaming } from '../PixelStreaming/PixelStreaming';
49
- import { ITouchController } from '../Inputs/ITouchController';
50
38
  import {
51
39
  DataChannelCloseEvent,
52
40
  DataChannelErrorEvent,
@@ -62,7 +50,11 @@ import {
62
50
  import {
63
51
  DataChannelLatencyTestRequest,
64
52
  DataChannelLatencyTestResponse
65
- } from "../DataChannel/DataChannelLatencyTestResults";
53
+ } from '../DataChannel/DataChannelLatencyTestResults';
54
+ import { IURLSearchParams } from '../Util/IURLSearchParams';
55
+ import { IInputController } from '../Inputs/IInputController';
56
+ import { GamepadController } from '../Inputs/GamepadController';
57
+
66
58
  /**
67
59
  * Entry point for the WebRTC Player
68
60
  */
@@ -85,17 +77,16 @@ export class WebRtcPlayerController {
85
77
  freezeFrameController: FreezeFrameController;
86
78
  shouldShowPlayOverlay = true;
87
79
  afkController: AFKController;
88
- videoElementParentClientRect: DOMRect;
89
80
  latencyStartTime: number;
90
81
  pixelStreaming: PixelStreaming;
91
82
  streamMessageController: StreamMessageController;
92
83
  sendMessageController: SendMessageController;
93
84
  toStreamerMessagesController: ToStreamerMessagesController;
94
- keyboardController: KeyboardController;
95
- mouseController: MouseController;
96
- touchController: ITouchController;
97
- gamePadController: GamePadController;
98
- coordinateConverter: CoordinateConverter;
85
+ keyboardController: IInputController;
86
+ mouseController: IInputController;
87
+ touchController: IInputController;
88
+ gamePadController: GamepadController;
89
+ coordinateConverter: InputCoordTranslator;
99
90
  isUsingSFU: boolean;
100
91
  isQualityController: boolean;
101
92
  statsTimerHandle: number;
@@ -104,9 +95,10 @@ export class WebRtcPlayerController {
104
95
  peerConfig: RTCConfiguration;
105
96
  videoAvgQp: number;
106
97
  locallyClosed: boolean;
107
- shouldReconnect: boolean;
108
- isReconnecting: boolean;
98
+ enableAutoReconnect: boolean;
99
+ forceReconnect: boolean;
109
100
  reconnectAttempt: number;
101
+ isReconnecting: boolean;
110
102
  disconnectMessage: string;
111
103
  subscribedStream: string;
112
104
  signallingUrlBuilder: () => string;
@@ -135,33 +127,22 @@ export class WebRtcPlayerController {
135
127
  this.onAfkTriggered.bind(this)
136
128
  );
137
129
  this.afkController.onAFKTimedOutCallback = () => {
138
- this.closeSignalingServer('You have been disconnected due to inactivity');
130
+ this.closeSignalingServer('You have been disconnected due to inactivity.', false);
139
131
  };
140
132
 
141
- this.freezeFrameController = new FreezeFrameController(
142
- this.pixelStreaming.videoElementParent
143
- );
133
+ this.freezeFrameController = new FreezeFrameController(this.pixelStreaming.videoElementParent);
144
134
 
145
- this.videoPlayer = new VideoPlayer(
146
- this.pixelStreaming.videoElementParent,
147
- this.config
148
- );
149
- this.videoPlayer.onVideoInitialized = () =>
150
- this.handleVideoInitialized();
135
+ this.videoPlayer = new VideoPlayer(this.pixelStreaming.videoElementParent, this.config);
136
+ this.videoPlayer.onVideoInitialized = () => this.handleVideoInitialized();
151
137
 
152
138
  // When in match viewport resolution mode, when the browser viewport is resized we send a resize command back to UE.
153
- this.videoPlayer.onMatchViewportResolutionCallback = (
154
- width: number,
155
- height: number
156
- ) => {
139
+ this.videoPlayer.onMatchViewportResolutionCallback = (width: number, height: number) => {
157
140
  const descriptor = {
158
141
  'Resolution.Width': width,
159
142
  'Resolution.Height': height
160
143
  };
161
144
 
162
- this.streamMessageController.toStreamerHandlers.get(
163
- 'Command'
164
- )([JSON.stringify(descriptor)]);
145
+ this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify(descriptor)]);
165
146
  };
166
147
 
167
148
  // Every time video player is resized in browser we need to reinitialize the mouse coordinate conversion and freeze frame sizing logic.
@@ -171,17 +152,13 @@ export class WebRtcPlayerController {
171
152
 
172
153
  this.streamController = new StreamController(this.videoPlayer);
173
154
 
174
- this.coordinateConverter = new CoordinateConverter(this.videoPlayer);
155
+ this.coordinateConverter = new InputCoordTranslator();
175
156
 
176
157
  this.sendrecvDataChannelController = new DataChannelController();
177
158
  this.recvDataChannelController = new DataChannelController();
178
- this.registerDataChannelEventEmitters(
179
- this.sendrecvDataChannelController
180
- );
159
+ this.registerDataChannelEventEmitters(this.sendrecvDataChannelController);
181
160
  this.registerDataChannelEventEmitters(this.recvDataChannelController);
182
- this.dataChannelSender = new DataChannelSender(
183
- this.sendrecvDataChannelController
184
- );
161
+ this.dataChannelSender = new DataChannelSender(this.sendrecvDataChannelController);
185
162
  this.dataChannelSender.resetAfkWarningTimerOnDataSend = () =>
186
163
  this.afkController.resetAfkWarningTimer();
187
164
 
@@ -217,30 +194,35 @@ export class WebRtcPlayerController {
217
194
  this.handleIceCandidate(iceCandidateMessage.candidate);
218
195
  });
219
196
  this.protocol.transport.addListener('open', () => {
220
- const BrowserSendsOffer = this.config.isFlagEnabled(Flags.BrowserSendOffer);
221
- if (!BrowserSendsOffer) {
222
- const message = MessageHelpers.createMessage(Messages.listStreamers);
223
- this.protocol.sendMessage(message);
224
- }
197
+ const message = MessageHelpers.createMessage(Messages.listStreamers);
198
+ this.protocol.sendMessage(message);
225
199
  this.reconnectAttempt = 0;
200
+ this.isReconnecting = false;
226
201
  });
227
202
  this.protocol.transport.addListener('error', () => {
228
203
  // dont really need to do anything here since the close event should follow.
229
- Logger.Error(Logger.GetStackTrace(), `Got a transport error.`);
204
+ Logger.Error(`Got a transport error.`);
230
205
  });
231
206
  this.protocol.transport.addListener('close', (event: CloseEvent) => {
232
207
  // when we refresh the page during a stream we get the going away code.
233
208
  // in that case we don't want to reconnect since we're navigating away.
234
209
  // https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code
235
- // lists all the codes.
210
+ // lists all the codes.
236
211
  const CODE_GOING_AWAY = 1001;
237
212
 
238
- const willTryReconnect = this.shouldReconnect
239
- && event.code != CODE_GOING_AWAY
240
- && this.config.getNumericSettingValue(NumericParameters.MaxReconnectAttempts) > 0
241
-
213
+ const maxReconnectAttempts = this.config.getNumericSettingValue(
214
+ NumericParameters.MaxReconnectAttempts
215
+ );
216
+ const attemptsLeft = this.reconnectAttempt < maxReconnectAttempts;
217
+ const reconnectEnabled =
218
+ this.forceReconnect || (this.enableAutoReconnect && maxReconnectAttempts > 0 && attemptsLeft);
219
+ const willTryReconnect = reconnectEnabled && event.code != CODE_GOING_AWAY;
220
+ const allowClickToReconnect = !willTryReconnect;
242
221
  const disconnectMessage = this.disconnectMessage ? this.disconnectMessage : event.reason;
243
- this.pixelStreaming._onDisconnect(disconnectMessage, !willTryReconnect && !this.isReconnecting);
222
+
223
+ this.forceReconnect = false;
224
+
225
+ this.pixelStreaming._onDisconnect(disconnectMessage, allowClickToReconnect);
244
226
 
245
227
  this.afkController.stopAfkWarningTimer();
246
228
 
@@ -261,9 +243,8 @@ export class WebRtcPlayerController {
261
243
  if (willTryReconnect) {
262
244
  // need a small delay here to prevent reconnect spamming
263
245
  setTimeout(() => {
264
- this.isReconnecting = true;
265
246
  this.reconnectAttempt++;
266
- this.tryReconnect(event.reason);
247
+ this.doReconnect(event.reason);
267
248
  }, 2000);
268
249
  }
269
250
  });
@@ -273,9 +254,7 @@ export class WebRtcPlayerController {
273
254
  this.dataChannelSender,
274
255
  this.streamMessageController
275
256
  );
276
- this.toStreamerMessagesController = new ToStreamerMessagesController(
277
- this.sendMessageController
278
- );
257
+ this.toStreamerMessagesController = new ToStreamerMessagesController(this.sendMessageController);
279
258
  this.registerMessageHandlers();
280
259
  this.streamMessageController.populateDefaultProtocol();
281
260
 
@@ -288,48 +267,31 @@ export class WebRtcPlayerController {
288
267
  this.isUsingSFU = false;
289
268
  this.isQualityController = false;
290
269
  this.preferredCodec = '';
291
- this.shouldReconnect = true;
292
- this.isReconnecting = false;
270
+ this.enableAutoReconnect = true;
271
+ this.forceReconnect = false;
293
272
  this.reconnectAttempt = 0;
273
+ this.isReconnecting = false;
294
274
 
295
- this.config._addOnOptionSettingChangedListener(
296
- OptionParameters.StreamerId,
297
- (streamerid) => {
298
- if (streamerid === "") {
299
- return;
300
- }
301
-
302
- // close the current peer connection and create a new one
303
- this.peerConnectionController.peerConnection.close();
304
- this.peerConnectionController.createPeerConnection(
305
- this.peerConfig,
306
- this.preferredCodec
307
- );
308
- this.subscribedStream = streamerid;
309
- const message = MessageHelpers.createMessage(Messages.subscribe, { streamerId: streamerid });
310
- this.protocol.sendMessage(message);
275
+ this.config._addOnOptionSettingChangedListener(OptionParameters.StreamerId, (streamerid) => {
276
+ if (streamerid === '') {
277
+ return;
311
278
  }
312
- );
279
+
280
+ // close the current peer connection and create a new one
281
+ this.peerConnectionController.peerConnection.close();
282
+ this.peerConnectionController.createPeerConnection(this.peerConfig, this.preferredCodec);
283
+ this.subscribedStream = streamerid;
284
+ const message = MessageHelpers.createMessage(Messages.subscribe, { streamerId: streamerid });
285
+ this.protocol.sendMessage(message);
286
+ });
313
287
 
314
288
  this.setVideoEncoderAvgQP(-1);
315
289
 
316
290
  this.signallingUrlBuilder = () => {
317
- let signallingServerUrl = this.config.getTextSettingValue(
318
- TextParameters.SignallingServerUrl
319
- );
320
-
321
- // If we are connecting to the SFU add a special url parameter to the url
322
- if (this.config.isFlagEnabled(Flags.BrowserSendOffer)) {
323
- signallingServerUrl += '?' + Flags.BrowserSendOffer + '=true';
324
- }
325
-
326
- // This code is no longer needed, but is a good example for how subsequent config flags can be appended
327
- // if (this.config.isFlagEnabled(Flags.BrowserSendOffer)) {
328
- // signallingServerUrl += (signallingServerUrl.includes('?') ? '&' : '?') + Flags.BrowserSendOffer + '=true';
329
- // }
291
+ const signallingServerUrl = this.config.getTextSettingValue(TextParameters.SignallingServerUrl);
330
292
 
331
293
  return signallingServerUrl;
332
- }
294
+ };
333
295
  }
334
296
 
335
297
  /**
@@ -337,11 +299,8 @@ export class WebRtcPlayerController {
337
299
  * @param x x axis coordinate
338
300
  * @param y y axis coordinate
339
301
  */
340
- requestUnquantizedAndDenormalizeUnsigned(
341
- x: number,
342
- y: number
343
- ): UnquantizedDenormalizedUnsignedCoord {
344
- return this.coordinateConverter.unquantizeAndDenormalizeUnsigned(x, y);
302
+ requestUnquantizedAndDenormalizeUnsigned(x: number, y: number): UntranslatedCoordUnsigned {
303
+ return this.coordinateConverter.untranslateUnsigned(x, y);
345
304
  }
346
305
 
347
306
  /**
@@ -350,16 +309,11 @@ export class WebRtcPlayerController {
350
309
  */
351
310
  handleOnMessage(event: MessageEvent) {
352
311
  const message = new Uint8Array(event.data);
353
- Logger.Log(Logger.GetStackTrace(), 'Message incoming:' + message, 6);
312
+ Logger.Info('Message incoming:' + message);
354
313
 
355
314
  //try {
356
- const messageType =
357
- this.streamMessageController.fromStreamerMessages.get(
358
- message[0]
359
- );
360
- this.streamMessageController.fromStreamerHandlers.get(messageType)(
361
- event.data
362
- );
315
+ const messageType = this.streamMessageController.fromStreamerMessages.get(message[0]);
316
+ this.streamMessageController.fromStreamerHandlers.get(messageType)(event.data);
363
317
  //} catch (e) {
364
318
  //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]}`);
365
319
  //}
@@ -412,7 +366,7 @@ export class WebRtcPlayerController {
412
366
  MessageDirection.FromStreamer,
413
367
  'DataChannelLatencyTest',
414
368
  (data: ArrayBuffer) => this.handleDataChannelLatencyTestResponse(data)
415
- )
369
+ );
416
370
  this.streamMessageController.registerMessageHandler(
417
371
  MessageDirection.FromStreamer,
418
372
  'InitialSettings',
@@ -433,13 +387,9 @@ export class WebRtcPlayerController {
433
387
  'FileContents',
434
388
  (data: ArrayBuffer) => this.onFileContents(data)
435
389
  );
436
- this.streamMessageController.registerMessageHandler(
437
- MessageDirection.FromStreamer,
438
- 'TestEcho',
439
- () => {
440
- /* Do nothing */
441
- }
442
- );
390
+ this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'TestEcho', () => {
391
+ /* Do nothing */
392
+ });
443
393
  this.streamMessageController.registerMessageHandler(
444
394
  MessageDirection.FromStreamer,
445
395
  'InputControlOwnership',
@@ -460,333 +410,222 @@ export class WebRtcPlayerController {
460
410
  this.streamMessageController.registerMessageHandler(
461
411
  MessageDirection.ToStreamer,
462
412
  'IFrameRequest',
463
- () =>
464
- this.sendMessageController.sendMessageToStreamer(
465
- 'IFrameRequest'
466
- )
413
+ () => this.sendMessageController.sendMessageToStreamer('IFrameRequest')
467
414
  );
468
415
  this.streamMessageController.registerMessageHandler(
469
416
  MessageDirection.ToStreamer,
470
417
  'RequestQualityControl',
471
- () =>
472
- this.sendMessageController.sendMessageToStreamer(
473
- 'RequestQualityControl'
474
- )
418
+ () => this.sendMessageController.sendMessageToStreamer('RequestQualityControl')
475
419
  );
476
- this.streamMessageController.registerMessageHandler(
477
- MessageDirection.ToStreamer,
478
- 'FpsRequest',
479
- () => this.sendMessageController.sendMessageToStreamer('FpsRequest')
420
+ this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'FpsRequest', () =>
421
+ this.sendMessageController.sendMessageToStreamer('FpsRequest')
480
422
  );
481
423
  this.streamMessageController.registerMessageHandler(
482
424
  MessageDirection.ToStreamer,
483
425
  'AverageBitrateRequest',
484
- () =>
485
- this.sendMessageController.sendMessageToStreamer(
486
- 'AverageBitrateRequest'
487
- )
426
+ () => this.sendMessageController.sendMessageToStreamer('AverageBitrateRequest')
488
427
  );
489
428
  this.streamMessageController.registerMessageHandler(
490
429
  MessageDirection.ToStreamer,
491
430
  'StartStreaming',
492
- () =>
493
- this.sendMessageController.sendMessageToStreamer(
494
- 'StartStreaming'
495
- )
431
+ () => this.sendMessageController.sendMessageToStreamer('StartStreaming')
496
432
  );
497
433
  this.streamMessageController.registerMessageHandler(
498
434
  MessageDirection.ToStreamer,
499
435
  'StopStreaming',
500
- () =>
501
- this.sendMessageController.sendMessageToStreamer(
502
- 'StopStreaming'
503
- )
436
+ () => this.sendMessageController.sendMessageToStreamer('StopStreaming')
504
437
  );
505
438
  this.streamMessageController.registerMessageHandler(
506
439
  MessageDirection.ToStreamer,
507
440
  'LatencyTest',
508
441
  (data: Array<number | string>) =>
509
- this.sendMessageController.sendMessageToStreamer(
510
- 'LatencyTest', data
511
- )
442
+ this.sendMessageController.sendMessageToStreamer('LatencyTest', data)
512
443
  );
513
444
  this.streamMessageController.registerMessageHandler(
514
445
  MessageDirection.ToStreamer,
515
446
  'RequestInitialSettings',
516
- () =>
517
- this.sendMessageController.sendMessageToStreamer(
518
- 'RequestInitialSettings'
519
- )
520
- );
521
- this.streamMessageController.registerMessageHandler(
522
- MessageDirection.ToStreamer,
523
- 'TestEcho',
524
- () => {
525
- /* Do nothing */
526
- }
447
+ () => this.sendMessageController.sendMessageToStreamer('RequestInitialSettings')
527
448
  );
449
+ this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TestEcho', () => {
450
+ /* Do nothing */
451
+ });
528
452
  this.streamMessageController.registerMessageHandler(
529
453
  MessageDirection.ToStreamer,
530
454
  'UIInteraction',
531
455
  (data: Array<number | string>) =>
532
- this.sendMessageController.sendMessageToStreamer(
533
- 'UIInteraction', data
534
- )
456
+ this.sendMessageController.sendMessageToStreamer('UIInteraction', data)
535
457
  );
536
458
  this.streamMessageController.registerMessageHandler(
537
459
  MessageDirection.ToStreamer,
538
460
  'Command',
539
461
  (data: Array<number | string>) =>
540
- this.sendMessageController.sendMessageToStreamer(
541
- 'Command', data
542
- )
462
+ this.sendMessageController.sendMessageToStreamer('Command', data)
543
463
  );
544
464
  this.streamMessageController.registerMessageHandler(
545
465
  MessageDirection.ToStreamer,
546
466
  'TextboxEntry',
547
467
  (data: Array<number | string>) =>
548
- this.sendMessageController.sendMessageToStreamer(
549
- 'TextboxEntry', data
550
- )
468
+ this.sendMessageController.sendMessageToStreamer('TextboxEntry', data)
551
469
  );
552
470
  this.streamMessageController.registerMessageHandler(
553
471
  MessageDirection.ToStreamer,
554
472
  'KeyDown',
555
473
  (data: Array<number | string>) =>
556
- this.sendMessageController.sendMessageToStreamer(
557
- 'KeyDown',
558
- data
559
- )
474
+ this.sendMessageController.sendMessageToStreamer('KeyDown', data)
560
475
  );
561
476
  this.streamMessageController.registerMessageHandler(
562
477
  MessageDirection.ToStreamer,
563
478
  'KeyUp',
564
- (data: Array<number | string>) =>
565
- this.sendMessageController.sendMessageToStreamer('KeyUp', data)
479
+ (data: Array<number | string>) => this.sendMessageController.sendMessageToStreamer('KeyUp', data)
566
480
  );
567
481
  this.streamMessageController.registerMessageHandler(
568
482
  MessageDirection.ToStreamer,
569
483
  'KeyPress',
570
484
  (data: Array<number | string>) =>
571
- this.sendMessageController.sendMessageToStreamer(
572
- 'KeyPress',
573
- data
574
- )
485
+ this.sendMessageController.sendMessageToStreamer('KeyPress', data)
575
486
  );
576
487
  this.streamMessageController.registerMessageHandler(
577
488
  MessageDirection.ToStreamer,
578
489
  'MouseEnter',
579
490
  (data: Array<number | string>) =>
580
- this.sendMessageController.sendMessageToStreamer(
581
- 'MouseEnter',
582
- data
583
- )
491
+ this.sendMessageController.sendMessageToStreamer('MouseEnter', data)
584
492
  );
585
493
  this.streamMessageController.registerMessageHandler(
586
494
  MessageDirection.ToStreamer,
587
495
  'MouseLeave',
588
496
  (data: Array<number | string>) =>
589
- this.sendMessageController.sendMessageToStreamer(
590
- 'MouseLeave',
591
- data
592
- )
497
+ this.sendMessageController.sendMessageToStreamer('MouseLeave', data)
593
498
  );
594
499
  this.streamMessageController.registerMessageHandler(
595
500
  MessageDirection.ToStreamer,
596
501
  'MouseDown',
597
502
  (data: Array<number | string>) =>
598
- this.sendMessageController.sendMessageToStreamer(
599
- 'MouseDown',
600
- data
601
- )
503
+ this.sendMessageController.sendMessageToStreamer('MouseDown', data)
602
504
  );
603
505
  this.streamMessageController.registerMessageHandler(
604
506
  MessageDirection.ToStreamer,
605
507
  'MouseUp',
606
508
  (data: Array<number | string>) =>
607
- this.sendMessageController.sendMessageToStreamer(
608
- 'MouseUp',
609
- data
610
- )
509
+ this.sendMessageController.sendMessageToStreamer('MouseUp', data)
611
510
  );
612
511
  this.streamMessageController.registerMessageHandler(
613
512
  MessageDirection.ToStreamer,
614
513
  'MouseMove',
615
514
  (data: Array<number | string>) =>
616
- this.sendMessageController.sendMessageToStreamer(
617
- 'MouseMove',
618
- data
619
- )
515
+ this.sendMessageController.sendMessageToStreamer('MouseMove', data)
620
516
  );
621
517
  this.streamMessageController.registerMessageHandler(
622
518
  MessageDirection.ToStreamer,
623
519
  'MouseWheel',
624
520
  (data: Array<number | string>) =>
625
- this.sendMessageController.sendMessageToStreamer(
626
- 'MouseWheel',
627
- data
628
- )
521
+ this.sendMessageController.sendMessageToStreamer('MouseWheel', data)
629
522
  );
630
523
  this.streamMessageController.registerMessageHandler(
631
524
  MessageDirection.ToStreamer,
632
525
  'MouseDouble',
633
526
  (data: Array<number | string>) =>
634
- this.sendMessageController.sendMessageToStreamer(
635
- 'MouseDouble',
636
- data
637
- )
527
+ this.sendMessageController.sendMessageToStreamer('MouseDouble', data)
638
528
  );
639
529
  this.streamMessageController.registerMessageHandler(
640
530
  MessageDirection.ToStreamer,
641
531
  'TouchStart',
642
532
  (data: Array<number | string>) =>
643
- this.sendMessageController.sendMessageToStreamer(
644
- 'TouchStart',
645
- data
646
- )
533
+ this.sendMessageController.sendMessageToStreamer('TouchStart', data)
647
534
  );
648
535
  this.streamMessageController.registerMessageHandler(
649
536
  MessageDirection.ToStreamer,
650
537
  'TouchEnd',
651
538
  (data: Array<number | string>) =>
652
- this.sendMessageController.sendMessageToStreamer(
653
- 'TouchEnd',
654
- data
655
- )
539
+ this.sendMessageController.sendMessageToStreamer('TouchEnd', data)
656
540
  );
657
541
  this.streamMessageController.registerMessageHandler(
658
542
  MessageDirection.ToStreamer,
659
543
  'TouchMove',
660
544
  (data: Array<number | string>) =>
661
- this.sendMessageController.sendMessageToStreamer(
662
- 'TouchMove',
663
- data
664
- )
545
+ this.sendMessageController.sendMessageToStreamer('TouchMove', data)
665
546
  );
666
547
  this.streamMessageController.registerMessageHandler(
667
548
  MessageDirection.ToStreamer,
668
549
  'GamepadConnected',
669
- () =>
670
- this.sendMessageController.sendMessageToStreamer(
671
- 'GamepadConnected'
672
- )
550
+ () => this.sendMessageController.sendMessageToStreamer('GamepadConnected')
673
551
  );
674
552
  this.streamMessageController.registerMessageHandler(
675
553
  MessageDirection.ToStreamer,
676
554
  'GamepadButtonPressed',
677
555
  (data: Array<number | string>) =>
678
- this.sendMessageController.sendMessageToStreamer(
679
- 'GamepadButtonPressed',
680
- data
681
- )
556
+ this.sendMessageController.sendMessageToStreamer('GamepadButtonPressed', data)
682
557
  );
683
558
  this.streamMessageController.registerMessageHandler(
684
559
  MessageDirection.ToStreamer,
685
560
  'GamepadButtonReleased',
686
561
  (data: Array<number | string>) =>
687
- this.sendMessageController.sendMessageToStreamer(
688
- 'GamepadButtonReleased',
689
- data
690
- )
562
+ this.sendMessageController.sendMessageToStreamer('GamepadButtonReleased', data)
691
563
  );
692
564
  this.streamMessageController.registerMessageHandler(
693
565
  MessageDirection.ToStreamer,
694
566
  'GamepadAnalog',
695
567
  (data: Array<number | string>) =>
696
- this.sendMessageController.sendMessageToStreamer(
697
- 'GamepadAnalog',
698
- data
699
- )
568
+ this.sendMessageController.sendMessageToStreamer('GamepadAnalog', data)
700
569
  );
701
570
  this.streamMessageController.registerMessageHandler(
702
571
  MessageDirection.ToStreamer,
703
572
  'GamepadDisconnected',
704
573
  (data: Array<number | string>) =>
705
- this.sendMessageController.sendMessageToStreamer(
706
- 'GamepadDisconnected',
707
- data
708
- )
574
+ this.sendMessageController.sendMessageToStreamer('GamepadDisconnected', data)
709
575
  );
710
576
  this.streamMessageController.registerMessageHandler(
711
577
  MessageDirection.ToStreamer,
712
578
  'XREyeViews',
713
579
  (data: Array<number | string>) =>
714
- this.sendMessageController.sendMessageToStreamer(
715
- 'XREyeViews',
716
- data
717
- )
580
+ this.sendMessageController.sendMessageToStreamer('XREyeViews', data)
718
581
  );
719
582
  this.streamMessageController.registerMessageHandler(
720
583
  MessageDirection.ToStreamer,
721
584
  'XRHMDTransform',
722
585
  (data: Array<number | string>) =>
723
- this.sendMessageController.sendMessageToStreamer(
724
- 'XRHMDTransform',
725
- data
726
- )
586
+ this.sendMessageController.sendMessageToStreamer('XRHMDTransform', data)
727
587
  );
728
588
  this.streamMessageController.registerMessageHandler(
729
589
  MessageDirection.ToStreamer,
730
590
  'XRControllerTransform',
731
591
  (data: Array<number | string>) =>
732
- this.sendMessageController.sendMessageToStreamer(
733
- 'XRControllerTransform',
734
- data
735
- )
592
+ this.sendMessageController.sendMessageToStreamer('XRControllerTransform', data)
736
593
  );
737
594
  this.streamMessageController.registerMessageHandler(
738
595
  MessageDirection.ToStreamer,
739
596
  'XRSystem',
740
597
  (data: Array<number | string>) =>
741
- this.sendMessageController.sendMessageToStreamer(
742
- 'XRSystem',
743
- data
744
- )
598
+ this.sendMessageController.sendMessageToStreamer('XRSystem', data)
745
599
  );
746
600
  this.streamMessageController.registerMessageHandler(
747
601
  MessageDirection.ToStreamer,
748
602
  'XRButtonTouched',
749
603
  (data: Array<number | string>) =>
750
- this.sendMessageController.sendMessageToStreamer(
751
- 'XRButtonTouched',
752
- data
753
- )
604
+ this.sendMessageController.sendMessageToStreamer('XRButtonTouched', data)
754
605
  );
755
606
  this.streamMessageController.registerMessageHandler(
756
607
  MessageDirection.ToStreamer,
757
608
  'XRButtonTouchReleased',
758
609
  (data: Array<number | string>) =>
759
- this.sendMessageController.sendMessageToStreamer(
760
- 'XRButtonTouchReleased',
761
- data
762
- )
610
+ this.sendMessageController.sendMessageToStreamer('XRButtonTouchReleased', data)
763
611
  );
764
612
  this.streamMessageController.registerMessageHandler(
765
613
  MessageDirection.ToStreamer,
766
614
  'XRButtonPressed',
767
615
  (data: Array<number | string>) =>
768
- this.sendMessageController.sendMessageToStreamer(
769
- 'XRButtonPressed',
770
- data
771
- )
616
+ this.sendMessageController.sendMessageToStreamer('XRButtonPressed', data)
772
617
  );
773
618
  this.streamMessageController.registerMessageHandler(
774
619
  MessageDirection.ToStreamer,
775
620
  'XRButtonReleased',
776
621
  (data: Array<number | string>) =>
777
- this.sendMessageController.sendMessageToStreamer(
778
- 'XRButtonReleased',
779
- data
780
- )
622
+ this.sendMessageController.sendMessageToStreamer('XRButtonReleased', data)
781
623
  );
782
624
  this.streamMessageController.registerMessageHandler(
783
625
  MessageDirection.ToStreamer,
784
626
  'XRAnalog',
785
627
  (data: Array<number | string>) =>
786
- this.sendMessageController.sendMessageToStreamer(
787
- 'XRAnalog',
788
- data
789
- )
628
+ this.sendMessageController.sendMessageToStreamer('XRAnalog', data)
790
629
  );
791
630
  }
792
631
 
@@ -795,20 +634,10 @@ export class WebRtcPlayerController {
795
634
  * @param message
796
635
  */
797
636
  onCommand(message: ArrayBuffer) {
798
- Logger.Log(
799
- Logger.GetStackTrace(),
800
- 'DataChannelReceiveMessageType.Command',
801
- 6
802
- );
803
- const commandAsString = new TextDecoder('utf-16').decode(
804
- message.slice(1)
805
- );
637
+ Logger.Info('DataChannelReceiveMessageType.Command');
638
+ const commandAsString = new TextDecoder('utf-16').decode(message.slice(1));
806
639
 
807
- Logger.Log(
808
- Logger.GetStackTrace(),
809
- 'Data Channel Command: ' + commandAsString,
810
- 6
811
- );
640
+ Logger.Info('Data Channel Command: ' + commandAsString);
812
641
  const command = JSON.parse(commandAsString);
813
642
  if (command.command === 'onScreenKeyboard') {
814
643
  this.pixelStreaming._activateOnScreenKeyboard(command);
@@ -821,25 +650,16 @@ export class WebRtcPlayerController {
821
650
  */
822
651
  onProtocolMessage(message: ArrayBuffer) {
823
652
  try {
824
- const protocolString = new TextDecoder('utf-16').decode(
825
- message.slice(1)
826
- );
653
+ const protocolString = new TextDecoder('utf-16').decode(message.slice(1));
827
654
  const protocolJSON = JSON.parse(protocolString);
828
- if (
829
- !Object.prototype.hasOwnProperty.call(protocolJSON, 'Direction')
830
- ) {
831
- Logger.Error(
832
- Logger.GetStackTrace(),
833
- 'Malformed protocol received. Ensure the protocol message contains a direction'
834
- );
655
+ if (!Object.prototype.hasOwnProperty.call(protocolJSON, 'Direction')) {
656
+ Logger.Error('Malformed protocol received. Ensure the protocol message contains a direction');
835
657
  }
836
658
  const direction = protocolJSON.Direction;
837
659
  delete protocolJSON.Direction;
838
- Logger.Log(
839
- Logger.GetStackTrace(),
840
- `Received new ${direction == MessageDirection.FromStreamer
841
- ? 'FromStreamer'
842
- : 'ToStreamer'
660
+ Logger.Info(
661
+ `Received new ${
662
+ direction == MessageDirection.FromStreamer ? 'FromStreamer' : 'ToStreamer'
843
663
  } protocol. Updating existing protocol...`
844
664
  );
845
665
  Object.keys(protocolJSON).forEach((messageType) => {
@@ -847,82 +667,54 @@ export class WebRtcPlayerController {
847
667
  switch (direction) {
848
668
  case MessageDirection.ToStreamer:
849
669
  // Check that the message contains all the relevant params
850
- if (
851
- !Object.prototype.hasOwnProperty.call(
852
- message,
853
- 'id'
854
- )
855
- ) {
670
+ if (!Object.prototype.hasOwnProperty.call(message, 'id')) {
856
671
  Logger.Error(
857
- Logger.GetStackTrace(),
858
672
  `ToStreamer->${messageType} protocol definition was malformed as it didn't contain at least an id\n
859
- Definition was: ${JSON.stringify(
860
- message,
861
- null,
862
- 2
863
- )}`
673
+ Definition was: ${JSON.stringify(message, null, 2)}`
864
674
  );
865
675
  // return in a forEach is equivalent to a continue in a normal for loop
866
676
  return;
867
677
  }
868
678
 
869
679
  // 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
870
- if ((messageType === "UIInteraction" || messageType === "Command" || messageType === "LatencyTest")) {
680
+ if (
681
+ messageType === 'UIInteraction' ||
682
+ messageType === 'Command' ||
683
+ messageType === 'LatencyTest'
684
+ ) {
871
685
  return;
872
686
  }
873
687
 
874
- if (
875
- this.streamMessageController.toStreamerHandlers.get(
876
- messageType
877
- )
878
- ) {
688
+ if (this.streamMessageController.toStreamerHandlers.get(messageType)) {
879
689
  // If we've registered a handler for this message type we can add it to our supported messages. ie registerMessageHandler(...)
880
- this.streamMessageController.toStreamerMessages.set(
881
- messageType,
882
- message
883
- );
690
+ this.streamMessageController.toStreamerMessages.set(messageType, message);
884
691
  } else {
885
692
  Logger.Error(
886
- Logger.GetStackTrace(),
887
693
  `There was no registered handler for "${messageType}" - try adding one using registerMessageHandler(MessageDirection.ToStreamer, "${messageType}", myHandler)`
888
694
  );
889
695
  }
890
696
  break;
891
697
  case MessageDirection.FromStreamer:
892
698
  // Check that the message contains all the relevant params
893
- if (
894
- !Object.prototype.hasOwnProperty.call(message, 'id')
895
- ) {
699
+ if (!Object.prototype.hasOwnProperty.call(message, 'id')) {
896
700
  Logger.Error(
897
- Logger.GetStackTrace(),
898
701
  `FromStreamer->${messageType} protocol definition was malformed as it didn't contain at least an id\n
899
702
  Definition was: ${JSON.stringify(message, null, 2)}`
900
703
  );
901
704
  // return in a forEach is equivalent to a continue in a normal for loop
902
705
  return;
903
706
  }
904
- if (
905
- this.streamMessageController.fromStreamerHandlers.get(
906
- messageType
907
- )
908
- ) {
707
+ if (this.streamMessageController.fromStreamerHandlers.get(messageType)) {
909
708
  // If we've registered a handler for this message type. ie registerMessageHandler(...)
910
- this.streamMessageController.fromStreamerMessages.set(
911
- message.id,
912
- messageType
913
- );
709
+ this.streamMessageController.fromStreamerMessages.set(message.id, messageType);
914
710
  } else {
915
711
  Logger.Error(
916
- Logger.GetStackTrace(),
917
712
  `There was no registered handler for "${message}" - try adding one using registerMessageHandler(MessageDirection.FromStreamer, "${messageType}", myHandler)`
918
713
  );
919
714
  }
920
715
  break;
921
716
  default:
922
- Logger.Error(
923
- Logger.GetStackTrace(),
924
- `Unknown direction: ${direction}`
925
- );
717
+ Logger.Error(`Unknown direction: ${direction}`);
926
718
  }
927
719
  });
928
720
 
@@ -930,7 +722,7 @@ export class WebRtcPlayerController {
930
722
  this.toStreamerMessagesController.SendRequestInitialSettings();
931
723
  this.toStreamerMessagesController.SendRequestQualityControl();
932
724
  } catch (e) {
933
- Logger.Log(Logger.GetStackTrace(), e);
725
+ Logger.Info(e);
934
726
  }
935
727
  }
936
728
 
@@ -940,22 +732,17 @@ export class WebRtcPlayerController {
940
732
  */
941
733
  onInputControlOwnership(message: ArrayBuffer) {
942
734
  const view = new Uint8Array(message);
943
- Logger.Log(
944
- Logger.GetStackTrace(),
945
- 'DataChannelReceiveMessageType.InputControlOwnership',
946
- 6
947
- );
735
+ Logger.Info('DataChannelReceiveMessageType.InputControlOwnership');
948
736
  const inputControlOwnership = new Boolean(view[1]).valueOf();
949
- Logger.Log(
950
- Logger.GetStackTrace(),
737
+ Logger.Info(
951
738
  `Received input controller message - will your input control the stream: ${inputControlOwnership}`
952
739
  );
953
740
  this.pixelStreaming._onInputControlOwnership(inputControlOwnership);
954
741
  }
955
742
 
956
743
  /**
957
- *
958
- * @param message
744
+ *
745
+ * @param message
959
746
  */
960
747
  onGamepadResponse(message: ArrayBuffer) {
961
748
  const responseString = new TextDecoder('utf-16').decode(message.slice(1));
@@ -985,25 +772,31 @@ export class WebRtcPlayerController {
985
772
  }
986
773
 
987
774
  /**
988
- * Attempt a reconnection to the signalling server
775
+ * Attempt a reconnection to the signalling server. Manual trigger
989
776
  */
990
777
  tryReconnect(message: string) {
778
+ this.forceReconnect = true;
779
+ this.doReconnect(message);
780
+ }
781
+
782
+ /**
783
+ * Does the actual reconnect work. Used by the auto reconnect feature to skip the manual flag.
784
+ */
785
+ doReconnect(message: string) {
991
786
  // if there is no webSocketController return immediately or this will not work
992
787
  if (!this.protocol) {
993
- Logger.Log(
994
- Logger.GetStackTrace(),
995
- 'This player has no protocol connection.'
996
- );
788
+ Logger.Info('This player has no protocol connection.');
997
789
  return;
998
790
  }
999
791
 
1000
- // if the connection is open, first close it. wait some time and try again.
1001
792
  this.isReconnecting = true;
793
+
794
+ // if the connection is open, first close it and force a reconnect.
1002
795
  if (this.protocol.isConnected()) {
1003
- this.closeSignalingServer(`${message} Restarting stream...`);
1004
- setTimeout(() => {
1005
- this.tryReconnect(message);
1006
- }, 3000);
796
+ if (!this.forceReconnect) {
797
+ message = `${message} Reconnecting.`;
798
+ }
799
+ this.closeSignalingServer(message, true);
1007
800
  } else {
1008
801
  this.pixelStreaming._onWebRtcAutoConnect();
1009
802
  this.connectToSignallingServer();
@@ -1022,10 +815,10 @@ export class WebRtcPlayerController {
1022
815
  })
1023
816
  );
1024
817
  if (this.shouldShowPlayOverlay === true) {
1025
- Logger.Log(Logger.GetStackTrace(), 'showing play overlay');
818
+ Logger.Info('showing play overlay');
1026
819
  this.resizePlayerStyle();
1027
820
  } else {
1028
- Logger.Log(Logger.GetStackTrace(), 'showing freeze frame');
821
+ Logger.Info('showing freeze frame');
1029
822
  this.freezeFrameController.showFreezeFrame();
1030
823
  }
1031
824
  setTimeout(() => {
@@ -1038,11 +831,7 @@ export class WebRtcPlayerController {
1038
831
  * @param message The freeze frame data in bytes
1039
832
  */
1040
833
  onFreezeFrameMessage(message: ArrayBuffer) {
1041
- Logger.Log(
1042
- Logger.GetStackTrace(),
1043
- 'DataChannelReceiveMessageType.FreezeFrame',
1044
- 6
1045
- );
834
+ Logger.Info('DataChannelReceiveMessageType.FreezeFrame');
1046
835
  const view = new Uint8Array(message);
1047
836
  this.freezeFrameController.processFreezeFrameMessage(view, () =>
1048
837
  this.loadFreezeFrameOrShowPlayOverlay()
@@ -1053,15 +842,9 @@ export class WebRtcPlayerController {
1053
842
  * Enable the video after hiding a freeze frame
1054
843
  */
1055
844
  invalidateFreezeFrameAndEnableVideo() {
1056
- Logger.Log(
1057
- Logger.GetStackTrace(),
1058
- 'DataChannelReceiveMessageType.FreezeFrame',
1059
- 6
1060
- );
845
+ Logger.Info('DataChannelReceiveMessageType.FreezeFrame');
1061
846
  setTimeout(() => {
1062
- this.pixelStreaming.dispatchEvent(
1063
- new HideFreezeFrameEvent()
1064
- );
847
+ this.pixelStreaming.dispatchEvent(new HideFreezeFrameEvent());
1065
848
  this.freezeFrameController.hideFreezeFrame();
1066
849
  }, this.freezeFrameController.freezeFrameDelay);
1067
850
  if (this.videoPlayer.getVideoElement()) {
@@ -1103,21 +886,16 @@ export class WebRtcPlayerController {
1103
886
  if (!this.videoPlayer.getVideoElement()) {
1104
887
  const message =
1105
888
  'Could not play video stream because the video player was not initialized correctly.';
1106
- this.pixelStreaming.dispatchEvent(
1107
- new PlayStreamErrorEvent({ message })
1108
- );
1109
- Logger.Error(Logger.GetStackTrace(), message);
889
+ this.pixelStreaming.dispatchEvent(new PlayStreamErrorEvent({ message }));
890
+ Logger.Error(message);
1110
891
 
1111
892
  // close the connection
1112
- this.closeSignalingServer('Stream not initialized correctly');
893
+ this.closeSignalingServer('Stream not initialized correctly', false);
1113
894
  return;
1114
895
  }
1115
896
 
1116
897
  if (!this.videoPlayer.hasVideoSource()) {
1117
- Logger.Warning(
1118
- Logger.GetStackTrace(),
1119
- 'Cannot play stream, the video element has no srcObject to play.'
1120
- );
898
+ Logger.Warning('Cannot play stream, the video element has no srcObject to play.');
1121
899
  return;
1122
900
  }
1123
901
 
@@ -1125,7 +903,7 @@ export class WebRtcPlayerController {
1125
903
  this.pixelStreaming.dispatchEvent(new PlayStreamEvent());
1126
904
 
1127
905
  if (this.streamController.audioElement.srcObject) {
1128
- const startMuted = this.config.isFlagEnabled(Flags.StartVideoMuted)
906
+ const startMuted = this.config.isFlagEnabled(Flags.StartVideoMuted);
1129
907
  this.streamController.audioElement.muted = startMuted;
1130
908
 
1131
909
  if (startMuted) {
@@ -1137,9 +915,8 @@ export class WebRtcPlayerController {
1137
915
  this.playVideo();
1138
916
  })
1139
917
  .catch((onRejectedReason) => {
1140
- Logger.Log(Logger.GetStackTrace(), onRejectedReason);
1141
- Logger.Log(
1142
- Logger.GetStackTrace(),
918
+ Logger.Info(onRejectedReason);
919
+ Logger.Info(
1143
920
  'Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay.'
1144
921
  );
1145
922
  this.pixelStreaming.dispatchEvent(
@@ -1166,14 +943,11 @@ export class WebRtcPlayerController {
1166
943
  if (this.streamController.audioElement.srcObject) {
1167
944
  this.streamController.audioElement.pause();
1168
945
  }
1169
- Logger.Log(Logger.GetStackTrace(), onRejectedReason);
1170
- Logger.Log(
1171
- Logger.GetStackTrace(),
946
+ Logger.Info(onRejectedReason);
947
+ Logger.Info(
1172
948
  'Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay.'
1173
949
  );
1174
- this.pixelStreaming.dispatchEvent(
1175
- new PlayStreamRejectedEvent({ reason: onRejectedReason })
1176
- );
950
+ this.pixelStreaming.dispatchEvent(new PlayStreamRejectedEvent({ reason: onRejectedReason }));
1177
951
  });
1178
952
  }
1179
953
 
@@ -1193,7 +967,7 @@ export class WebRtcPlayerController {
1193
967
  */
1194
968
  connectToSignallingServer() {
1195
969
  this.locallyClosed = false;
1196
- this.shouldReconnect = true;
970
+ this.enableAutoReconnect = true;
1197
971
  this.disconnectMessage = null;
1198
972
  const signallingUrl = this.signallingUrlBuilder();
1199
973
  this.protocol.connect(signallingUrl);
@@ -1214,10 +988,12 @@ export class WebRtcPlayerController {
1214
988
  // close and error if turn is forced and there is no turn server
1215
989
  if (!hasTurnServer) {
1216
990
  Logger.Info(
1217
- Logger.GetStackTrace(),
1218
991
  'No turn server was found in the Peer Connection Options. TURN cannot be forced, closing connection. Please use STUN instead'
1219
992
  );
1220
- this.closeSignalingServer('TURN cannot be forced, closing connection. Please use STUN instead.');
993
+ this.closeSignalingServer(
994
+ 'TURN cannot be forced, closing connection. Please use STUN instead.',
995
+ false
996
+ );
1221
997
  return;
1222
998
  }
1223
999
  }
@@ -1230,18 +1006,15 @@ export class WebRtcPlayerController {
1230
1006
  );
1231
1007
 
1232
1008
  // set up peer connection controller video stats
1233
- this.peerConnectionController.onVideoStats = (event: AggregatedStats) =>
1234
- this.handleVideoStats(event);
1009
+ this.peerConnectionController.onVideoStats = (event: AggregatedStats) => this.handleVideoStats(event);
1235
1010
 
1236
1011
  /* When the Peer Connection wants to send an offer have it handled */
1237
- this.peerConnectionController.onSendWebRTCOffer = (
1238
- offer: RTCSessionDescriptionInit
1239
- ) => this.handleSendWebRTCOffer(offer);
1012
+ this.peerConnectionController.onSendWebRTCOffer = (offer: RTCSessionDescriptionInit) =>
1013
+ this.handleSendWebRTCOffer(offer);
1240
1014
 
1241
1015
  /* When the Peer Connection wants to send an answer have it handled */
1242
- this.peerConnectionController.onSendWebRTCAnswer = (
1243
- offer: RTCSessionDescriptionInit
1244
- ) => this.handleSendWebRTCAnswer(offer);
1016
+ this.peerConnectionController.onSendWebRTCAnswer = (offer: RTCSessionDescriptionInit) =>
1017
+ this.handleSendWebRTCAnswer(offer);
1245
1018
 
1246
1019
  /* When the Peer Connection ice candidate is added have it handled */
1247
1020
  this.peerConnectionController.onPeerIceCandidate = (
@@ -1249,9 +1022,8 @@ export class WebRtcPlayerController {
1249
1022
  ) => this.handleSendIceCandidate(peerConnectionIceEvent);
1250
1023
 
1251
1024
  /* When the Peer Connection has a data channel created for it by the browser, handle it */
1252
- this.peerConnectionController.onDataChannel = (
1253
- datachannelEvent: RTCDataChannelEvent
1254
- ) => this.handleDataChannel(datachannelEvent);
1025
+ this.peerConnectionController.onDataChannel = (datachannelEvent: RTCDataChannelEvent) =>
1026
+ this.handleDataChannel(datachannelEvent);
1255
1027
 
1256
1028
  // set up webRtc text overlays
1257
1029
  this.peerConnectionController.showTextOverlayConnecting = () =>
@@ -1263,8 +1035,12 @@ export class WebRtcPlayerController {
1263
1035
  // Browsers emit "connected" when getting first connection and "completed" when finishing
1264
1036
  // candidate checking. However, sometimes browsers can skip "connected" and only emit "completed".
1265
1037
  // Therefore need to check both cases and emit onWebRtcConnected only once on the first hit.
1266
- if (!webRtcConnectedSent &&
1267
- ["connected", "completed"].includes(this.peerConnectionController.peerConnection.iceConnectionState)) {
1038
+ if (
1039
+ !webRtcConnectedSent &&
1040
+ ['connected', 'completed'].includes(
1041
+ this.peerConnectionController.peerConnection.iceConnectionState
1042
+ )
1043
+ ) {
1268
1044
  this.pixelStreaming._onWebRtcConnected();
1269
1045
  webRtcConnectedSent = true;
1270
1046
  }
@@ -1273,26 +1049,6 @@ export class WebRtcPlayerController {
1273
1049
  /* RTC Peer Connection on Track event -> handle on track */
1274
1050
  this.peerConnectionController.onTrack = (trackEvent: RTCTrackEvent) =>
1275
1051
  this.streamController.handleOnTrack(trackEvent);
1276
-
1277
- /* Start the Hand shake process by creating an Offer */
1278
- const BrowserSendsOffer = this.config.isFlagEnabled(
1279
- Flags.BrowserSendOffer
1280
- );
1281
- if (BrowserSendsOffer) {
1282
- // If browser is sending the offer, create an offer and send it to the streamer
1283
- this.sendrecvDataChannelController.createDataChannel(
1284
- this.peerConnectionController.peerConnection,
1285
- 'cirrus',
1286
- this.datachannelOptions
1287
- );
1288
- this.sendrecvDataChannelController.handleOnMessage = (
1289
- ev: MessageEvent<ArrayBuffer>
1290
- ) => this.handleOnMessage(ev);
1291
- this.peerConnectionController.createOffer(
1292
- this.sdpConstraints,
1293
- this.config
1294
- );
1295
- }
1296
1052
  }
1297
1053
 
1298
1054
  /**
@@ -1301,7 +1057,7 @@ export class WebRtcPlayerController {
1301
1057
  checkTurnServerAvailability(options: RTCConfiguration) {
1302
1058
  // if iceServers is empty return false this should not be the general use case but is here incase
1303
1059
  if (!options.iceServers) {
1304
- Logger.Info(Logger.GetStackTrace(), 'A turn sever was not found');
1060
+ Logger.Info('A turn sever was not found');
1305
1061
  return false;
1306
1062
  }
1307
1063
 
@@ -1309,16 +1065,13 @@ export class WebRtcPlayerController {
1309
1065
  for (const iceServer of options.iceServers) {
1310
1066
  for (const url of iceServer.urls) {
1311
1067
  if (url.includes('turn')) {
1312
- Logger.Log(
1313
- Logger.GetStackTrace(),
1314
- `A turn sever was found at ${url}`
1315
- );
1068
+ Logger.Info(`A turn sever was found at ${url}`);
1316
1069
  return true;
1317
1070
  }
1318
1071
  }
1319
1072
  }
1320
1073
 
1321
- Logger.Info(Logger.GetStackTrace(), 'A turn sever was not found');
1074
+ Logger.Info('A turn sever was not found');
1322
1075
  return false;
1323
1076
  }
1324
1077
 
@@ -1337,11 +1090,7 @@ export class WebRtcPlayerController {
1337
1090
  * Handles when the signalling server gives us the list of streamer ids.
1338
1091
  */
1339
1092
  handleStreamerListMessage(messageStreamerList: Messages.streamerList) {
1340
- Logger.Log(
1341
- Logger.GetStackTrace(),
1342
- `Got streamer list ${messageStreamerList.ids}`,
1343
- 6
1344
- );
1093
+ Logger.Info(`Got streamer list ${messageStreamerList.ids}`);
1345
1094
 
1346
1095
  let wantedStreamerId: string = '';
1347
1096
 
@@ -1356,10 +1105,7 @@ export class WebRtcPlayerController {
1356
1105
  // add the streamers to the UI
1357
1106
  const settingOptions = [...messageStreamerList.ids]; // copy the original messageStreamerList.ids
1358
1107
  settingOptions.unshift(''); // add an empty option at the top
1359
- this.config.setOptionSettingOptions(
1360
- OptionParameters.StreamerId,
1361
- settingOptions
1362
- );
1108
+ this.config.setOptionSettingOptions(OptionParameters.StreamerId, settingOptions);
1363
1109
 
1364
1110
  let autoSelectedStreamerId: string = '';
1365
1111
  const waitForStreamer = this.config.isFlagEnabled(Flags.WaitForStreamer);
@@ -1368,7 +1114,7 @@ export class WebRtcPlayerController {
1368
1114
 
1369
1115
  // first we figure out a wanted streamer id through various means
1370
1116
  const useUrlParams = this.config.useUrlParams;
1371
- const urlParams = new URLSearchParams(window.location.search);
1117
+ const urlParams = new IURLSearchParams(window.location.search);
1372
1118
  if (useUrlParams && urlParams.has(OptionParameters.StreamerId)) {
1373
1119
  // if we've set the streamer id on the url we only want that streamer id
1374
1120
  wantedStreamerId = urlParams.get(OptionParameters.StreamerId);
@@ -1388,20 +1134,17 @@ export class WebRtcPlayerController {
1388
1134
 
1389
1135
  // if we found a streamer id to auto select, select it
1390
1136
  if (autoSelectedStreamerId) {
1391
- this.isReconnecting = false;
1392
1137
  this.reconnectAttempt = 0;
1393
- this.config.setOptionSettingValue(
1394
- OptionParameters.StreamerId,
1395
- autoSelectedStreamerId
1396
- );
1138
+ this.isReconnecting = false;
1139
+ this.config.setOptionSettingValue(OptionParameters.StreamerId, autoSelectedStreamerId);
1397
1140
  } else {
1398
1141
  // no auto selected streamer.
1399
1142
  // if we're waiting for a streamer then try reconnecting
1400
1143
  if (waitForStreamer) {
1401
1144
  if (this.reconnectAttempt < reconnectLimit) {
1402
1145
  // still reconnects available
1403
- this.isReconnecting = true;
1404
1146
  this.reconnectAttempt++;
1147
+ this.isReconnecting = true;
1405
1148
  setTimeout(() => {
1406
1149
  this.protocol.sendMessage(MessageHelpers.createMessage(Messages.listStreamers));
1407
1150
  }, reconnectDelay);
@@ -1409,7 +1152,7 @@ export class WebRtcPlayerController {
1409
1152
  // We've exhausted our reconnect attempts, return to main screen
1410
1153
  this.reconnectAttempt = 0;
1411
1154
  this.isReconnecting = false;
1412
- this.shouldReconnect = false;
1155
+ this.enableAutoReconnect = false;
1413
1156
  }
1414
1157
  }
1415
1158
  }
@@ -1432,7 +1175,7 @@ export class WebRtcPlayerController {
1432
1175
 
1433
1176
  // temporarily prevent onChange from firing (it would try to subscribe to the streamer again)
1434
1177
  const oldOnChange = streamerListOptions.onChange;
1435
- streamerListOptions.onChange = () => { };
1178
+ streamerListOptions.onChange = () => {};
1436
1179
 
1437
1180
  // change the selected entry.
1438
1181
  const streamerList = streamerListOptions.options;
@@ -1468,7 +1211,7 @@ export class WebRtcPlayerController {
1468
1211
  * @param Answer - Answer SDP from the peer.
1469
1212
  */
1470
1213
  handleWebRtcAnswer(Answer: Messages.answer) {
1471
- Logger.Log(Logger.GetStackTrace(), `Got answer sdp ${Answer.sdp}`, 6);
1214
+ Logger.Info(`Got answer sdp ${Answer.sdp}`);
1472
1215
 
1473
1216
  const sdpAnswer: RTCSessionDescriptionInit = {
1474
1217
  sdp: Answer.sdp,
@@ -1484,7 +1227,7 @@ export class WebRtcPlayerController {
1484
1227
  * @param Offer - Offer SDP from the peer.
1485
1228
  */
1486
1229
  handleWebRtcOffer(Offer: Messages.offer) {
1487
- Logger.Log(Logger.GetStackTrace(), `Got offer sdp ${Offer.sdp}`, 6);
1230
+ Logger.Info(`Got offer sdp ${Offer.sdp}`);
1488
1231
 
1489
1232
  this.isUsingSFU = Offer.sfu ? Offer.sfu : false;
1490
1233
  if (this.isUsingSFU) {
@@ -1512,8 +1255,7 @@ export class WebRtcPlayerController {
1512
1255
  id: DataChannels.sendStreamId
1513
1256
  };
1514
1257
 
1515
- const unidirectional =
1516
- DataChannels.sendStreamId != DataChannels.recvStreamId;
1258
+ const unidirectional = DataChannels.sendStreamId != DataChannels.recvStreamId;
1517
1259
 
1518
1260
  this.sendrecvDataChannelController.createDataChannel(
1519
1261
  this.peerConnectionController.peerConnection,
@@ -1536,14 +1278,11 @@ export class WebRtcPlayerController {
1536
1278
  this.recvDataChannelController.handleOnOpen = () =>
1537
1279
  this.protocol.sendMessage(MessageHelpers.createMessage(Messages.peerDataChannelsReady));
1538
1280
  // If we're uni-directional, only the recv data channel should handle incoming messages
1539
- this.recvDataChannelController.handleOnMessage = (
1540
- ev: MessageEvent
1541
- ) => this.handleOnMessage(ev);
1281
+ this.recvDataChannelController.handleOnMessage = (ev: MessageEvent) => this.handleOnMessage(ev);
1542
1282
  } else {
1543
1283
  // else our primary datachannel is send/recv so it can handle incoming messages
1544
- this.sendrecvDataChannelController.handleOnMessage = (
1545
- ev: MessageEvent
1546
- ) => this.handleOnMessage(ev);
1284
+ this.sendrecvDataChannelController.handleOnMessage = (ev: MessageEvent) =>
1285
+ this.handleOnMessage(ev);
1547
1286
  }
1548
1287
  }
1549
1288
 
@@ -1570,11 +1309,7 @@ export class WebRtcPlayerController {
1570
1309
  * @param iceCandidate - Ice Candidate from Server
1571
1310
  */
1572
1311
  handleIceCandidate(iceCandidate: RTCIceCandidateInit) {
1573
- Logger.Log(
1574
- Logger.GetStackTrace(),
1575
- 'Web RTC Controller: onWebRtcIce',
1576
- 6
1577
- );
1312
+ Logger.Info('Web RTC Controller: onWebRtcIce');
1578
1313
 
1579
1314
  const candidate = new RTCIceCandidate(iceCandidate);
1580
1315
  this.peerConnectionController.handleOnIce(candidate);
@@ -1585,9 +1320,11 @@ export class WebRtcPlayerController {
1585
1320
  * @param iceEvent - RTC Peer ConnectionIceEvent) {
1586
1321
  */
1587
1322
  handleSendIceCandidate(iceEvent: RTCPeerConnectionIceEvent) {
1588
- Logger.Log(Logger.GetStackTrace(), 'OnIceCandidate', 6);
1323
+ Logger.Info('OnIceCandidate');
1589
1324
  if (iceEvent.candidate && iceEvent.candidate.candidate) {
1590
- this.protocol.sendMessage(MessageHelpers.createMessage(Messages.iceCandidate, { candidate: iceEvent.candidate }));
1325
+ this.protocol.sendMessage(
1326
+ MessageHelpers.createMessage(Messages.iceCandidate, { candidate: iceEvent.candidate })
1327
+ );
1591
1328
  }
1592
1329
  }
1593
1330
 
@@ -1596,18 +1333,12 @@ export class WebRtcPlayerController {
1596
1333
  * @param iceEvent - RTC Peer ConnectionIceEvent) {
1597
1334
  */
1598
1335
  handleDataChannel(datachannelEvent: RTCDataChannelEvent) {
1599
- Logger.Log(
1600
- Logger.GetStackTrace(),
1601
- 'Data channel created for us by browser as we are a receiving peer.',
1602
- 6
1603
- );
1604
- this.sendrecvDataChannelController.dataChannel =
1605
- datachannelEvent.channel;
1336
+ Logger.Info('Data channel created for us by browser as we are a receiving peer.');
1337
+ this.sendrecvDataChannelController.dataChannel = datachannelEvent.channel;
1606
1338
  // Data channel was created for us, so we just need to setup its callbacks and array type
1607
1339
  this.sendrecvDataChannelController.setupDataChannel();
1608
- this.sendrecvDataChannelController.handleOnMessage = (
1609
- ev: MessageEvent<ArrayBuffer>
1610
- ) => this.handleOnMessage(ev);
1340
+ this.sendrecvDataChannelController.handleOnMessage = (ev: MessageEvent<ArrayBuffer>) =>
1341
+ this.handleOnMessage(ev);
1611
1342
  }
1612
1343
 
1613
1344
  /**
@@ -1615,11 +1346,7 @@ export class WebRtcPlayerController {
1615
1346
  * @param offer - RTC Session Description
1616
1347
  */
1617
1348
  handleSendWebRTCOffer(offer: RTCSessionDescriptionInit) {
1618
- Logger.Log(
1619
- Logger.GetStackTrace(),
1620
- 'Sending the offer to the Server',
1621
- 6
1622
- );
1349
+ Logger.Info('Sending the offer to the Server');
1623
1350
 
1624
1351
  const extraParams = {
1625
1352
  sdp: offer.sdp,
@@ -1635,11 +1362,7 @@ export class WebRtcPlayerController {
1635
1362
  * @param answer - RTC Session Description
1636
1363
  */
1637
1364
  handleSendWebRTCAnswer(answer: RTCSessionDescriptionInit) {
1638
- Logger.Log(
1639
- Logger.GetStackTrace(),
1640
- 'Sending the answer to the Server',
1641
- 6
1642
- );
1365
+ Logger.Info('Sending the answer to the Server');
1643
1366
 
1644
1367
  const extraParams = {
1645
1368
  sdp: answer.sdp,
@@ -1659,22 +1382,23 @@ export class WebRtcPlayerController {
1659
1382
  */
1660
1383
  setUpMouseAndFreezeFrame() {
1661
1384
  // Calculating and normalizing positions depends on the width and height of the player.
1662
- this.videoElementParentClientRect = this.videoPlayer
1663
- .getVideoParentElement()
1664
- .getBoundingClientRect();
1665
- this.coordinateConverter.setupNormalizeAndQuantize();
1385
+ const playerElement = this.videoPlayer.getVideoParentElement();
1386
+ const videoElement = this.videoPlayer.getVideoElement();
1387
+ this.coordinateConverter.reconfigure(
1388
+ { width: playerElement.clientWidth, height: playerElement.clientHeight },
1389
+ { width: videoElement.videoWidth, height: videoElement.videoHeight }
1390
+ );
1666
1391
  this.freezeFrameController.freezeFrame.resize();
1667
1392
  }
1668
1393
 
1669
1394
  /**
1670
1395
  * Close the Connection to the signaling server
1671
1396
  */
1672
- closeSignalingServer(message: string) {
1673
- // We explicitly called close, therefore we don't want to trigger auto reconnect
1397
+ closeSignalingServer(message: string, allowReconnect: boolean) {
1674
1398
  this.locallyClosed = true;
1675
- this.shouldReconnect = false;
1399
+ this.enableAutoReconnect = allowReconnect;
1676
1400
  this.disconnectMessage = message;
1677
- this.protocol?.disconnect();
1401
+ this.protocol?.disconnect(1000, message);
1678
1402
  }
1679
1403
 
1680
1404
  /**
@@ -1688,7 +1412,7 @@ export class WebRtcPlayerController {
1688
1412
  * Close all connections
1689
1413
  */
1690
1414
  close() {
1691
- this.closeSignalingServer('');
1415
+ this.closeSignalingServer('', false);
1692
1416
  this.closePeerConnection();
1693
1417
  }
1694
1418
 
@@ -1705,20 +1429,20 @@ export class WebRtcPlayerController {
1705
1429
  sendLatencyTest() {
1706
1430
  this.latencyStartTime = Date.now();
1707
1431
 
1708
- this.streamMessageController.toStreamerHandlers.get(
1709
- 'LatencyTest'
1710
- )([JSON.stringify({
1711
- StartTime: this.latencyStartTime
1712
- })]);
1432
+ this.streamMessageController.toStreamerHandlers.get('LatencyTest')([
1433
+ JSON.stringify({
1434
+ StartTime: this.latencyStartTime
1435
+ })
1436
+ ]);
1713
1437
  }
1714
1438
 
1715
1439
  /**
1716
1440
  * Send a Data Channel Latency Test Request to the UE Instance
1717
1441
  */
1718
1442
  sendDataChannelLatencyTest(descriptor: DataChannelLatencyTestRequest) {
1719
- this.streamMessageController.toStreamerHandlers.get(
1720
- 'DataChannelLatencyTest'
1721
- )([JSON.stringify(descriptor)]);
1443
+ this.streamMessageController.toStreamerHandlers.get('DataChannelLatencyTest')([
1444
+ JSON.stringify(descriptor)
1445
+ ]);
1722
1446
  }
1723
1447
 
1724
1448
  /**
@@ -1731,14 +1455,14 @@ export class WebRtcPlayerController {
1731
1455
  * to aim for the best quality it can on the given network link.
1732
1456
  */
1733
1457
  sendEncoderMinQP(minQP: number) {
1734
- Logger.Log(Logger.GetStackTrace(), `MinQP=${minQP}\n`, 6);
1458
+ Logger.Info(`MinQP=${minQP}\n`);
1735
1459
 
1736
1460
  if (minQP != null) {
1737
- this.streamMessageController.toStreamerHandlers.get(
1738
- 'Command'
1739
- )([JSON.stringify({
1740
- 'Encoder.MinQP': minQP
1741
- })]);
1461
+ this.streamMessageController.toStreamerHandlers.get('Command')([
1462
+ JSON.stringify({
1463
+ 'Encoder.MinQP': minQP
1464
+ })
1465
+ ]);
1742
1466
  }
1743
1467
  }
1744
1468
 
@@ -1752,68 +1476,68 @@ export class WebRtcPlayerController {
1752
1476
  * to drop quality as low as needed on the given network link.
1753
1477
  */
1754
1478
  sendEncoderMaxQP(maxQP: number) {
1755
- Logger.Log(Logger.GetStackTrace(), `MaxQP=${maxQP}\n`, 6);
1479
+ Logger.Info(`MaxQP=${maxQP}\n`);
1756
1480
 
1757
1481
  if (maxQP != null) {
1758
- this.streamMessageController.toStreamerHandlers.get(
1759
- 'Command'
1760
- )([JSON.stringify({
1761
- 'Encoder.MaxQP': maxQP
1762
- })]);
1482
+ this.streamMessageController.toStreamerHandlers.get('Command')([
1483
+ JSON.stringify({
1484
+ 'Encoder.MaxQP': maxQP
1485
+ })
1486
+ ]);
1763
1487
  }
1764
1488
  }
1765
1489
 
1766
1490
  /**
1767
- * Send the { WebRTC.MinBitrate: SomeNumber }} command to UE to set
1768
- * the minimum bitrate that we allow WebRTC to use
1491
+ * Send the { WebRTC.MinBitrate: SomeNumber }} command to UE to set
1492
+ * the minimum bitrate that we allow WebRTC to use
1769
1493
  * (note setting this too high in poor networks can be problematic).
1770
1494
  * @param minBitrate - The minimum bitrate we would like WebRTC to not fall below.
1771
1495
  */
1772
1496
  sendWebRTCMinBitrate(minBitrate: number) {
1773
- Logger.Log(Logger.GetStackTrace(), `WebRTC Min Bitrate=${minBitrate}`, 6);
1497
+ Logger.Info(`WebRTC Min Bitrate=${minBitrate}`);
1774
1498
  if (minBitrate != null) {
1775
- this.streamMessageController.toStreamerHandlers.get(
1776
- 'Command'
1777
- )([JSON.stringify({
1778
- 'WebRTC.MinBitrate': minBitrate
1779
- })]);
1499
+ this.streamMessageController.toStreamerHandlers.get('Command')([
1500
+ JSON.stringify({
1501
+ 'WebRTC.MinBitrate': minBitrate
1502
+ })
1503
+ ]);
1780
1504
  }
1781
1505
  }
1782
1506
 
1783
1507
  /**
1784
- * Send the { WebRTC.MaxBitrate: SomeNumber }} command to UE to set
1785
- * the minimum bitrate that we allow WebRTC to use
1508
+ * Send the { WebRTC.MaxBitrate: SomeNumber }} command to UE to set
1509
+ * the minimum bitrate that we allow WebRTC to use
1786
1510
  * (note setting this too low could result in blocky video).
1787
1511
  * @param minBitrate - The minimum bitrate we would like WebRTC to not fall below.
1788
1512
  */
1789
1513
  sendWebRTCMaxBitrate(maxBitrate: number) {
1790
- Logger.Log(Logger.GetStackTrace(), `WebRTC Max Bitrate=${maxBitrate}`, 6);
1514
+ Logger.Info(`WebRTC Max Bitrate=${maxBitrate}`);
1791
1515
  if (maxBitrate != null) {
1792
- this.streamMessageController.toStreamerHandlers.get(
1793
- 'Command'
1794
- )([JSON.stringify({
1795
- 'WebRTC.MaxBitrate': maxBitrate
1796
- })]);
1516
+ this.streamMessageController.toStreamerHandlers.get('Command')([
1517
+ JSON.stringify({
1518
+ 'WebRTC.MaxBitrate': maxBitrate
1519
+ })
1520
+ ]);
1797
1521
  }
1798
1522
  }
1799
1523
 
1800
1524
  /**
1801
1525
  * Send the { WebRTC.Fps: SomeNumber }} UE 5.0+
1802
- * and { WebRTC.MaxFps } UE 4.27 command to set
1803
- * the maximum fps we would like WebRTC to stream at.
1526
+ * and { WebRTC.MaxFps } UE 4.27 command to set
1527
+ * the maximum fps we would like WebRTC to stream at.
1804
1528
  * @param fps - The maximum stream fps.
1805
1529
  */
1806
1530
  sendWebRTCFps(fps: number) {
1807
- Logger.Log(Logger.GetStackTrace(), `WebRTC FPS=${fps}`, 6);
1531
+ Logger.Info(`WebRTC FPS=${fps}`);
1808
1532
  if (fps != null) {
1809
- this.streamMessageController.toStreamerHandlers.get(
1810
- 'Command'
1811
- )([JSON.stringify({ 'WebRTC.Fps': fps })]);
1533
+ this.streamMessageController.toStreamerHandlers.get('Command')([
1534
+ JSON.stringify({ 'WebRTC.Fps': fps })
1535
+ ]);
1812
1536
 
1813
1537
  /* TODO: Remove when UE 4.27 unsupported. */
1814
- this.streamMessageController.toStreamerHandlers.get(
1815
- 'Command'
1816
- )([JSON.stringify({ 'WebRTC.MaxFps': fps })]);
1538
+ this.streamMessageController.toStreamerHandlers.get('Command')([
1539
+ JSON.stringify({ 'WebRTC.MaxFps': fps })
1540
+ ]);
1817
1541
  }
1818
1542
  }
1819
1543
 
@@ -1821,26 +1545,16 @@ export class WebRtcPlayerController {
1821
1545
  * Sends the UI Descriptor `stat fps` to the UE Instance
1822
1546
  */
1823
1547
  sendShowFps(): void {
1824
- Logger.Log(
1825
- Logger.GetStackTrace(),
1826
- '---- Sending show stat to UE ----',
1827
- 6
1828
- );
1548
+ Logger.Info('---- Sending show stat to UE ----');
1829
1549
 
1830
- this.streamMessageController.toStreamerHandlers.get(
1831
- 'Command'
1832
- )([JSON.stringify({ 'stat.fps': '' })]);
1550
+ this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify({ 'stat.fps': '' })]);
1833
1551
  }
1834
1552
 
1835
1553
  /**
1836
1554
  * Send an Iframe request to the streamer
1837
1555
  */
1838
1556
  sendIframeRequest(): void {
1839
- Logger.Log(
1840
- Logger.GetStackTrace(),
1841
- '---- Sending Request for an IFrame ----',
1842
- 6
1843
- );
1557
+ Logger.Info('---- Sending Request for an IFrame ----');
1844
1558
  this.streamMessageController.toStreamerHandlers.get('IFrameRequest')();
1845
1559
  }
1846
1560
 
@@ -1848,58 +1562,38 @@ export class WebRtcPlayerController {
1848
1562
  * Send a UIInteraction message
1849
1563
  */
1850
1564
  emitUIInteraction(descriptor: object | string) {
1851
- Logger.Log(
1852
- Logger.GetStackTrace(),
1853
- '---- Sending custom UIInteraction message ----',
1854
- 6
1855
- );
1565
+ Logger.Info('---- Sending custom UIInteraction message ----');
1856
1566
 
1857
- this.streamMessageController.toStreamerHandlers.get(
1858
- 'UIInteraction'
1859
- )([JSON.stringify(descriptor)]);
1567
+ this.streamMessageController.toStreamerHandlers.get('UIInteraction')([JSON.stringify(descriptor)]);
1860
1568
  }
1861
1569
 
1862
1570
  /**
1863
1571
  * Send a Command message
1864
1572
  */
1865
1573
  emitCommand(descriptor: object) {
1866
- Logger.Log(
1867
- Logger.GetStackTrace(),
1868
- '---- Sending custom Command message ----',
1869
- 6
1870
- );
1574
+ Logger.Info('---- Sending custom Command message ----');
1871
1575
 
1872
- this.streamMessageController.toStreamerHandlers.get(
1873
- 'Command'
1874
- )([JSON.stringify(descriptor)]);
1576
+ this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify(descriptor)]);
1875
1577
  }
1876
1578
 
1877
1579
  /**
1878
1580
  * Send a console command message
1879
1581
  */
1880
1582
  emitConsoleCommand(command: string) {
1881
- Logger.Log(
1882
- Logger.GetStackTrace(),
1883
- '---- Sending custom Command:ConsoleCommand message ----',
1884
- 6
1885
- );
1583
+ Logger.Info('---- Sending custom Command:ConsoleCommand message ----');
1886
1584
 
1887
- this.streamMessageController.toStreamerHandlers.get(
1888
- 'Command'
1889
- )([JSON.stringify({
1890
- ConsoleCommand: command,
1891
- })]);
1585
+ this.streamMessageController.toStreamerHandlers.get('Command')([
1586
+ JSON.stringify({
1587
+ ConsoleCommand: command
1588
+ })
1589
+ ]);
1892
1590
  }
1893
1591
 
1894
1592
  /**
1895
1593
  * Sends a request to the UE Instance to have ownership of Quality
1896
1594
  */
1897
1595
  sendRequestQualityControlOwnership(): void {
1898
- Logger.Log(
1899
- Logger.GetStackTrace(),
1900
- '---- Sending Request to Control Quality ----',
1901
- 6
1902
- );
1596
+ Logger.Info('---- Sending Request to Control Quality ----');
1903
1597
  this.toStreamerMessagesController.SendRequestQualityControl();
1904
1598
  }
1905
1599
 
@@ -1908,14 +1602,8 @@ export class WebRtcPlayerController {
1908
1602
  * @param message - Latency Test Timings
1909
1603
  */
1910
1604
  handleLatencyTestResult(message: ArrayBuffer) {
1911
- Logger.Log(
1912
- Logger.GetStackTrace(),
1913
- 'DataChannelReceiveMessageType.latencyTest',
1914
- 6
1915
- );
1916
- const latencyAsString = new TextDecoder('utf-16').decode(
1917
- message.slice(1)
1918
- );
1605
+ Logger.Info('DataChannelReceiveMessageType.latencyTest');
1606
+ const latencyAsString = new TextDecoder('utf-16').decode(message.slice(1));
1919
1607
  const latencyTestResults: LatencyTestResults = new LatencyTestResults();
1920
1608
  Object.assign(latencyTestResults, JSON.parse(latencyAsString));
1921
1609
  latencyTestResults.processFields();
@@ -1924,26 +1612,19 @@ export class WebRtcPlayerController {
1924
1612
  latencyTestResults.browserReceiptTimeMs = Date.now();
1925
1613
 
1926
1614
  latencyTestResults.latencyExcludingDecode = ~~(
1927
- latencyTestResults.browserReceiptTimeMs -
1928
- latencyTestResults.testStartTimeMs
1615
+ latencyTestResults.browserReceiptTimeMs - latencyTestResults.testStartTimeMs
1929
1616
  );
1930
1617
  latencyTestResults.testDuration = ~~(
1931
- latencyTestResults.TransmissionTimeMs -
1932
- latencyTestResults.ReceiptTimeMs
1618
+ latencyTestResults.TransmissionTimeMs - latencyTestResults.ReceiptTimeMs
1933
1619
  );
1934
1620
  latencyTestResults.networkLatency = ~~(
1935
- latencyTestResults.latencyExcludingDecode -
1936
- latencyTestResults.testDuration
1621
+ latencyTestResults.latencyExcludingDecode - latencyTestResults.testDuration
1937
1622
  );
1938
1623
 
1939
- if (
1940
- latencyTestResults.frameDisplayDeltaTimeMs &&
1941
- latencyTestResults.browserReceiptTimeMs
1942
- ) {
1943
- latencyTestResults.endToEndLatency =
1944
- ~~(latencyTestResults.frameDisplayDeltaTimeMs +
1945
- latencyTestResults.networkLatency,
1946
- +latencyTestResults.CaptureToSendMs);
1624
+ if (latencyTestResults.frameDisplayDeltaTimeMs && latencyTestResults.browserReceiptTimeMs) {
1625
+ latencyTestResults.endToEndLatency = ~~(latencyTestResults.frameDisplayDeltaTimeMs +
1626
+ latencyTestResults.networkLatency,
1627
+ +latencyTestResults.CaptureToSendMs);
1947
1628
  }
1948
1629
  this.pixelStreaming._onLatencyTestResult(latencyTestResults);
1949
1630
  }
@@ -1953,14 +1634,8 @@ export class WebRtcPlayerController {
1953
1634
  * @param message - Data Channel Latency Test Response
1954
1635
  */
1955
1636
  handleDataChannelLatencyTestResponse(message: ArrayBuffer) {
1956
- Logger.Log(
1957
- Logger.GetStackTrace(),
1958
- 'DataChannelReceiveMessageType.dataChannelLatencyResponse',
1959
- 6
1960
- );
1961
- const responseAsString = new TextDecoder('utf-16').decode(
1962
- message.slice(1)
1963
- );
1637
+ Logger.Info('DataChannelReceiveMessageType.dataChannelLatencyResponse');
1638
+ const responseAsString = new TextDecoder('utf-16').decode(message.slice(1));
1964
1639
  const latencyTestResponse: DataChannelLatencyTestResponse = JSON.parse(responseAsString);
1965
1640
  this.pixelStreaming._onDataChannelLatencyTestResponse(latencyTestResponse);
1966
1641
  }
@@ -1970,14 +1645,8 @@ export class WebRtcPlayerController {
1970
1645
  * @param message - Initial Encoder and Web RTC Settings
1971
1646
  */
1972
1647
  handleInitialSettings(message: ArrayBuffer) {
1973
- Logger.Log(
1974
- Logger.GetStackTrace(),
1975
- 'DataChannelReceiveMessageType.InitialSettings',
1976
- 6
1977
- );
1978
- const payloadAsString = new TextDecoder('utf-16').decode(
1979
- message.slice(1)
1980
- );
1648
+ Logger.Info('DataChannelReceiveMessageType.InitialSettings');
1649
+ const payloadAsString = new TextDecoder('utf-16').decode(message.slice(1));
1981
1650
  const parsedInitialSettings = JSON.parse(payloadAsString);
1982
1651
 
1983
1652
  const initialSettings: InitialSettings = new InitialSettings();
@@ -1991,11 +1660,13 @@ export class WebRtcPlayerController {
1991
1660
  }
1992
1661
 
1993
1662
  if (parsedInitialSettings.PixelStreaming) {
1994
- initialSettings.PixelStreamingSettings =
1995
- parsedInitialSettings.PixelStreaming;
1663
+ initialSettings.PixelStreamingSettings = parsedInitialSettings.PixelStreaming;
1996
1664
  }
1997
1665
 
1998
- if (parsedInitialSettings.ConfigOptions && parsedInitialSettings.ConfigOptions.DefaultToHover !== undefined) {
1666
+ if (
1667
+ parsedInitialSettings.ConfigOptions &&
1668
+ parsedInitialSettings.ConfigOptions.DefaultToHover !== undefined
1669
+ ) {
1999
1670
  this.config.setFlagEnabled(
2000
1671
  Flags.HoveringMouseMode,
2001
1672
  !!parsedInitialSettings.ConfigOptions.DefaultToHover
@@ -2003,7 +1674,7 @@ export class WebRtcPlayerController {
2003
1674
  }
2004
1675
 
2005
1676
  initialSettings.ueCompatible();
2006
- Logger.Log(Logger.GetStackTrace(), payloadAsString, 6);
1677
+ Logger.Info(payloadAsString);
2007
1678
 
2008
1679
  this.pixelStreaming._onInitialSettings(initialSettings);
2009
1680
  }
@@ -2013,14 +1684,8 @@ export class WebRtcPlayerController {
2013
1684
  * @param message - Encoders Quantization Parameter
2014
1685
  */
2015
1686
  handleVideoEncoderAvgQP(message: ArrayBuffer) {
2016
- Logger.Log(
2017
- Logger.GetStackTrace(),
2018
- 'DataChannelReceiveMessageType.VideoEncoderAvgQP',
2019
- 6
2020
- );
2021
- const AvgQP = Number(
2022
- new TextDecoder('utf-16').decode(message.slice(1))
2023
- );
1687
+ Logger.Info('DataChannelReceiveMessageType.VideoEncoderAvgQP');
1688
+ const AvgQP = Number(new TextDecoder('utf-16').decode(message.slice(1)));
2024
1689
  this.setVideoEncoderAvgQP(AvgQP);
2025
1690
  }
2026
1691
 
@@ -2042,19 +1707,10 @@ export class WebRtcPlayerController {
2042
1707
  */
2043
1708
  onQualityControlOwnership(message: ArrayBuffer) {
2044
1709
  const view = new Uint8Array(message);
2045
- Logger.Log(
2046
- Logger.GetStackTrace(),
2047
- 'DataChannelReceiveMessageType.QualityControlOwnership',
2048
- 6
2049
- );
1710
+ Logger.Info('DataChannelReceiveMessageType.QualityControlOwnership');
2050
1711
  this.isQualityController = new Boolean(view[1]).valueOf();
2051
- Logger.Log(
2052
- Logger.GetStackTrace(),
2053
- `Received quality controller message, will control quality: ${this.isQualityController}`
2054
- );
2055
- this.pixelStreaming._onQualityControlOwnership(
2056
- this.isQualityController
2057
- );
1712
+ Logger.Info(`Received quality controller message, will control quality: ${this.isQualityController}`);
1713
+ this.pixelStreaming._onQualityControlOwnership(this.isQualityController);
2058
1714
  }
2059
1715
 
2060
1716
  /**
@@ -2089,11 +1745,9 @@ export class WebRtcPlayerController {
2089
1745
  * enables/disables keyboard event listeners
2090
1746
  */
2091
1747
  setKeyboardInputEnabled(isEnabled: boolean) {
2092
- this.keyboardController?.unregisterKeyBoardEvents();
1748
+ this.keyboardController?.unregister();
2093
1749
  if (isEnabled) {
2094
- this.keyboardController = this.inputClassesFactory.registerKeyBoard(
2095
- this.config
2096
- );
1750
+ this.keyboardController = this.inputClassesFactory.registerKeyBoard(this.config);
2097
1751
  }
2098
1752
  }
2099
1753
 
@@ -2101,13 +1755,12 @@ export class WebRtcPlayerController {
2101
1755
  * enables/disables mouse event listeners
2102
1756
  */
2103
1757
  setMouseInputEnabled(isEnabled: boolean) {
2104
- this.mouseController?.unregisterMouseEvents();
1758
+ this.mouseController?.unregister();
2105
1759
  if (isEnabled) {
2106
1760
  const mouseMode = this.config.isFlagEnabled(Flags.HoveringMouseMode)
2107
1761
  ? ControlSchemeType.HoveringMouse
2108
1762
  : ControlSchemeType.LockedMouse;
2109
- this.mouseController =
2110
- this.inputClassesFactory.registerMouse(mouseMode);
1763
+ this.mouseController = this.inputClassesFactory.registerMouse(mouseMode);
2111
1764
  }
2112
1765
  }
2113
1766
 
@@ -2115,11 +1768,10 @@ export class WebRtcPlayerController {
2115
1768
  * enables/disables touch event listeners
2116
1769
  */
2117
1770
  setTouchInputEnabled(isEnabled: boolean) {
2118
- this.touchController?.unregisterTouchEvents();
1771
+ this.touchController?.unregister();
2119
1772
  if (isEnabled) {
2120
1773
  this.touchController = this.inputClassesFactory.registerTouch(
2121
- this.config.isFlagEnabled(Flags.FakeMouseWithTouches),
2122
- this.videoElementParentClientRect
1774
+ this.config.isFlagEnabled(Flags.FakeMouseWithTouches)
2123
1775
  );
2124
1776
  }
2125
1777
  }
@@ -2128,51 +1780,37 @@ export class WebRtcPlayerController {
2128
1780
  * enables/disables game pad event listeners
2129
1781
  */
2130
1782
  setGamePadInputEnabled(isEnabled: boolean) {
2131
- this.gamePadController?.unregisterGamePadEvents();
1783
+ this.gamePadController?.unregister();
2132
1784
  if (isEnabled) {
2133
1785
  this.gamePadController = this.inputClassesFactory.registerGamePad();
2134
- this.gamePadController.onGamepadConnected = () => {
2135
- this.streamMessageController.toStreamerHandlers.get('GamepadConnected')();
2136
- }
2137
- this.gamePadController.onGamepadDisconnected = (controllerIdx: number) => {
2138
- this.streamMessageController.toStreamerHandlers.get('GamepadDisconnected')([controllerIdx]);
2139
- }
2140
1786
  }
2141
1787
  }
2142
1788
 
2143
1789
  registerDataChannelEventEmitters(dataChannel: DataChannelController) {
2144
1790
  dataChannel.onOpen = (label, event) =>
2145
- this.pixelStreaming.dispatchEvent(
2146
- new DataChannelOpenEvent({ label, event })
2147
- );
1791
+ this.pixelStreaming.dispatchEvent(new DataChannelOpenEvent({ label, event }));
2148
1792
  dataChannel.onClose = (label, event) =>
2149
- this.pixelStreaming.dispatchEvent(
2150
- new DataChannelCloseEvent({ label, event })
2151
- );
1793
+ this.pixelStreaming.dispatchEvent(new DataChannelCloseEvent({ label, event }));
2152
1794
  dataChannel.onError = (label, event) =>
2153
- this.pixelStreaming.dispatchEvent(
2154
- new DataChannelErrorEvent({ label, event })
2155
- );
1795
+ this.pixelStreaming.dispatchEvent(new DataChannelErrorEvent({ label, event }));
2156
1796
  }
2157
1797
 
2158
- public registerMessageHandler(name: string, direction: MessageDirection, handler?: (data: ArrayBuffer | Array<number | string>) => void) {
1798
+ public registerMessageHandler(
1799
+ name: string,
1800
+ direction: MessageDirection,
1801
+ handler?: (data: ArrayBuffer | Array<number | string>) => void
1802
+ ) {
2159
1803
  if (direction === MessageDirection.FromStreamer && typeof handler === 'undefined') {
2160
- Logger.Warning(
2161
- Logger.GetStackTrace(),
2162
- `Unable to register handler for ${name} as no handler was passed`
2163
- );
1804
+ Logger.Warning(`Unable to register handler for ${name} as no handler was passed`);
2164
1805
  }
2165
1806
 
2166
-
2167
1807
  this.streamMessageController.registerMessageHandler(
2168
1808
  direction,
2169
1809
  name,
2170
- (data: Array<number | string>) => (typeof handler === 'undefined' && direction === MessageDirection.ToStreamer) ?
2171
- this.sendMessageController.sendMessageToStreamer(
2172
- name,
2173
- data
2174
- ) :
2175
- handler(data)
1810
+ (data: Array<number | string>) =>
1811
+ typeof handler === 'undefined' && direction === MessageDirection.ToStreamer
1812
+ ? this.sendMessageController.sendMessageToStreamer(name, data)
1813
+ : handler(data)
2176
1814
  );
2177
1815
  }
2178
1816
  }