Skip to content

Commit 907cc6f

Browse files
committed
pikvm/pikvm#1041: Randomized recorder events
1 parent 26d807a commit 907cc6f

File tree

2 files changed

+51
-6
lines changed

2 files changed

+51
-6
lines changed

web/share/js/kvm/recorder.js

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,37 +154,55 @@ export function Recorder() {
154154
__checkType(event.event, "object", "Non-dict event");
155155

156156
if (event.event_type === "delay") {
157-
__checkInt(event.event.millis, "Non-integer delay");
158-
if (event.event.millis < 0) {
159-
throw "Negative delay";
160-
}
157+
__checkUnsigned(event.event.millis, "Non-unsigned delay");
161158
events_time += event.event.millis;
159+
162160
} else if (event.event_type === "print") {
163161
__checkType(event.event.text, "string", "Non-string print text");
162+
164163
} else if (event.event_type === "key") {
165164
__checkType(event.event.key, "string", "Non-string key code");
166165
__checkType(event.event.state, "boolean", "Non-bool key state");
166+
167167
} else if (event.event_type === "mouse_button") {
168168
__checkType(event.event.button, "string", "Non-string mouse button code");
169169
__checkType(event.event.state, "boolean", "Non-bool mouse button state");
170+
170171
} else if (event.event_type === "mouse_move") {
171172
__checkType(event.event.to, "object", "Non-object mouse move target");
172173
__checkInt(event.event.to.x, "Non-int mouse move X");
173174
__checkInt(event.event.to.y, "Non-int mouse move Y");
175+
174176
} else if (event.event_type === "mouse_relative") {
175177
__checkMouseRelativeDelta(event.event.delta);
176178
__checkType(event.event.squash, "boolean", "Non-boolean squash");
179+
177180
} else if (event.event_type === "mouse_wheel") {
178181
__checkType(event.event.delta, "object", "Non-object mouse wheel delta");
179182
__checkInt(event.event.delta.x, "Non-int mouse delta X");
180183
__checkInt(event.event.delta.y, "Non-int mouse delta Y");
184+
181185
} else if (event.event_type === "atx_button") {
182186
__checkType(event.event.button, "string", "Non-string ATX button");
187+
183188
} else if (event.event_type === "gpio_switch") {
184189
__checkType(event.event.channel, "string", "Non-string GPIO channel");
185190
__checkType(event.event.state, "boolean", "Non-bool GPIO state");
191+
186192
} else if (event.event_type === "gpio_pulse") {
187193
__checkType(event.event.channel, "string", "Non-string GPIO channel");
194+
195+
} else if (event.event_type === "delay_random") {
196+
__checkType(event.event.range, "object", "Non-object random delay range");
197+
__checkUnsigned(event.event.range.min, "Non-unsigned random delay range min");
198+
__checkUnsigned(event.event.range.max, "Non-unsigned random delay range max");
199+
events_time += event.event.range.max;
200+
201+
} else if (event.event_type === "mouse_move_random") { // Hack for pikvm/pikvm#1041
202+
__checkType(event.event.range, "object", "Non-object random mouse move range");
203+
__checkInt(event.event.range.min, "Non-int random mouse move range min");
204+
__checkInt(event.event.range.max, "Non-int random mouse move range max");
205+
188206
} else {
189207
throw `Unknown event type: ${event.event_type}`;
190208
}
@@ -217,6 +235,13 @@ export function Recorder() {
217235
}
218236
};
219237

238+
var __checkUnsigned = function(obj, msg) {
239+
__checkInt(obj, msg);
240+
if (obj < 0) {
241+
throw "Negative delay";
242+
}
243+
};
244+
220245
var __checkArray = function (obj, msg) {
221246
if (!Array.isArray(obj)) {
222247
throw msg;
@@ -237,8 +262,13 @@ export function Recorder() {
237262
__setCounters(__events.length - index + 1, __events_time - time);
238263
let event = __events[index];
239264

240-
if (event.event_type === "delay") {
241-
__play_timer = setTimeout(() => __runEvents(index + 1, time + event.event.millis), event.event.millis);
265+
if (["delay", "delay_random"].includes(event.event_type)) {
266+
let millis = (
267+
event.event_type === "delay"
268+
? event.event.millis
269+
: tools.getRandomInt(event.event.range.min, event.event.range.max)
270+
);
271+
__play_timer = setTimeout(() => __runEvents(index + 1, time + millis), millis);
242272
return;
243273

244274
} else if (event.event_type === "print") {
@@ -291,6 +321,15 @@ export function Recorder() {
291321

292322
} else if (["key", "mouse_button", "mouse_move", "mouse_wheel", "mouse_relative"].includes(event.event_type)) {
293323
__ws.sendHidEvent(event);
324+
325+
} else if (event.event_type === "mouse_move_random") {
326+
__ws.sendHidEvent({
327+
"event_type": "mouse_move",
328+
"event": {"to": {
329+
"x": tools.getRandomInt(event.event.range.min, event.event.range.max),
330+
"y": tools.getRandomInt(event.event.range.min, event.event.range.max),
331+
}},
332+
});
294333
}
295334

296335
index += 1;

web/share/js/tools.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ export var tools = new function() {
7070
return btoa(text).replace("=", "_");
7171
};
7272

73+
self.getRandomInt = function(min, max) {
74+
min = Math.ceil(min);
75+
max = Math.floor(max);
76+
return Math.floor(Math.random() * (max - min + 1)) + min;
77+
};
78+
7379
self.formatSize = function(size) {
7480
if (size > 0) {
7581
let index = Math.floor( Math.log(size) / Math.log(1024) );

0 commit comments

Comments
 (0)