@@ -6,9 +6,11 @@ use alloy::{
66 providers:: { Provider , RootProvider } ,
77 transports:: TransportError ,
88} ;
9- use tokio:: { sync:: watch, task:: JoinHandle } ;
10- use tokio_stream:: StreamExt ;
11- use tracing:: { debug, error, trace} ;
9+ use tokio:: {
10+ sync:: { broadcast:: error:: RecvError , watch} ,
11+ task:: JoinHandle ,
12+ } ;
13+ use tracing:: { debug, error, trace, warn} ;
1214
1315/// Errors that can occur on the [`BlockWatcher`] task.
1416#[ derive( Debug , thiserror:: Error ) ]
@@ -64,21 +66,31 @@ impl BlockWatcher {
6466 }
6567
6668 async fn task_future ( self ) {
67- let sub = match self . host_provider . subscribe_blocks ( ) . await {
69+ let mut sub = match self . host_provider . subscribe_blocks ( ) . await {
6870 Ok ( sub) => sub,
69- Err ( err ) => {
70- error ! ( error = ?err , "failed to subscribe to host chain blocks" ) ;
71+ Err ( error ) => {
72+ error ! ( % error) ;
7173 return ;
7274 }
7375 } ;
74- let mut stream = sub. into_stream ( ) ;
7576
7677 debug ! ( "subscribed to host chain blocks" ) ;
7778
78- while let Some ( header) = stream. next ( ) . await {
79- let block_number = header. number ;
80- self . block_number . send_replace ( block_number) ;
81- trace ! ( block_number, "updated host block number" ) ;
79+ loop {
80+ match sub. recv ( ) . await {
81+ Ok ( header) => {
82+ let block_number = header. number ;
83+ self . block_number . send_replace ( block_number) ;
84+ trace ! ( block_number, "updated host block number" ) ;
85+ }
86+ Err ( RecvError :: Lagged ( missed) ) => {
87+ warn ! ( %missed, "block subscription lagged" ) ;
88+ }
89+ Err ( RecvError :: Closed ) => {
90+ error ! ( "block subscription closed" ) ;
91+ break ;
92+ }
93+ }
8294 }
8395 }
8496}
0 commit comments