@@ -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 ;
0 commit comments