@epicgames-ps/lib-pixelstreamingfrontend-ue5.5 0.0.5

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 (138) hide show
  1. package/.cspell.json +48 -0
  2. package/.eslintignore +8 -0
  3. package/.eslintrc.js +8 -0
  4. package/.prettierignore +0 -0
  5. package/.prettierrc.json +6 -0
  6. package/dist/lib-pixelstreamingfrontend.esm.js +1 -0
  7. package/dist/lib-pixelstreamingfrontend.js +1 -0
  8. package/jest.config.js +18 -0
  9. package/package.json +48 -0
  10. package/readme.md +15 -0
  11. package/src/AFK/AFKController.test.ts +162 -0
  12. package/src/AFK/AFKController.ts +158 -0
  13. package/src/Config/Config.test.ts +222 -0
  14. package/src/Config/Config.ts +970 -0
  15. package/src/Config/SettingBase.ts +65 -0
  16. package/src/Config/SettingFlag.ts +99 -0
  17. package/src/Config/SettingNumber.ts +111 -0
  18. package/src/Config/SettingOption.ts +124 -0
  19. package/src/Config/SettingText.ts +82 -0
  20. package/src/DataChannel/DataChannelController.ts +138 -0
  21. package/src/DataChannel/DataChannelLatencyTestController.ts +129 -0
  22. package/src/DataChannel/DataChannelLatencyTestResults.ts +67 -0
  23. package/src/DataChannel/DataChannelSender.ts +59 -0
  24. package/src/DataChannel/InitialSettings.ts +61 -0
  25. package/src/DataChannel/LatencyTestResults.ts +76 -0
  26. package/src/FreezeFrame/FreezeFrame.ts +114 -0
  27. package/src/FreezeFrame/FreezeFrameController.ts +114 -0
  28. package/src/Inputs/FakeTouchController.ts +199 -0
  29. package/src/Inputs/GamepadController.ts +314 -0
  30. package/src/Inputs/GamepadTypes.ts +10 -0
  31. package/src/Inputs/HoveringMouseEvents.ts +192 -0
  32. package/src/Inputs/IMouseEvents.ts +64 -0
  33. package/src/Inputs/ITouchController.ts +29 -0
  34. package/src/Inputs/InputClassesFactory.ts +140 -0
  35. package/src/Inputs/KeyboardController.ts +354 -0
  36. package/src/Inputs/LockedMouseEvents.ts +287 -0
  37. package/src/Inputs/MouseButtons.ts +25 -0
  38. package/src/Inputs/MouseController.ts +362 -0
  39. package/src/Inputs/SpecialKeyCodes.ts +16 -0
  40. package/src/Inputs/TouchController.ts +208 -0
  41. package/src/Inputs/XRGamepadController.ts +126 -0
  42. package/src/PeerConnectionController/AggregatedStats.ts +311 -0
  43. package/src/PeerConnectionController/CandidatePairStats.ts +17 -0
  44. package/src/PeerConnectionController/CandidateStat.ts +13 -0
  45. package/src/PeerConnectionController/CodecStats.ts +19 -0
  46. package/src/PeerConnectionController/DataChannelStats.ts +17 -0
  47. package/src/PeerConnectionController/InboundRTPStats.ts +154 -0
  48. package/src/PeerConnectionController/InboundTrackStats.ts +34 -0
  49. package/src/PeerConnectionController/OutBoundRTPStats.ts +26 -0
  50. package/src/PeerConnectionController/PeerConnectionController.ts +563 -0
  51. package/src/PeerConnectionController/SessionStats.ts +10 -0
  52. package/src/PeerConnectionController/StreamStats.ts +11 -0
  53. package/src/PixelStreaming/PixelStreaming.test.ts +626 -0
  54. package/src/PixelStreaming/PixelStreaming.ts +851 -0
  55. package/src/UI/OnScreenKeyboard.ts +97 -0
  56. package/src/UeInstanceMessage/ResponseController.ts +47 -0
  57. package/src/UeInstanceMessage/SendMessageController.ts +154 -0
  58. package/src/UeInstanceMessage/StreamMessageController.ts +233 -0
  59. package/src/UeInstanceMessage/ToStreamerMessagesController.ts +62 -0
  60. package/src/Util/CoordinateConverter.ts +289 -0
  61. package/src/Util/EventEmitter.ts +611 -0
  62. package/src/Util/EventListenerTracker.ts +29 -0
  63. package/src/Util/FileUtil.ts +140 -0
  64. package/src/Util/RTCUtils.ts +41 -0
  65. package/src/Util/WebGLUtils.ts +49 -0
  66. package/src/Util/WebXRUtils.ts +25 -0
  67. package/src/VideoPlayer/StreamController.ts +89 -0
  68. package/src/VideoPlayer/VideoPlayer.ts +246 -0
  69. package/src/WebRtcPlayer/WebRtcPlayerController.ts +2158 -0
  70. package/src/WebXR/WebXRController.ts +319 -0
  71. package/src/__test__/mockMediaStream.ts +124 -0
  72. package/src/__test__/mockRTCPeerConnection.ts +347 -0
  73. package/src/__test__/mockRTCRtpReceiver.ts +22 -0
  74. package/src/__test__/mockWebSocket.ts +136 -0
  75. package/src/pixelstreamingfrontend.ts +46 -0
  76. package/tsconfig.jest.json +8 -0
  77. package/tsconfig.json +24 -0
  78. package/types/AFK/AFKController.d.ts +39 -0
  79. package/types/Config/Config.d.ts +218 -0
  80. package/types/Config/SettingBase.d.ts +30 -0
  81. package/types/Config/SettingFlag.d.ts +33 -0
  82. package/types/Config/SettingNumber.d.ts +45 -0
  83. package/types/Config/SettingOption.d.ts +43 -0
  84. package/types/Config/SettingText.d.ts +29 -0
  85. package/types/DataChannel/DataChannelController.d.ts +59 -0
  86. package/types/DataChannel/DataChannelLatencyTestController.d.ts +26 -0
  87. package/types/DataChannel/DataChannelLatencyTestResults.d.ts +46 -0
  88. package/types/DataChannel/DataChannelSender.d.ts +21 -0
  89. package/types/DataChannel/InitialSettings.d.ts +44 -0
  90. package/types/DataChannel/LatencyTestResults.d.ts +31 -0
  91. package/types/FreezeFrame/FreezeFrame.d.ts +36 -0
  92. package/types/FreezeFrame/FreezeFrameController.d.ts +37 -0
  93. package/types/Inputs/FakeTouchController.d.ts +61 -0
  94. package/types/Inputs/GamepadController.d.ts +85 -0
  95. package/types/Inputs/GamepadTypes.d.ts +8 -0
  96. package/types/Inputs/HoveringMouseEvents.d.ts +56 -0
  97. package/types/Inputs/IMouseEvents.d.ts +53 -0
  98. package/types/Inputs/ITouchController.d.ts +24 -0
  99. package/types/Inputs/InputClassesFactory.d.ts +54 -0
  100. package/types/Inputs/KeyboardController.d.ts +62 -0
  101. package/types/Inputs/LockedMouseEvents.d.ts +80 -0
  102. package/types/Inputs/MouseButtons.d.ts +22 -0
  103. package/types/Inputs/MouseController.d.ts +75 -0
  104. package/types/Inputs/SpecialKeyCodes.d.ts +14 -0
  105. package/types/Inputs/TouchController.d.ts +53 -0
  106. package/types/Inputs/XRGamepadController.d.ts +15 -0
  107. package/types/PeerConnectionController/AggregatedStats.d.ts +77 -0
  108. package/types/PeerConnectionController/CandidatePairStats.d.ts +15 -0
  109. package/types/PeerConnectionController/CandidateStat.d.ts +11 -0
  110. package/types/PeerConnectionController/CodecStats.d.ts +14 -0
  111. package/types/PeerConnectionController/DataChannelStats.d.ts +15 -0
  112. package/types/PeerConnectionController/InboundRTPStats.d.ts +141 -0
  113. package/types/PeerConnectionController/InboundTrackStats.d.ts +32 -0
  114. package/types/PeerConnectionController/OutBoundRTPStats.d.ts +23 -0
  115. package/types/PeerConnectionController/PeerConnectionController.d.ts +132 -0
  116. package/types/PeerConnectionController/SessionStats.d.ts +8 -0
  117. package/types/PeerConnectionController/StreamStats.d.ts +9 -0
  118. package/types/PixelStreaming/PixelStreaming.d.ts +259 -0
  119. package/types/UI/OnScreenKeyboard.d.ts +31 -0
  120. package/types/UeInstanceMessage/ResponseController.d.ts +19 -0
  121. package/types/UeInstanceMessage/SendMessageController.d.ts +18 -0
  122. package/types/UeInstanceMessage/StreamMessageController.d.ts +29 -0
  123. package/types/UeInstanceMessage/ToStreamerMessagesController.d.ts +32 -0
  124. package/types/Util/CoordinateConverter.d.ts +100 -0
  125. package/types/Util/EventEmitter.d.ts +422 -0
  126. package/types/Util/EventListenerTracker.d.ts +14 -0
  127. package/types/Util/FileUtil.d.ts +32 -0
  128. package/types/Util/RTCUtils.d.ts +8 -0
  129. package/types/Util/WebGLUtils.d.ts +4 -0
  130. package/types/Util/WebXRUtils.d.ts +9 -0
  131. package/types/VideoPlayer/StreamController.d.ts +24 -0
  132. package/types/VideoPlayer/VideoPlayer.d.ts +78 -0
  133. package/types/WebRtcPlayer/WebRtcPlayerController.d.ts +377 -0
  134. package/types/WebXR/WebXRController.d.ts +26 -0
  135. package/types/pixelstreamingfrontend.d.ts +22 -0
  136. package/webpack.common.js +35 -0
  137. package/webpack.dev.js +35 -0
  138. package/webpack.prod.js +36 -0
@@ -0,0 +1,611 @@
1
+ import {
2
+ FlagsIds,
3
+ NumericParametersIds,
4
+ OptionParametersIds,
5
+ TextParametersIds
6
+ } from '../Config/Config';
7
+ import { LatencyTestResults } from '../DataChannel/LatencyTestResults';
8
+ import { AggregatedStats } from '../PeerConnectionController/AggregatedStats';
9
+ import { InitialSettings } from '../pixelstreamingfrontend';
10
+ import { MessageReceive } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.5';
11
+ import { SettingFlag } from '../Config/SettingFlag';
12
+ import { SettingNumber } from '../Config/SettingNumber';
13
+ import { SettingText } from '../Config/SettingText';
14
+ import { SettingOption } from '../Config/SettingOption';
15
+ import {
16
+ DataChannelLatencyTestResponse,
17
+ DataChannelLatencyTestResult
18
+ } from "../DataChannel/DataChannelLatencyTestResults";
19
+
20
+ /**
21
+ * An event that is emitted when AFK disconnect is about to happen.
22
+ * Can be cancelled by calling the callback function provided as part of the event.
23
+ */
24
+ export class AfkWarningActivateEvent extends Event {
25
+ readonly type: 'afkWarningActivate';
26
+ readonly data: {
27
+ /** How many seconds until the session is disconnected */
28
+ countDown: number;
29
+ /** Callback function that needs to be called if you wish to cancel the AFK disconnect timeout. */
30
+ dismissAfk: () => void;
31
+ };
32
+ constructor(data: AfkWarningActivateEvent['data']) {
33
+ super('afkWarningActivate');
34
+ this.data = data;
35
+ }
36
+ }
37
+
38
+ /**
39
+ * An event that is emitted when the AFK disconnect countdown is updated.
40
+ */
41
+ export class AfkWarningUpdateEvent extends Event {
42
+ readonly type: 'afkWarningUpdate';
43
+ readonly data: {
44
+ /** How many seconds until the session is disconnected */
45
+ countDown: number
46
+ };
47
+ constructor(data: AfkWarningUpdateEvent['data']) {
48
+ super('afkWarningUpdate');
49
+ this.data = data;
50
+ }
51
+ }
52
+
53
+ /**
54
+ * An event that is emitted when AFK warning is deactivated.
55
+ */
56
+ export class AfkWarningDeactivateEvent extends Event {
57
+ readonly type: 'afkWarningDeactivate';
58
+ constructor() {
59
+ super('afkWarningDeactivate');
60
+ }
61
+ }
62
+
63
+ /**
64
+ * An event that is emitted when AFK countdown reaches 0 and the user is disconnected.
65
+ */
66
+ export class AfkTimedOutEvent extends Event {
67
+ readonly type: 'afkTimedOut';
68
+ constructor() {
69
+ super('afkTimedOut');
70
+ }
71
+ }
72
+
73
+ /**
74
+ * An event that is emitted when we receive new video quality value.
75
+ */
76
+ export class VideoEncoderAvgQPEvent extends Event {
77
+ readonly type: 'videoEncoderAvgQP';
78
+ readonly data: {
79
+ /** Average video quality value */
80
+ avgQP: number
81
+ };
82
+ constructor(data: VideoEncoderAvgQPEvent['data']) {
83
+ super('videoEncoderAvgQP');
84
+ this.data = data;
85
+ }
86
+ }
87
+
88
+ /**
89
+ * An event that is emitted after a WebRtc connection has been negotiated.
90
+ */
91
+ export class WebRtcSdpEvent extends Event {
92
+ readonly type: 'webRtcSdp';
93
+ constructor() {
94
+ super('webRtcSdp');
95
+ }
96
+ }
97
+
98
+ /**
99
+ * An event that is emitted when auto connecting.
100
+ */
101
+ export class WebRtcAutoConnectEvent extends Event {
102
+ readonly type: 'webRtcAutoConnect';
103
+ constructor() {
104
+ super('webRtcAutoConnect');
105
+ }
106
+ }
107
+
108
+ /**
109
+ * An event that is emitted when sending a WebRtc offer.
110
+ */
111
+ export class WebRtcConnectingEvent extends Event {
112
+ readonly type: 'webRtcConnecting';
113
+ constructor() {
114
+ super('webRtcConnecting');
115
+ }
116
+ }
117
+
118
+ /**
119
+ * An event that is emitted when WebRtc connection has been established.
120
+ */
121
+ export class WebRtcConnectedEvent extends Event {
122
+ readonly type: 'webRtcConnected';
123
+ constructor() {
124
+ super('webRtcConnected');
125
+ }
126
+ }
127
+
128
+ /**
129
+ * An event that is emitted if WebRtc connection has failed.
130
+ */
131
+ export class WebRtcFailedEvent extends Event {
132
+ readonly type: 'webRtcFailed';
133
+ constructor() {
134
+ super('webRtcFailed');
135
+ }
136
+ }
137
+
138
+ /**
139
+ * An event that is emitted if WebRtc connection is disconnected.
140
+ */
141
+ export class WebRtcDisconnectedEvent extends Event {
142
+ readonly type: 'webRtcDisconnected';
143
+ readonly data: {
144
+ /** Message describing the disconnect reason */
145
+ eventString: string;
146
+ /** true if the user is able to reconnect, false if disconnected because of unrecoverable reasons like not able to connect to the signaling server */
147
+ allowClickToReconnect: boolean;
148
+ };
149
+ constructor(data: WebRtcDisconnectedEvent['data']) {
150
+ super('webRtcDisconnected');
151
+ this.data = data;
152
+ }
153
+ }
154
+
155
+ /**
156
+ * An event that is emitted when RTCDataChannel is opened.
157
+ */
158
+ export class DataChannelOpenEvent extends Event {
159
+ readonly type: 'dataChannelOpen';
160
+ readonly data: {
161
+ /** Data channel label. One of 'datachannel', 'send-datachannel', 'recv-datachannel' */
162
+ label: string;
163
+ /** RTCDataChannel onOpen event */
164
+ event: Event
165
+ };
166
+ constructor(data: DataChannelOpenEvent['data']) {
167
+ super('dataChannelOpen');
168
+ this.data = data;
169
+ }
170
+ }
171
+
172
+ /**
173
+ * An event that is emitted when RTCDataChannel is closed.
174
+ */
175
+ export class DataChannelCloseEvent extends Event {
176
+ readonly type: 'dataChannelClose';
177
+ readonly data: {
178
+ /** Data channel label. One of 'datachannel', 'send-datachannel', 'recv-datachannel' */
179
+ label: string;
180
+ /** RTCDataChannel onClose event */
181
+ event: Event
182
+ };
183
+ constructor(data: DataChannelCloseEvent['data']) {
184
+ super('dataChannelClose');
185
+ this.data = data;
186
+ }
187
+ }
188
+
189
+ /**
190
+ * An event that is emitted on RTCDataChannel errors.
191
+ */
192
+ export class DataChannelErrorEvent extends Event {
193
+ readonly type: 'dataChannelError';
194
+ readonly data: {
195
+ /** Data channel label. One of 'datachannel', 'send-datachannel', 'recv-datachannel' */
196
+ label: string;
197
+ /** RTCDataChannel onError event */
198
+ event: Event
199
+ };
200
+ constructor(data: DataChannelErrorEvent['data']) {
201
+ super('dataChannelError');
202
+ this.data = data;
203
+ }
204
+ }
205
+
206
+ /**
207
+ * An event that is emitted when the video stream has been initialized.
208
+ */
209
+ export class VideoInitializedEvent extends Event {
210
+ readonly type: 'videoInitialized';
211
+ constructor() {
212
+ super('videoInitialized');
213
+ }
214
+ }
215
+
216
+ /**
217
+ * An event that is emitted when video stream loading starts.
218
+ */
219
+ export class StreamLoadingEvent extends Event {
220
+ readonly type: 'streamLoading';
221
+ constructor() {
222
+ super('streamLoading');
223
+ }
224
+ }
225
+
226
+ /**
227
+ * An event that is emitted when video stream loading has finished.
228
+ */
229
+ export class StreamPreConnectEvent extends Event {
230
+ readonly type: 'streamConnect';
231
+ constructor() {
232
+ super('streamConnect');
233
+ }
234
+ }
235
+
236
+ /**
237
+ * An event that is emitted when video stream has stopped.
238
+ */
239
+ export class StreamPreDisconnectEvent extends Event {
240
+ readonly type: 'streamDisconnect';
241
+ constructor() {
242
+ super('streamDisconnect');
243
+ }
244
+ }
245
+
246
+ /**
247
+ * An event that is emitted when video stream is reconnecting.
248
+ */
249
+ export class StreamReconnectEvent extends Event {
250
+ readonly type: 'streamReconnect';
251
+ constructor() {
252
+ super('streamReconnect');
253
+ }
254
+ }
255
+
256
+ /**
257
+ * An event that is emitted if there are errors loading the video stream.
258
+ */
259
+ export class PlayStreamErrorEvent extends Event {
260
+ readonly type: 'playStreamError';
261
+ readonly data: {
262
+ /** Error message */
263
+ message: string
264
+ };
265
+ constructor(data: PlayStreamErrorEvent['data']) {
266
+ super('playStreamError');
267
+ this.data = data;
268
+ }
269
+ }
270
+
271
+ /**
272
+ * An event that is emitted before trying to start video playback.
273
+ */
274
+ export class PlayStreamEvent extends Event {
275
+ readonly type: 'playStream';
276
+ constructor() {
277
+ super('playStream');
278
+ }
279
+ }
280
+
281
+ /**
282
+ * An event that is emitted if the browser rejects video playback. Can happen for example if
283
+ * video auto-play without user interaction is refused by the browser.
284
+ */
285
+ export class PlayStreamRejectedEvent extends Event {
286
+ readonly type: 'playStreamRejected';
287
+ readonly data: {
288
+ /** Rejection reason */
289
+ reason: unknown
290
+ };
291
+ constructor(data: PlayStreamRejectedEvent['data']) {
292
+ super('playStreamRejected');
293
+ this.data = data;
294
+ }
295
+ }
296
+
297
+ /**
298
+ * An event that is emitted when receiving a full FreezeFrame image from UE.
299
+ */
300
+ export class LoadFreezeFrameEvent extends Event {
301
+ readonly type: 'loadFreezeFrame';
302
+ readonly data: {
303
+ /** true if should show click-to-play overlay, not the freeze frame contents */
304
+ shouldShowPlayOverlay: boolean;
305
+ /** true if the received image is valid */
306
+ isValid: boolean;
307
+ /** Image data. Can be e.g. displayed by encoding as a data url. */
308
+ jpegData?: Uint8Array;
309
+ };
310
+ constructor(data: LoadFreezeFrameEvent['data']) {
311
+ super('loadFreezeFrame');
312
+ this.data = data;
313
+ }
314
+ }
315
+
316
+ /**
317
+ * An event that is emitted when receiving UnfreezeFrame message from UE and video playback is about to be resumed.
318
+ */
319
+ export class HideFreezeFrameEvent extends Event {
320
+ readonly type: 'hideFreezeFrame';
321
+ constructor() {
322
+ super('hideFreezeFrame');
323
+ }
324
+ }
325
+
326
+ /**
327
+ * An event that is emitted when receiving WebRTC statistics.
328
+ */
329
+ export class StatsReceivedEvent extends Event {
330
+ readonly type: 'statsReceived';
331
+ readonly data: {
332
+ /** Statistics object */
333
+ aggregatedStats: AggregatedStats
334
+ };
335
+ constructor(data: StatsReceivedEvent['data']) {
336
+ super('statsReceived');
337
+ this.data = data;
338
+ }
339
+ }
340
+
341
+ /**
342
+ * An event that is emitted when streamer list changes.
343
+ */
344
+ export class StreamerListMessageEvent extends Event {
345
+ readonly type: 'streamerListMessage';
346
+ readonly data: {
347
+ /** Streamer list message containing an array of streamer ids */
348
+ messageStreamerList: MessageReceive.MessageStreamerList;
349
+ /** Auto-selected streamer from the list, or null if unable to auto-select and user should be prompted to select */
350
+ autoSelectedStreamerId: string;
351
+ /** Wanted streamer id from various configurations. */
352
+ wantedStreamerId: string;
353
+ };
354
+ constructor(data: StreamerListMessageEvent['data']) {
355
+ super('streamerListMessage');
356
+ this.data = data;
357
+ }
358
+ }
359
+
360
+ /**
361
+ * An event that is emitted when a subscribed to streamer's id changes.
362
+ */
363
+ export class StreamerIDChangedMessageEvent extends Event {
364
+ readonly type: 'streamerIDChangedMessage';
365
+ readonly data: {
366
+ /** The new ID of the streamer. */
367
+ newID: string;
368
+ };
369
+ constructor(data: StreamerIDChangedMessageEvent['data']) {
370
+ super('StreamerIDChangedMessage');
371
+ this.data = data;
372
+ }
373
+ }
374
+
375
+ /**
376
+ * An event that is emitted when receiving latency test results.
377
+ */
378
+ export class LatencyTestResultEvent extends Event {
379
+ readonly type: 'latencyTestResult';
380
+ readonly data: {
381
+ /** Latency test result object */
382
+ latencyTimings: LatencyTestResults
383
+ };
384
+ constructor(data: LatencyTestResultEvent['data']) {
385
+ super('latencyTestResult');
386
+ this.data = data;
387
+ }
388
+ }
389
+
390
+ /**
391
+ * An event that is emitted when receiving data channel latency test response from server.
392
+ * This event is handled by DataChannelLatencyTestController
393
+ */
394
+ export class DataChannelLatencyTestResponseEvent extends Event {
395
+ readonly type: 'dataChannelLatencyTestResponse';
396
+ readonly data: {
397
+ /** Latency test result object */
398
+ response: DataChannelLatencyTestResponse
399
+ };
400
+ constructor(data: DataChannelLatencyTestResponseEvent['data']) {
401
+ super('dataChannelLatencyTestResponse');
402
+ this.data = data;
403
+ }
404
+ }
405
+
406
+ /**
407
+ * An event that is emitted when data channel latency test results are ready.
408
+ */
409
+ export class DataChannelLatencyTestResultEvent extends Event {
410
+ readonly type: 'dataChannelLatencyTestResult';
411
+ readonly data: {
412
+ /** Latency test result object */
413
+ result: DataChannelLatencyTestResult
414
+ };
415
+ constructor(data: DataChannelLatencyTestResultEvent['data']) {
416
+ super('dataChannelLatencyTestResult');
417
+ this.data = data;
418
+ }
419
+ }
420
+
421
+ /**
422
+ * An event that is emitted when receiving initial settings from UE.
423
+ */
424
+ export class InitialSettingsEvent extends Event {
425
+ readonly type: 'initialSettings';
426
+ readonly data: {
427
+ /** Initial settings from UE */
428
+ settings: InitialSettings
429
+ };
430
+ constructor(data: InitialSettingsEvent['data']) {
431
+ super('initialSettings');
432
+ this.data = data;
433
+ }
434
+ }
435
+
436
+ export type SettingsData =
437
+ | {
438
+ /** Flag id */
439
+ id: FlagsIds;
440
+ type: 'flag';
441
+ /** Flag value */
442
+ value: boolean;
443
+ /** SettingFlag object */
444
+ target: SettingFlag;
445
+ }
446
+ | {
447
+ /** Numeric setting id */
448
+ id: NumericParametersIds;
449
+ type: 'number';
450
+ /** Numeric setting value */
451
+ value: number;
452
+ /** SettingNumber object */
453
+ target: SettingNumber;
454
+ }
455
+ | {
456
+ /** Text setting id */
457
+ id: TextParametersIds;
458
+ type: 'text';
459
+ /** Text setting value */
460
+ value: string;
461
+ /** SettingText object */
462
+ target: SettingText;
463
+ }
464
+ | {
465
+ /** Option setting id */
466
+ id: OptionParametersIds;
467
+ type: 'option';
468
+ /** Option setting selected value */
469
+ value: string;
470
+ /** SettingOption object */
471
+ target: SettingOption;
472
+ };
473
+
474
+ /**
475
+ * An event that is emitted when PixelStreaming settings change.
476
+ */
477
+ export class SettingsChangedEvent extends Event {
478
+ readonly type: 'settingsChanged';
479
+ readonly data: SettingsData;
480
+ constructor(data: SettingsChangedEvent['data']) {
481
+ super('settingsChanged');
482
+ this.data = data;
483
+ }
484
+ }
485
+
486
+ /**
487
+ * Event emitted when an XR Session starts
488
+ */
489
+ export class XrSessionStartedEvent extends Event {
490
+ readonly type: 'xrSessionStarted';
491
+ constructor() {
492
+ super('xrSessionStarted');
493
+ }
494
+ }
495
+
496
+ /**
497
+ * Event emitted when an XR Session ends
498
+ */
499
+ export class XrSessionEndedEvent extends Event {
500
+ readonly type: 'xrSessionEnded';
501
+ constructor() {
502
+ super('xrSessionEnded');
503
+ }
504
+ }
505
+
506
+ export type XrFrameData = {
507
+ /** The frame timestamp */
508
+ time: DOMHighResTimeStamp;
509
+ /** The XRFrame */
510
+ frame: XRFrame;
511
+ };
512
+
513
+ /**
514
+ * Event emitted when an XR Frame is complete
515
+ */
516
+ export class XrFrameEvent extends Event {
517
+ readonly type: 'xrFrame';
518
+ readonly data: XrFrameData
519
+ constructor(data: XrFrameEvent['data']) {
520
+ super('xrFrame');
521
+ this.data = data;
522
+ }
523
+ }
524
+
525
+ /**
526
+ * An event that is emitted when receiving a player count from the signalling server
527
+ */
528
+ export class PlayerCountEvent extends Event {
529
+ readonly type: 'playerCount';
530
+ readonly data: {
531
+ /** count object */
532
+ count: number
533
+ };
534
+ constructor(data: PlayerCountEvent['data']) {
535
+ super('playerCount');
536
+ this.data = data;
537
+ }
538
+ }
539
+
540
+ export type PixelStreamingEvent =
541
+ | AfkWarningActivateEvent
542
+ | AfkWarningUpdateEvent
543
+ | AfkWarningDeactivateEvent
544
+ | AfkTimedOutEvent
545
+ | VideoEncoderAvgQPEvent
546
+ | WebRtcSdpEvent
547
+ | WebRtcAutoConnectEvent
548
+ | WebRtcConnectingEvent
549
+ | WebRtcConnectedEvent
550
+ | WebRtcFailedEvent
551
+ | WebRtcDisconnectedEvent
552
+ | DataChannelOpenEvent
553
+ | DataChannelCloseEvent
554
+ | DataChannelErrorEvent
555
+ | VideoInitializedEvent
556
+ | StreamLoadingEvent
557
+ | StreamPreConnectEvent
558
+ | StreamReconnectEvent
559
+ | StreamPreDisconnectEvent
560
+ | PlayStreamErrorEvent
561
+ | PlayStreamEvent
562
+ | PlayStreamRejectedEvent
563
+ | LoadFreezeFrameEvent
564
+ | HideFreezeFrameEvent
565
+ | StatsReceivedEvent
566
+ | StreamerListMessageEvent
567
+ | StreamerIDChangedMessageEvent
568
+ | LatencyTestResultEvent
569
+ | DataChannelLatencyTestResponseEvent
570
+ | DataChannelLatencyTestResultEvent
571
+ | InitialSettingsEvent
572
+ | SettingsChangedEvent
573
+ | XrSessionStartedEvent
574
+ | XrSessionEndedEvent
575
+ | XrFrameEvent
576
+ | PlayerCountEvent;
577
+
578
+ export class EventEmitter extends EventTarget {
579
+ /**
580
+ * Dispatch a new event.
581
+ * @param e event
582
+ * @returns
583
+ */
584
+ public dispatchEvent(e: PixelStreamingEvent): boolean {
585
+ return super.dispatchEvent(e);
586
+ }
587
+
588
+ /**
589
+ * Register an event handler.
590
+ * @param type event name
591
+ * @param listener event handler function
592
+ */
593
+ public addEventListener<
594
+ T extends PixelStreamingEvent['type'],
595
+ E extends PixelStreamingEvent & { type: T }
596
+ >(type: T, listener: (e: Event & E) => void) {
597
+ super.addEventListener(type, listener);
598
+ }
599
+
600
+ /**
601
+ * Remove an event handler.
602
+ * @param type event name
603
+ * @param listener event handler function
604
+ */
605
+ public removeEventListener<
606
+ T extends PixelStreamingEvent['type'],
607
+ E extends PixelStreamingEvent & { type: T }
608
+ >(type: T, listener: (e: Event & E) => void) {
609
+ super.removeEventListener(type, listener);
610
+ }
611
+ }
@@ -0,0 +1,29 @@
1
+ // Copyright Epic Games, Inc. All Rights Reserved.
2
+
3
+ export type UnregisterFunction = () => void;
4
+
5
+ export class EventListenerTracker {
6
+ private unregisterCallbacks: UnregisterFunction[];
7
+
8
+ constructor() {
9
+ this.unregisterCallbacks = [];
10
+ }
11
+
12
+ /**
13
+ * Add a new callback that is executed when unregisterAll is called.
14
+ * @param callback
15
+ */
16
+ addUnregisterCallback(callback: UnregisterFunction) {
17
+ this.unregisterCallbacks.push(callback);
18
+ }
19
+
20
+ /**
21
+ * Execute all callbacks and clear the list.
22
+ */
23
+ unregisterAll() {
24
+ for (const callback of this.unregisterCallbacks) {
25
+ callback();
26
+ }
27
+ this.unregisterCallbacks = [];
28
+ }
29
+ }