@@ -56,7 +56,7 @@ pub struct StateFetcher<N: NetworkPrimitives = EthNetworkPrimitives> {
5656 /// Sender for download requests, used to detach a [`FetchClient`]
5757 download_requests_tx : UnboundedSender < DownloadRequest < N > > ,
5858 /// A transformation hook applied to the downloaded headers.
59- header_transform : Box < dyn HeaderTransform < N :: BlockHeader > > ,
59+ header_transform : Arc < dyn HeaderTransform < N :: BlockHeader > > ,
6060}
6161
6262// === impl StateSyncer ===
@@ -65,7 +65,7 @@ impl<N: NetworkPrimitives> StateFetcher<N> {
6565 pub ( crate ) fn new (
6666 peers_handle : PeersHandle ,
6767 num_active_peers : Arc < AtomicUsize > ,
68- header_transform : Box < dyn HeaderTransform < N :: BlockHeader > > ,
68+ header_transform : Arc < dyn HeaderTransform < N :: BlockHeader > > ,
6969 ) -> Self {
7070 let ( download_requests_tx, download_requests_rx) = mpsc:: unbounded_channel ( ) ;
7171 Self {
@@ -279,10 +279,15 @@ impl<N: NetworkPrimitives> StateFetcher<N> {
279279 resp. as_ref ( ) . is_some_and ( |r| res. is_likely_bad_headers_response ( & r. request ) ) ;
280280
281281 if let Some ( resp) = resp {
282- // apply the header transform and delegate the response
283- let _ = resp. response . send ( res. map ( |h| {
284- ( peer_id, h. into_iter ( ) . map ( |h| self . header_transform . map ( h) ) . collect ( ) ) . into ( )
285- } ) ) ;
282+ let header_transform = self . header_transform . clone ( ) ;
283+ tokio:: spawn ( async move {
284+ let res = match res {
285+ Ok ( headers) => Ok ( header_transform. map ( headers) . await ) ,
286+ Err ( e) => Err ( e) ,
287+ } ;
288+
289+ let _ = resp. response . send ( res. map ( |h| ( peer_id, h) . into ( ) ) ) ;
290+ } ) ;
286291 }
287292
288293 if let Some ( peer) = self . peers . get_mut ( & peer_id) {
@@ -496,7 +501,7 @@ mod tests {
496501 let mut fetcher = StateFetcher :: < EthNetworkPrimitives > :: new (
497502 manager. handle ( ) ,
498503 Default :: default ( ) ,
499- Box :: new ( ( ) ) ,
504+ Arc :: new ( ( ) ) ,
500505 ) ;
501506
502507 poll_fn ( move |cx| {
@@ -521,7 +526,7 @@ mod tests {
521526 let mut fetcher = StateFetcher :: < EthNetworkPrimitives > :: new (
522527 manager. handle ( ) ,
523528 Default :: default ( ) ,
524- Box :: new ( ( ) ) ,
529+ Arc :: new ( ( ) ) ,
525530 ) ;
526531 // Add a few random peers
527532 let peer1 = B512 :: random ( ) ;
@@ -548,7 +553,7 @@ mod tests {
548553 let mut fetcher = StateFetcher :: < EthNetworkPrimitives > :: new (
549554 manager. handle ( ) ,
550555 Default :: default ( ) ,
551- Box :: new ( ( ) ) ,
556+ Arc :: new ( ( ) ) ,
552557 ) ;
553558 // Add a few random peers
554559 let peer1 = B512 :: random ( ) ;
@@ -577,7 +582,7 @@ mod tests {
577582 let mut fetcher = StateFetcher :: < EthNetworkPrimitives > :: new (
578583 manager. handle ( ) ,
579584 Default :: default ( ) ,
580- Box :: new ( ( ) ) ,
585+ Arc :: new ( ( ) ) ,
581586 ) ;
582587 let peer_id = B512 :: random ( ) ;
583588
@@ -611,7 +616,7 @@ mod tests {
611616 let mut fetcher = StateFetcher :: < EthNetworkPrimitives > :: new (
612617 manager. handle ( ) ,
613618 Default :: default ( ) ,
614- Box :: new ( ( ) ) ,
619+ Arc :: new ( ( ) ) ,
615620 ) ;
616621 let peer_id = B512 :: random ( ) ;
617622
0 commit comments