23
23
use bytes:: BytesMut ;
24
24
use futures:: task:: AtomicWaker ;
25
25
use futures:: { future:: Ready , io, prelude:: * } ;
26
- use js_sys:: Array ;
26
+ use js_sys:: Function ;
27
27
use libp2p_core:: {
28
28
multiaddr:: { Multiaddr , Protocol } ,
29
29
transport:: { ListenerId , TransportError , TransportEvent } ,
@@ -35,7 +35,16 @@ use std::sync::atomic::{AtomicBool, Ordering};
35
35
use std:: sync:: Mutex ;
36
36
use std:: { pin:: Pin , task:: Context , task:: Poll } ;
37
37
use wasm_bindgen:: { prelude:: * , JsCast } ;
38
- use web_sys:: { window, CloseEvent , Event , MessageEvent , WebSocket } ;
38
+ use web_sys:: { CloseEvent , Event , MessageEvent , WebSocket } ;
39
+
40
+ #[ wasm_bindgen]
41
+ extern "C" {
42
+ #[ wasm_bindgen( js_name = "setInterval" , catch) ]
43
+ fn set_interval ( handler : & Function , timeout : i32 ) -> Result < JsValue , JsValue > ;
44
+
45
+ #[ wasm_bindgen( js_name = "clearInterval" ) ]
46
+ fn clear_interval ( handle : JsValue ) -> JsValue ;
47
+ }
39
48
40
49
/// A Websocket transport that can be used in a wasm environment.
41
50
///
@@ -188,7 +197,7 @@ struct Inner {
188
197
_on_close_closure : Rc < Closure < dyn FnMut ( CloseEvent ) > > ,
189
198
_on_error_closure : Rc < Closure < dyn FnMut ( CloseEvent ) > > ,
190
199
_on_message_closure : Rc < Closure < dyn FnMut ( MessageEvent ) > > ,
191
- buffered_amount_low_interval : i32 ,
200
+ buffered_amount_low_interval : Option < JsValue > ,
192
201
}
193
202
194
203
impl Inner {
@@ -300,14 +309,13 @@ impl Connection {
300
309
}
301
310
}
302
311
} ) ;
303
- let buffered_amount_low_interval = window ( )
304
- . expect ( "to have a window" )
305
- . set_interval_with_callback_and_timeout_and_arguments (
312
+ let buffered_amount_low_interval = Some (
313
+ set_interval (
306
314
on_buffered_amount_low_closure. as_ref ( ) . unchecked_ref ( ) ,
307
315
100 , // Chosen arbitrarily and likely worth tuning. Due to low impact of the /ws transport, no further effort was invested at the time.
308
- & Array :: new ( ) ,
309
316
)
310
- . expect ( "to be able to set an interval" ) ;
317
+ . expect ( "to be able to set an interval" ) ,
318
+ ) ;
311
319
312
320
Self {
313
321
inner : SendWrapper :: new ( Inner {
@@ -439,8 +447,8 @@ impl Drop for Connection {
439
447
. close_with_code_and_reason ( GO_AWAY_STATUS_CODE , "connection dropped" ) ;
440
448
}
441
449
442
- window ( )
443
- . expect ( "to have a window" )
444
- . clear_interval_with_handle ( self . inner . buffered_amount_low_interval )
450
+ if let Some ( id ) = self . inner . buffered_amount_low_interval . take ( ) {
451
+ clear_interval ( id ) ;
452
+ }
445
453
}
446
454
}
0 commit comments