1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
#![no_std] extern crate alloc; use alloc::boxed::Box; use js_ffi::*; pub struct Timer { fn_set_timeout: JSValue, fn_set_interval: JSValue, fn_request_animation_frame: JSValue, fn_request_animation_loop: JSValue, fn_clear_timeout: JSValue, fn_clear_interval: JSValue, } impl Default for Timer { fn default() -> Self { Timer { fn_set_timeout: register("window.setTimeout"), fn_set_interval: register("window.setInterval"), fn_request_animation_frame: register("window.requestAnimationFrame"), fn_request_animation_loop: register( "(cb)=>{ let time = Date.now(); function run(){ let new_time = Date.now(); let delta = new_time-time; time = new_time; window.requestAnimationFrame(run); cb(delta); } window.requestAnimationFrame(run); }", ), fn_clear_timeout: register("window.clearTimeout"), fn_clear_interval: register("window.clearInterval"), } } } impl Timer { pub fn set_timeout( &self, callback: Box<dyn FnMut() -> () + Send>, milliseconds: usize, ) -> JSValue { call_2( UNDEFINED, self.fn_set_timeout, TYPE_FUNCTION, create_callback_0(callback), TYPE_NUM, milliseconds as JSValue, ) } pub fn sleep(&self, milliseconds: usize) -> CallbackFuture { let (future, cb) = CallbackFuture::new(); call_2( UNDEFINED, self.fn_set_timeout, TYPE_FUNCTION, cb, TYPE_NUM, milliseconds as JSValue, ); future } pub fn set_interval( &self, callback: Box<dyn FnMut() -> () + Send>, milliseconds: usize, ) -> JSValue { call_2( UNDEFINED, self.fn_set_interval, TYPE_FUNCTION, create_callback_0(callback), TYPE_NUM, milliseconds as JSValue, ) } pub fn request_animation_frame(&self, callback: Box<dyn FnMut() -> () + Send>) { call_1( UNDEFINED, self.fn_request_animation_frame, TYPE_FUNCTION, create_callback_0(callback), ); } pub fn request_animation_loop(&self, callback: Box<dyn FnMut(JSValue) -> () + Send>) { call_1( UNDEFINED, self.fn_request_animation_loop, TYPE_FUNCTION, create_callback_1(callback), ); } pub fn clear_timeout(&self, handle: JSValue) { call_1(UNDEFINED, self.fn_clear_timeout, TYPE_NUM, handle); } pub fn clear_interval(&self, handle: JSValue) { call_1(UNDEFINED, self.fn_clear_interval, TYPE_NUM, handle); } }