@@ -154,37 +154,57 @@ export function Recorder() {
154
154
__checkType ( event . event , "object" , "Non-dict event" ) ;
155
155
156
156
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" ) ;
161
158
events_time += event . event . millis ;
159
+
162
160
} else if ( event . event_type === "print" ) {
163
161
__checkType ( event . event . text , "string" , "Non-string print text" ) ;
162
+
164
163
} else if ( event . event_type === "key" ) {
165
164
__checkType ( event . event . key , "string" , "Non-string key code" ) ;
166
165
__checkType ( event . event . state , "boolean" , "Non-bool key state" ) ;
166
+
167
167
} else if ( event . event_type === "mouse_button" ) {
168
168
__checkType ( event . event . button , "string" , "Non-string mouse button code" ) ;
169
169
__checkType ( event . event . state , "boolean" , "Non-bool mouse button state" ) ;
170
+
170
171
} else if ( event . event_type === "mouse_move" ) {
171
172
__checkType ( event . event . to , "object" , "Non-object mouse move target" ) ;
172
173
__checkInt ( event . event . to . x , "Non-int mouse move X" ) ;
173
174
__checkInt ( event . event . to . y , "Non-int mouse move Y" ) ;
175
+
174
176
} else if ( event . event_type === "mouse_relative" ) {
175
177
__checkMouseRelativeDelta ( event . event . delta ) ;
176
178
__checkType ( event . event . squash , "boolean" , "Non-boolean squash" ) ;
179
+
177
180
} else if ( event . event_type === "mouse_wheel" ) {
178
181
__checkType ( event . event . delta , "object" , "Non-object mouse wheel delta" ) ;
179
182
__checkInt ( event . event . delta . x , "Non-int mouse delta X" ) ;
180
183
__checkInt ( event . event . delta . y , "Non-int mouse delta Y" ) ;
184
+
181
185
} else if ( event . event_type === "atx_button" ) {
182
186
__checkType ( event . event . button , "string" , "Non-string ATX button" ) ;
187
+
183
188
} else if ( event . event_type === "gpio_switch" ) {
184
189
__checkType ( event . event . channel , "string" , "Non-string GPIO channel" ) ;
185
190
__checkType ( event . event . state , "boolean" , "Non-bool GPIO state" ) ;
191
+
186
192
} else if ( event . event_type === "gpio_pulse" ) {
187
193
__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
+
188
208
} else {
189
209
throw `Unknown event type: ${ event . event_type } ` ;
190
210
}
@@ -217,6 +237,19 @@ export function Recorder() {
217
237
}
218
238
} ;
219
239
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
+
220
253
var __checkArray = function ( obj , msg ) {
221
254
if ( ! Array . isArray ( obj ) ) {
222
255
throw msg ;
@@ -237,8 +270,13 @@ export function Recorder() {
237
270
__setCounters ( __events . length - index + 1 , __events_time - time ) ;
238
271
let event = __events [ index ] ;
239
272
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 ) ;
242
280
return ;
243
281
244
282
} else if ( event . event_type === "print" ) {
@@ -291,6 +329,15 @@ export function Recorder() {
291
329
292
330
} else if ( [ "key" , "mouse_button" , "mouse_move" , "mouse_wheel" , "mouse_relative" ] . includes ( event . event_type ) ) {
293
331
__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
+ } ) ;
294
341
}
295
342
296
343
index += 1 ;
0 commit comments