@epicgames-ps/lib-pixelstreamingfrontend-ue5.5 0.4.4 → 0.4.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.
- package/dist/commonjs/Inputs/GamepadController.js +24 -13
- package/dist/commonjs/Inputs/GamepadController.js.map +1 -1
- package/dist/commonjs/Util/FileUtil.js +16 -12
- package/dist/commonjs/Util/FileUtil.js.map +1 -1
- package/dist/esm/Inputs/GamepadController.js +24 -13
- package/dist/esm/Inputs/GamepadController.js.map +1 -1
- package/dist/esm/Util/FileUtil.js +16 -12
- package/dist/esm/Util/FileUtil.js.map +1 -1
- package/dist/types/Util/FileUtil.d.ts +1 -1
- package/package.json +1 -1
- package/src/Inputs/GamepadController.ts +25 -13
- package/src/Util/FileUtil.ts +18 -13
|
@@ -72,7 +72,7 @@ class GamepadController {
|
|
|
72
72
|
window.removeEventListener('webkitgamepadconnected', this.onGamepadConnectedListener);
|
|
73
73
|
window.removeEventListener('webkitgamepaddisconnected', this.onGamepadDisconnectedListener);
|
|
74
74
|
for (const controller of this.controllers) {
|
|
75
|
-
if (controller.id !== undefined) {
|
|
75
|
+
if (controller && controller.id !== undefined) {
|
|
76
76
|
this.streamMessageController.toStreamerHandlers.get('GamepadDisconnected')([controller.id]);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
@@ -80,7 +80,7 @@ class GamepadController {
|
|
|
80
80
|
}
|
|
81
81
|
onGamepadResponseReceived(gamepadId) {
|
|
82
82
|
for (const controller of this.controllers) {
|
|
83
|
-
if (controller.id === undefined) {
|
|
83
|
+
if (controller && controller.id === undefined) {
|
|
84
84
|
controller.id = gamepadId;
|
|
85
85
|
break;
|
|
86
86
|
}
|
|
@@ -102,7 +102,11 @@ class GamepadController {
|
|
|
102
102
|
const deletedController = this.controllers[gamepad.index];
|
|
103
103
|
delete this.controllers[gamepad.index];
|
|
104
104
|
this.controllers = this.controllers.filter((controller) => controller !== undefined);
|
|
105
|
-
|
|
105
|
+
if (deletedController.id) {
|
|
106
|
+
this.streamMessageController.toStreamerHandlers.get('GamepadDisconnected')([
|
|
107
|
+
deletedController.id
|
|
108
|
+
]);
|
|
109
|
+
}
|
|
106
110
|
}
|
|
107
111
|
scanGamepads() {
|
|
108
112
|
const gamepads = navigator.getGamepads
|
|
@@ -111,7 +115,7 @@ class GamepadController {
|
|
|
111
115
|
? navigator.webkitGetGamepads()
|
|
112
116
|
: [];
|
|
113
117
|
for (let i = 0; i < gamepads.length; i++) {
|
|
114
|
-
if (gamepads[i] && gamepads[i].index
|
|
118
|
+
if (gamepads[i] && this.controllers[gamepads[i].index] !== undefined) {
|
|
115
119
|
this.controllers[gamepads[i].index].currentState = gamepads[i];
|
|
116
120
|
}
|
|
117
121
|
}
|
|
@@ -121,8 +125,11 @@ class GamepadController {
|
|
|
121
125
|
const toStreamerHandlers = this.streamMessageController.toStreamerHandlers;
|
|
122
126
|
// Iterate over multiple controllers in the case the multiple gamepads are connected
|
|
123
127
|
for (const controller of this.controllers) {
|
|
128
|
+
if (!controller) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
124
131
|
// If we haven't received an id (possible if using an older version of UE), return to original functionality
|
|
125
|
-
const
|
|
132
|
+
const controllerId = controller.id === undefined ? this.controllers.indexOf(controller) : controller.id;
|
|
126
133
|
const currentState = controller.currentState;
|
|
127
134
|
for (let i = 0; i < controller.currentState.buttons.length; i++) {
|
|
128
135
|
const currentButton = controller.currentState.buttons[i];
|
|
@@ -131,15 +138,15 @@ class GamepadController {
|
|
|
131
138
|
// press
|
|
132
139
|
if (i == GamepadLayout.LeftTrigger) {
|
|
133
140
|
// UEs left analog has a button index of 5
|
|
134
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
141
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 5, currentButton.value]);
|
|
135
142
|
}
|
|
136
143
|
else if (i == GamepadLayout.RightTrigger) {
|
|
137
144
|
// UEs right analog has a button index of 6
|
|
138
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
145
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 6, currentButton.value]);
|
|
139
146
|
}
|
|
140
147
|
else {
|
|
141
148
|
toStreamerHandlers.get('GamepadButtonPressed')([
|
|
142
|
-
|
|
149
|
+
controllerId,
|
|
143
150
|
i,
|
|
144
151
|
previousButton.pressed ? 1 : 0
|
|
145
152
|
]);
|
|
@@ -149,14 +156,14 @@ class GamepadController {
|
|
|
149
156
|
// release
|
|
150
157
|
if (i == GamepadLayout.LeftTrigger) {
|
|
151
158
|
// UEs left analog has a button index of 5
|
|
152
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
159
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 5, 0]);
|
|
153
160
|
}
|
|
154
161
|
else if (i == GamepadLayout.RightTrigger) {
|
|
155
162
|
// UEs right analog has a button index of 6
|
|
156
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
163
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 6, 0]);
|
|
157
164
|
}
|
|
158
165
|
else {
|
|
159
|
-
toStreamerHandlers.get('GamepadButtonReleased')([
|
|
166
|
+
toStreamerHandlers.get('GamepadButtonReleased')([controllerId, i, 0]);
|
|
160
167
|
}
|
|
161
168
|
}
|
|
162
169
|
}
|
|
@@ -168,9 +175,10 @@ class GamepadController {
|
|
|
168
175
|
// https://w3c.github.io/gamepad/#remapping Gamepad browser side standard mapping has positive down, negative up. This is downright disgusting. So we fix it.
|
|
169
176
|
const y = -parseFloat(currentState.axes[i + 1].toFixed(4));
|
|
170
177
|
// UE's analog axes follow the same order as the browsers, but start at index 1 so we will offset as such
|
|
171
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
172
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
178
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, i + 1, x]); // Horizontal axes, only offset by 1
|
|
179
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, i + 2, y]); // Vertical axes, offset by two (1 to match UEs axes convention and then another 1 for the vertical axes)
|
|
173
180
|
}
|
|
181
|
+
const controllerIndex = this.controllers.indexOf(controller);
|
|
174
182
|
this.controllers[controllerIndex].prevState = (0, GamepadTypes_1.deepCopyGamepad)(currentState);
|
|
175
183
|
}
|
|
176
184
|
if (this.controllers.length > 0) {
|
|
@@ -181,6 +189,9 @@ class GamepadController {
|
|
|
181
189
|
// When a user navigates away from the page, we need to inform UE of all the disconnecting
|
|
182
190
|
// controllers
|
|
183
191
|
for (const controller of this.controllers) {
|
|
192
|
+
if (!controller || !controller.id) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
184
195
|
this.streamMessageController.toStreamerHandlers.get('GamepadDisconnected')([controller.id]);
|
|
185
196
|
}
|
|
186
197
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GamepadController.js","sourceRoot":"","sources":["../../../src/Inputs/GamepadController.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"GamepadController.js","sourceRoot":"","sources":["../../../src/Inputs/GamepadController.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ class FileUtil {
|
|
|
18
18
|
file.extension = '';
|
|
19
19
|
file.receiving = true;
|
|
20
20
|
file.valid = false;
|
|
21
|
-
file.
|
|
21
|
+
file.chunks = 0;
|
|
22
22
|
file.data = [];
|
|
23
23
|
file.timestampStart = new Date().getTime();
|
|
24
24
|
lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Received first chunk of file');
|
|
@@ -38,7 +38,7 @@ class FileUtil {
|
|
|
38
38
|
file.extension = '';
|
|
39
39
|
file.receiving = true;
|
|
40
40
|
file.valid = false;
|
|
41
|
-
file.
|
|
41
|
+
file.chunks = 0;
|
|
42
42
|
file.data = [];
|
|
43
43
|
file.timestampStart = new Date().getTime();
|
|
44
44
|
lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Received first chunk of file');
|
|
@@ -55,21 +55,25 @@ class FileUtil {
|
|
|
55
55
|
// If we haven't received the initial setup instructions, return
|
|
56
56
|
if (!file.receiving)
|
|
57
57
|
return;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
const typeSize = 1;
|
|
59
|
+
const intSize = 4;
|
|
60
|
+
const maxMessageSize = 16 * 1024;
|
|
61
|
+
const headerSize = typeSize + intSize;
|
|
62
|
+
const maxPayloadSize = maxMessageSize - headerSize;
|
|
63
|
+
// Calculate total number of chunks from the total file size
|
|
64
|
+
file.chunks = Math.ceil(new DataView(view.slice(typeSize, headerSize).buffer).getInt32(0, true) / maxPayloadSize);
|
|
61
65
|
// Get the file part of the payload
|
|
62
|
-
const fileBytes = view.slice(
|
|
66
|
+
const fileBytes = view.slice(headerSize);
|
|
63
67
|
// Append to existing data that holds the file
|
|
64
68
|
file.data.push(fileBytes);
|
|
65
69
|
// Uncomment for debug
|
|
66
|
-
lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Received file chunk: ${file.data.length}/${file.
|
|
67
|
-
if (file.data.length === file.
|
|
70
|
+
lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Received file chunk: ${file.data.length}/${file.chunks}`);
|
|
71
|
+
if (file.data.length === file.chunks) {
|
|
68
72
|
file.receiving = false;
|
|
69
73
|
file.valid = true;
|
|
70
74
|
lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Received complete file');
|
|
71
75
|
const transferDuration = new Date().getTime() - file.timestampStart;
|
|
72
|
-
const transferBitrate = Math.round((file.
|
|
76
|
+
const transferBitrate = Math.round((file.chunks * maxMessageSize) / transferDuration);
|
|
73
77
|
lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Average transfer bitrate: ${transferBitrate}kb/s over ${transferDuration / 1000} seconds`);
|
|
74
78
|
// File reconstruction
|
|
75
79
|
/**
|
|
@@ -85,9 +89,9 @@ class FileUtil {
|
|
|
85
89
|
// if you are so inclined to make it auto-download, do something like: a.click();
|
|
86
90
|
a.remove();
|
|
87
91
|
}
|
|
88
|
-
else if (file.data.length > file.
|
|
92
|
+
else if (file.data.length > file.chunks) {
|
|
89
93
|
file.receiving = false;
|
|
90
|
-
lib_pixelstreamingcommon_ue5_5_1.Logger.Error(`Received bigger file than advertised: ${file.data.length}/${file.
|
|
94
|
+
lib_pixelstreamingcommon_ue5_5_1.Logger.Error(`Received bigger file than advertised: ${file.data.length}/${file.chunks}`);
|
|
91
95
|
}
|
|
92
96
|
}
|
|
93
97
|
}
|
|
@@ -100,7 +104,7 @@ class FileTemplate {
|
|
|
100
104
|
this.mimetype = '';
|
|
101
105
|
this.extension = '';
|
|
102
106
|
this.receiving = false;
|
|
103
|
-
this.
|
|
107
|
+
this.chunks = 0;
|
|
104
108
|
this.data = [];
|
|
105
109
|
this.valid = false;
|
|
106
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileUtil.js","sourceRoot":"","sources":["../../../src/Util/FileUtil.ts"],"names":[],"mappings":";AAAA,kDAAkD;;;AAElD,iGAAsE;AAEtE;;GAEG;AACH,MAAa,QAAQ;IACjB;;;OAGG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAgB,EAAE,IAAkB;QAC7D,wEAAwE;QACxE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"FileUtil.js","sourceRoot":"","sources":["../../../src/Util/FileUtil.ts"],"names":[],"mappings":"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"}
|
|
@@ -72,7 +72,7 @@ class GamepadController {
|
|
|
72
72
|
window.removeEventListener('webkitgamepadconnected', this.onGamepadConnectedListener);
|
|
73
73
|
window.removeEventListener('webkitgamepaddisconnected', this.onGamepadDisconnectedListener);
|
|
74
74
|
for (const controller of this.controllers) {
|
|
75
|
-
if (controller.id !== undefined) {
|
|
75
|
+
if (controller && controller.id !== undefined) {
|
|
76
76
|
this.streamMessageController.toStreamerHandlers.get('GamepadDisconnected')([controller.id]);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
@@ -80,7 +80,7 @@ class GamepadController {
|
|
|
80
80
|
}
|
|
81
81
|
onGamepadResponseReceived(gamepadId) {
|
|
82
82
|
for (const controller of this.controllers) {
|
|
83
|
-
if (controller.id === undefined) {
|
|
83
|
+
if (controller && controller.id === undefined) {
|
|
84
84
|
controller.id = gamepadId;
|
|
85
85
|
break;
|
|
86
86
|
}
|
|
@@ -102,7 +102,11 @@ class GamepadController {
|
|
|
102
102
|
const deletedController = this.controllers[gamepad.index];
|
|
103
103
|
delete this.controllers[gamepad.index];
|
|
104
104
|
this.controllers = this.controllers.filter((controller) => controller !== undefined);
|
|
105
|
-
|
|
105
|
+
if (deletedController.id) {
|
|
106
|
+
this.streamMessageController.toStreamerHandlers.get('GamepadDisconnected')([
|
|
107
|
+
deletedController.id
|
|
108
|
+
]);
|
|
109
|
+
}
|
|
106
110
|
}
|
|
107
111
|
scanGamepads() {
|
|
108
112
|
const gamepads = navigator.getGamepads
|
|
@@ -111,7 +115,7 @@ class GamepadController {
|
|
|
111
115
|
? navigator.webkitGetGamepads()
|
|
112
116
|
: [];
|
|
113
117
|
for (let i = 0; i < gamepads.length; i++) {
|
|
114
|
-
if (gamepads[i] && gamepads[i].index
|
|
118
|
+
if (gamepads[i] && this.controllers[gamepads[i].index] !== undefined) {
|
|
115
119
|
this.controllers[gamepads[i].index].currentState = gamepads[i];
|
|
116
120
|
}
|
|
117
121
|
}
|
|
@@ -121,8 +125,11 @@ class GamepadController {
|
|
|
121
125
|
const toStreamerHandlers = this.streamMessageController.toStreamerHandlers;
|
|
122
126
|
// Iterate over multiple controllers in the case the multiple gamepads are connected
|
|
123
127
|
for (const controller of this.controllers) {
|
|
128
|
+
if (!controller) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
124
131
|
// If we haven't received an id (possible if using an older version of UE), return to original functionality
|
|
125
|
-
const
|
|
132
|
+
const controllerId = controller.id === undefined ? this.controllers.indexOf(controller) : controller.id;
|
|
126
133
|
const currentState = controller.currentState;
|
|
127
134
|
for (let i = 0; i < controller.currentState.buttons.length; i++) {
|
|
128
135
|
const currentButton = controller.currentState.buttons[i];
|
|
@@ -131,15 +138,15 @@ class GamepadController {
|
|
|
131
138
|
// press
|
|
132
139
|
if (i == GamepadLayout.LeftTrigger) {
|
|
133
140
|
// UEs left analog has a button index of 5
|
|
134
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
141
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 5, currentButton.value]);
|
|
135
142
|
}
|
|
136
143
|
else if (i == GamepadLayout.RightTrigger) {
|
|
137
144
|
// UEs right analog has a button index of 6
|
|
138
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
145
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 6, currentButton.value]);
|
|
139
146
|
}
|
|
140
147
|
else {
|
|
141
148
|
toStreamerHandlers.get('GamepadButtonPressed')([
|
|
142
|
-
|
|
149
|
+
controllerId,
|
|
143
150
|
i,
|
|
144
151
|
previousButton.pressed ? 1 : 0
|
|
145
152
|
]);
|
|
@@ -149,14 +156,14 @@ class GamepadController {
|
|
|
149
156
|
// release
|
|
150
157
|
if (i == GamepadLayout.LeftTrigger) {
|
|
151
158
|
// UEs left analog has a button index of 5
|
|
152
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
159
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 5, 0]);
|
|
153
160
|
}
|
|
154
161
|
else if (i == GamepadLayout.RightTrigger) {
|
|
155
162
|
// UEs right analog has a button index of 6
|
|
156
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
163
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 6, 0]);
|
|
157
164
|
}
|
|
158
165
|
else {
|
|
159
|
-
toStreamerHandlers.get('GamepadButtonReleased')([
|
|
166
|
+
toStreamerHandlers.get('GamepadButtonReleased')([controllerId, i, 0]);
|
|
160
167
|
}
|
|
161
168
|
}
|
|
162
169
|
}
|
|
@@ -168,9 +175,10 @@ class GamepadController {
|
|
|
168
175
|
// https://w3c.github.io/gamepad/#remapping Gamepad browser side standard mapping has positive down, negative up. This is downright disgusting. So we fix it.
|
|
169
176
|
const y = -parseFloat(currentState.axes[i + 1].toFixed(4));
|
|
170
177
|
// UE's analog axes follow the same order as the browsers, but start at index 1 so we will offset as such
|
|
171
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
172
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
178
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, i + 1, x]); // Horizontal axes, only offset by 1
|
|
179
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, i + 2, y]); // Vertical axes, offset by two (1 to match UEs axes convention and then another 1 for the vertical axes)
|
|
173
180
|
}
|
|
181
|
+
const controllerIndex = this.controllers.indexOf(controller);
|
|
174
182
|
this.controllers[controllerIndex].prevState = (0, GamepadTypes_1.deepCopyGamepad)(currentState);
|
|
175
183
|
}
|
|
176
184
|
if (this.controllers.length > 0) {
|
|
@@ -181,6 +189,9 @@ class GamepadController {
|
|
|
181
189
|
// When a user navigates away from the page, we need to inform UE of all the disconnecting
|
|
182
190
|
// controllers
|
|
183
191
|
for (const controller of this.controllers) {
|
|
192
|
+
if (!controller || !controller.id) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
184
195
|
this.streamMessageController.toStreamerHandlers.get('GamepadDisconnected')([controller.id]);
|
|
185
196
|
}
|
|
186
197
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GamepadController.js","sourceRoot":"","sources":["../../../src/Inputs/GamepadController.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"GamepadController.js","sourceRoot":"","sources":["../../../src/Inputs/GamepadController.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ class FileUtil {
|
|
|
18
18
|
file.extension = '';
|
|
19
19
|
file.receiving = true;
|
|
20
20
|
file.valid = false;
|
|
21
|
-
file.
|
|
21
|
+
file.chunks = 0;
|
|
22
22
|
file.data = [];
|
|
23
23
|
file.timestampStart = new Date().getTime();
|
|
24
24
|
lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Received first chunk of file');
|
|
@@ -38,7 +38,7 @@ class FileUtil {
|
|
|
38
38
|
file.extension = '';
|
|
39
39
|
file.receiving = true;
|
|
40
40
|
file.valid = false;
|
|
41
|
-
file.
|
|
41
|
+
file.chunks = 0;
|
|
42
42
|
file.data = [];
|
|
43
43
|
file.timestampStart = new Date().getTime();
|
|
44
44
|
lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Received first chunk of file');
|
|
@@ -55,21 +55,25 @@ class FileUtil {
|
|
|
55
55
|
// If we haven't received the initial setup instructions, return
|
|
56
56
|
if (!file.receiving)
|
|
57
57
|
return;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
const typeSize = 1;
|
|
59
|
+
const intSize = 4;
|
|
60
|
+
const maxMessageSize = 16 * 1024;
|
|
61
|
+
const headerSize = typeSize + intSize;
|
|
62
|
+
const maxPayloadSize = maxMessageSize - headerSize;
|
|
63
|
+
// Calculate total number of chunks from the total file size
|
|
64
|
+
file.chunks = Math.ceil(new DataView(view.slice(typeSize, headerSize).buffer).getInt32(0, true) / maxPayloadSize);
|
|
61
65
|
// Get the file part of the payload
|
|
62
|
-
const fileBytes = view.slice(
|
|
66
|
+
const fileBytes = view.slice(headerSize);
|
|
63
67
|
// Append to existing data that holds the file
|
|
64
68
|
file.data.push(fileBytes);
|
|
65
69
|
// Uncomment for debug
|
|
66
|
-
lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Received file chunk: ${file.data.length}/${file.
|
|
67
|
-
if (file.data.length === file.
|
|
70
|
+
lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Received file chunk: ${file.data.length}/${file.chunks}`);
|
|
71
|
+
if (file.data.length === file.chunks) {
|
|
68
72
|
file.receiving = false;
|
|
69
73
|
file.valid = true;
|
|
70
74
|
lib_pixelstreamingcommon_ue5_5_1.Logger.Info('Received complete file');
|
|
71
75
|
const transferDuration = new Date().getTime() - file.timestampStart;
|
|
72
|
-
const transferBitrate = Math.round((file.
|
|
76
|
+
const transferBitrate = Math.round((file.chunks * maxMessageSize) / transferDuration);
|
|
73
77
|
lib_pixelstreamingcommon_ue5_5_1.Logger.Info(`Average transfer bitrate: ${transferBitrate}kb/s over ${transferDuration / 1000} seconds`);
|
|
74
78
|
// File reconstruction
|
|
75
79
|
/**
|
|
@@ -85,9 +89,9 @@ class FileUtil {
|
|
|
85
89
|
// if you are so inclined to make it auto-download, do something like: a.click();
|
|
86
90
|
a.remove();
|
|
87
91
|
}
|
|
88
|
-
else if (file.data.length > file.
|
|
92
|
+
else if (file.data.length > file.chunks) {
|
|
89
93
|
file.receiving = false;
|
|
90
|
-
lib_pixelstreamingcommon_ue5_5_1.Logger.Error(`Received bigger file than advertised: ${file.data.length}/${file.
|
|
94
|
+
lib_pixelstreamingcommon_ue5_5_1.Logger.Error(`Received bigger file than advertised: ${file.data.length}/${file.chunks}`);
|
|
91
95
|
}
|
|
92
96
|
}
|
|
93
97
|
}
|
|
@@ -100,7 +104,7 @@ class FileTemplate {
|
|
|
100
104
|
this.mimetype = '';
|
|
101
105
|
this.extension = '';
|
|
102
106
|
this.receiving = false;
|
|
103
|
-
this.
|
|
107
|
+
this.chunks = 0;
|
|
104
108
|
this.data = [];
|
|
105
109
|
this.valid = false;
|
|
106
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileUtil.js","sourceRoot":"","sources":["../../../src/Util/FileUtil.ts"],"names":[],"mappings":";AAAA,kDAAkD;;;AAElD,iGAAsE;AAEtE;;GAEG;AACH,MAAa,QAAQ;IACjB;;;OAGG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAgB,EAAE,IAAkB;QAC7D,wEAAwE;QACxE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"FileUtil.js","sourceRoot":"","sources":["../../../src/Util/FileUtil.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@epicgames-ps/lib-pixelstreamingfrontend-ue5.5",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"description": "Frontend library for Unreal Engine 5.5 Pixel Streaming",
|
|
5
5
|
"main": "dist/commonjs/pixelstreamingfrontend.js",
|
|
6
6
|
"module": "dist/esm/pixelstreamingfrontend.js",
|
|
@@ -100,7 +100,7 @@ export class GamepadController implements IInputController {
|
|
|
100
100
|
window.removeEventListener('webkitgamepadconnected', this.onGamepadConnectedListener);
|
|
101
101
|
window.removeEventListener('webkitgamepaddisconnected', this.onGamepadDisconnectedListener);
|
|
102
102
|
for (const controller of this.controllers) {
|
|
103
|
-
if (controller.id !== undefined) {
|
|
103
|
+
if (controller && controller.id !== undefined) {
|
|
104
104
|
this.streamMessageController.toStreamerHandlers.get('GamepadDisconnected')([controller.id]);
|
|
105
105
|
}
|
|
106
106
|
}
|
|
@@ -109,7 +109,7 @@ export class GamepadController implements IInputController {
|
|
|
109
109
|
|
|
110
110
|
onGamepadResponseReceived(gamepadId: number) {
|
|
111
111
|
for (const controller of this.controllers) {
|
|
112
|
-
if (controller.id === undefined) {
|
|
112
|
+
if (controller && controller.id === undefined) {
|
|
113
113
|
controller.id = gamepadId;
|
|
114
114
|
break;
|
|
115
115
|
}
|
|
@@ -134,7 +134,11 @@ export class GamepadController implements IInputController {
|
|
|
134
134
|
const deletedController = this.controllers[gamepad.index];
|
|
135
135
|
delete this.controllers[gamepad.index];
|
|
136
136
|
this.controllers = this.controllers.filter((controller) => controller !== undefined);
|
|
137
|
-
|
|
137
|
+
if (deletedController.id) {
|
|
138
|
+
this.streamMessageController.toStreamerHandlers.get('GamepadDisconnected')([
|
|
139
|
+
deletedController.id
|
|
140
|
+
]);
|
|
141
|
+
}
|
|
138
142
|
}
|
|
139
143
|
|
|
140
144
|
private scanGamepads() {
|
|
@@ -144,7 +148,7 @@ export class GamepadController implements IInputController {
|
|
|
144
148
|
? navigator.webkitGetGamepads()
|
|
145
149
|
: [];
|
|
146
150
|
for (let i = 0; i < gamepads.length; i++) {
|
|
147
|
-
if (gamepads[i] && gamepads[i].index
|
|
151
|
+
if (gamepads[i] && this.controllers[gamepads[i].index] !== undefined) {
|
|
148
152
|
this.controllers[gamepads[i].index].currentState = gamepads[i];
|
|
149
153
|
}
|
|
150
154
|
}
|
|
@@ -156,8 +160,11 @@ export class GamepadController implements IInputController {
|
|
|
156
160
|
|
|
157
161
|
// Iterate over multiple controllers in the case the multiple gamepads are connected
|
|
158
162
|
for (const controller of this.controllers) {
|
|
163
|
+
if (!controller) {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
159
166
|
// If we haven't received an id (possible if using an older version of UE), return to original functionality
|
|
160
|
-
const
|
|
167
|
+
const controllerId =
|
|
161
168
|
controller.id === undefined ? this.controllers.indexOf(controller) : controller.id;
|
|
162
169
|
const currentState = controller.currentState;
|
|
163
170
|
for (let i = 0; i < controller.currentState.buttons.length; i++) {
|
|
@@ -167,13 +174,13 @@ export class GamepadController implements IInputController {
|
|
|
167
174
|
// press
|
|
168
175
|
if (i == GamepadLayout.LeftTrigger) {
|
|
169
176
|
// UEs left analog has a button index of 5
|
|
170
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
177
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 5, currentButton.value]);
|
|
171
178
|
} else if (i == GamepadLayout.RightTrigger) {
|
|
172
179
|
// UEs right analog has a button index of 6
|
|
173
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
180
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 6, currentButton.value]);
|
|
174
181
|
} else {
|
|
175
182
|
toStreamerHandlers.get('GamepadButtonPressed')([
|
|
176
|
-
|
|
183
|
+
controllerId,
|
|
177
184
|
i,
|
|
178
185
|
previousButton.pressed ? 1 : 0
|
|
179
186
|
]);
|
|
@@ -182,12 +189,12 @@ export class GamepadController implements IInputController {
|
|
|
182
189
|
// release
|
|
183
190
|
if (i == GamepadLayout.LeftTrigger) {
|
|
184
191
|
// UEs left analog has a button index of 5
|
|
185
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
192
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 5, 0]);
|
|
186
193
|
} else if (i == GamepadLayout.RightTrigger) {
|
|
187
194
|
// UEs right analog has a button index of 6
|
|
188
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
195
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, 6, 0]);
|
|
189
196
|
} else {
|
|
190
|
-
toStreamerHandlers.get('GamepadButtonReleased')([
|
|
197
|
+
toStreamerHandlers.get('GamepadButtonReleased')([controllerId, i, 0]);
|
|
191
198
|
}
|
|
192
199
|
}
|
|
193
200
|
}
|
|
@@ -201,9 +208,11 @@ export class GamepadController implements IInputController {
|
|
|
201
208
|
const y = -parseFloat(currentState.axes[i + 1].toFixed(4));
|
|
202
209
|
|
|
203
210
|
// UE's analog axes follow the same order as the browsers, but start at index 1 so we will offset as such
|
|
204
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
205
|
-
toStreamerHandlers.get('GamepadAnalog')([
|
|
211
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, i + 1, x]); // Horizontal axes, only offset by 1
|
|
212
|
+
toStreamerHandlers.get('GamepadAnalog')([controllerId, i + 2, y]); // Vertical axes, offset by two (1 to match UEs axes convention and then another 1 for the vertical axes)
|
|
206
213
|
}
|
|
214
|
+
|
|
215
|
+
const controllerIndex = this.controllers.indexOf(controller);
|
|
207
216
|
this.controllers[controllerIndex].prevState = deepCopyGamepad(currentState);
|
|
208
217
|
}
|
|
209
218
|
if (this.controllers.length > 0) {
|
|
@@ -215,6 +224,9 @@ export class GamepadController implements IInputController {
|
|
|
215
224
|
// When a user navigates away from the page, we need to inform UE of all the disconnecting
|
|
216
225
|
// controllers
|
|
217
226
|
for (const controller of this.controllers) {
|
|
227
|
+
if (!controller || !controller.id) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
218
230
|
this.streamMessageController.toStreamerHandlers.get('GamepadDisconnected')([controller.id]);
|
|
219
231
|
}
|
|
220
232
|
}
|
package/src/Util/FileUtil.ts
CHANGED
|
@@ -17,7 +17,7 @@ export class FileUtil {
|
|
|
17
17
|
file.extension = '';
|
|
18
18
|
file.receiving = true;
|
|
19
19
|
file.valid = false;
|
|
20
|
-
file.
|
|
20
|
+
file.chunks = 0;
|
|
21
21
|
file.data = [];
|
|
22
22
|
file.timestampStart = new Date().getTime();
|
|
23
23
|
Logger.Info('Received first chunk of file');
|
|
@@ -39,7 +39,7 @@ export class FileUtil {
|
|
|
39
39
|
file.extension = '';
|
|
40
40
|
file.receiving = true;
|
|
41
41
|
file.valid = false;
|
|
42
|
-
file.
|
|
42
|
+
file.chunks = 0;
|
|
43
43
|
file.data = [];
|
|
44
44
|
file.timestampStart = new Date().getTime();
|
|
45
45
|
Logger.Info('Received first chunk of file');
|
|
@@ -58,27 +58,32 @@ export class FileUtil {
|
|
|
58
58
|
// If we haven't received the initial setup instructions, return
|
|
59
59
|
if (!file.receiving) return;
|
|
60
60
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
const typeSize = 1;
|
|
62
|
+
const intSize = 4;
|
|
63
|
+
const maxMessageSize = 16 * 1024;
|
|
64
|
+
const headerSize = typeSize + intSize;
|
|
65
|
+
const maxPayloadSize = maxMessageSize - headerSize;
|
|
66
|
+
|
|
67
|
+
// Calculate total number of chunks from the total file size
|
|
68
|
+
file.chunks = Math.ceil(
|
|
69
|
+
new DataView(view.slice(typeSize, headerSize).buffer).getInt32(0, true) / maxPayloadSize
|
|
65
70
|
);
|
|
66
71
|
|
|
67
72
|
// Get the file part of the payload
|
|
68
|
-
const fileBytes = view.slice(
|
|
73
|
+
const fileBytes = view.slice(headerSize);
|
|
69
74
|
|
|
70
75
|
// Append to existing data that holds the file
|
|
71
76
|
file.data.push(fileBytes);
|
|
72
77
|
|
|
73
78
|
// Uncomment for debug
|
|
74
|
-
Logger.Info(`Received file chunk: ${file.data.length}/${file.
|
|
79
|
+
Logger.Info(`Received file chunk: ${file.data.length}/${file.chunks}`);
|
|
75
80
|
|
|
76
|
-
if (file.data.length === file.
|
|
81
|
+
if (file.data.length === file.chunks) {
|
|
77
82
|
file.receiving = false;
|
|
78
83
|
file.valid = true;
|
|
79
84
|
Logger.Info('Received complete file');
|
|
80
85
|
const transferDuration = new Date().getTime() - file.timestampStart;
|
|
81
|
-
const transferBitrate = Math.round((file.
|
|
86
|
+
const transferBitrate = Math.round((file.chunks * maxMessageSize) / transferDuration);
|
|
82
87
|
Logger.Info(
|
|
83
88
|
`Average transfer bitrate: ${transferBitrate}kb/s over ${transferDuration / 1000} seconds`
|
|
84
89
|
);
|
|
@@ -96,9 +101,9 @@ export class FileUtil {
|
|
|
96
101
|
document.body.append(a);
|
|
97
102
|
// if you are so inclined to make it auto-download, do something like: a.click();
|
|
98
103
|
a.remove();
|
|
99
|
-
} else if (file.data.length > file.
|
|
104
|
+
} else if (file.data.length > file.chunks) {
|
|
100
105
|
file.receiving = false;
|
|
101
|
-
Logger.Error(`Received bigger file than advertised: ${file.data.length}/${file.
|
|
106
|
+
Logger.Error(`Received bigger file than advertised: ${file.data.length}/${file.chunks}`);
|
|
102
107
|
}
|
|
103
108
|
}
|
|
104
109
|
}
|
|
@@ -110,7 +115,7 @@ export class FileTemplate {
|
|
|
110
115
|
mimetype = '';
|
|
111
116
|
extension = '';
|
|
112
117
|
receiving = false;
|
|
113
|
-
|
|
118
|
+
chunks = 0;
|
|
114
119
|
data: Array<Uint8Array> = [];
|
|
115
120
|
valid = false;
|
|
116
121
|
timestampStart: number;
|