5959//! }
6060//! ```
6161
62+ use crate :: robust_provider:: subscription:: { self , RobustSubscription } ;
6263use std:: { cmp:: Ordering , ops:: RangeInclusive } ;
6364use tokio:: {
6465 sync:: { mpsc, oneshot} ,
@@ -68,7 +69,7 @@ use tokio_stream::{StreamExt, wrappers::ReceiverStream};
6869
6970use crate :: {
7071 ScannerError , ScannerMessage ,
71- robust_provider:: { Error as RobustProviderError , IntoRobustProvider , RobustProvider } ,
72+ robust_provider:: { IntoRobustProvider , RobustProvider , provider :: Error as RobustProviderError } ,
7273 types:: { IntoScannerResult , Notification , ScannerResult , TryStream } ,
7374} ;
7475
@@ -77,7 +78,6 @@ use alloy::{
7778 eips:: BlockId ,
7879 network:: { BlockResponse , Network , primitives:: HeaderResponse } ,
7980 primitives:: { B256 , BlockNumber } ,
80- pubsub:: Subscription ,
8181} ;
8282use tracing:: { debug, error, info, warn} ;
8383
@@ -583,16 +583,45 @@ impl<N: Network> Service<N> {
583583
584584 async fn stream_live_blocks (
585585 mut range_start : BlockNumber ,
586- subscription : Subscription < N :: HeaderResponse > ,
586+ subscription : RobustSubscription < N > ,
587587 sender : mpsc:: Sender < BlockScannerResult > ,
588588 block_confirmations : u64 ,
589589 max_block_range : u64 ,
590590 ) {
591591 // ensure we start streaming only after the expected_next_block cutoff
592592 let cutoff = range_start;
593- let mut stream = subscription. into_stream ( ) . skip_while ( |header| header. number ( ) < cutoff) ;
593+ let mut stream = subscription. into_stream ( ) . skip_while ( |result| match result {
594+ Ok ( header) => header. number ( ) < cutoff,
595+ Err ( _) => false ,
596+ } ) ;
597+
598+ while let Some ( result) = stream. next ( ) . await {
599+ let incoming_block = match result {
600+ Ok ( block) => block,
601+ Err ( e) => {
602+ error ! ( error = %e, "Error receiving block from stream" ) ;
603+ match e {
604+ subscription:: Error :: Lagged ( _) => {
605+ // scanner already accounts for skipped block numbers
606+ // next block will be the actual incoming block
607+ continue ;
608+ }
609+ subscription:: Error :: Timeout => {
610+ _ = sender. try_stream ( ScannerError :: Timeout ) . await ;
611+ return ;
612+ }
613+ subscription:: Error :: RpcError ( rpc_err) => {
614+ _ = sender. try_stream ( ScannerError :: RpcError ( rpc_err) ) . await ;
615+ return ;
616+ }
617+ subscription:: Error :: Closed => {
618+ _ = sender. try_stream ( ScannerError :: SubscriptionClosed ) . await ;
619+ return ;
620+ }
621+ }
622+ }
623+ } ;
594624
595- while let Some ( incoming_block) = stream. next ( ) . await {
596625 let incoming_block_num = incoming_block. number ( ) ;
597626 info ! ( block_number = incoming_block_num, "Received block header" ) ;
598627
0 commit comments