Skip to content

Commit 64728dc

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

File tree

2 files changed

+59
-6
lines changed

2 files changed

+59
-6
lines changed

web/share/js/kvm/recorder.js

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,37 +154,57 @@ 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+
__checkRangeMinMax(event.event.range, "Invalid random delay range");
200+
events_time += event.event.range.max;
201+
202+
} else if (event.event_type === "mouse_move_random") { // Hack for pikvm/pikvm#1041
203+
__checkType(event.event.range, "object", "Non-object random mouse move range");
204+
__checkInt(event.event.range.min, "Non-int random mouse move range min");
205+
__checkInt(event.event.range.max, "Non-int random mouse move range max");
206+
__checkRangeMinMax(event.event.range, "Invalid random mouse move range");
207+
188208
} else {
189209
throw `Unknown event type: ${event.event_type}`;
190210
}
@@ -217,6 +237,19 @@ export function Recorder() {
217237
}
218238
};
219239

240+
var __checkUnsigned = function(obj, msg) {
241+
__checkInt(obj, msg);
242+
if (obj < 0) {
243+
throw msg;
244+
}
245+
};
246+
247+
var __checkRangeMinMax = function(obj, msg) {
248+
if (obj.min > obj.max) {
249+
throw msg;
250+
}
251+
};
252+
220253
var __checkArray = function (obj, msg) {
221254
if (!Array.isArray(obj)) {
222255
throw msg;
@@ -237,8 +270,13 @@ export function Recorder() {
237270
__setCounters(__events.length - index + 1, __events_time - time);
238271
let event = __events[index];
239272

240-
if (event.event_type === "delay") {
241-
__play_timer = setTimeout(() => __runEvents(index + 1, time + event.event.millis), event.event.millis);
273+
if (["delay", "delay_random"].includes(event.event_type)) {
274+
let millis = (
275+
event.event_type === "delay"
276+
? event.event.millis
277+
: tools.getRandomInt(event.event.range.min, event.event.range.max)
278+
);
279+
__play_timer = setTimeout(() => __runEvents(index + 1, time + millis), millis);
242280
return;
243281

244282
} else if (event.event_type === "print") {
@@ -291,6 +329,15 @@ export function Recorder() {
291329

292330
} else if (["key", "mouse_button", "mouse_move", "mouse_wheel", "mouse_relative"].includes(event.event_type)) {
293331
__ws.sendHidEvent(event);
332+
333+
} else if (event.event_type === "mouse_move_random") {
334+
__ws.sendHidEvent({
335+
"event_type": "mouse_move",
336+
"event": {"to": {
337+
"x": tools.getRandomInt(event.event.range.min, event.event.range.max),
338+
"y": tools.getRandomInt(event.event.range.min, event.event.range.max),
339+
}},
340+
});
294341
}
295342

296343
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)