reth_node_builder/
hooks.rs

1use std::fmt;
2
3use reth_node_api::{FullNodeComponents, NodeAddOns};
4
5use crate::node::FullNode;
6
7/// Container for all the configurable hook functions.
8pub struct NodeHooks<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> {
9    /// Hook to run once core components are initialized.
10    pub on_component_initialized: Box<dyn OnComponentInitializedHook<Node>>,
11    /// Hook to run once the node is started.
12    pub on_node_started: Box<dyn OnNodeStartedHook<Node, AddOns>>,
13    _marker: std::marker::PhantomData<Node>,
14}
15
16impl<Node, AddOns> NodeHooks<Node, AddOns>
17where
18    Node: FullNodeComponents,
19    AddOns: NodeAddOns<Node>,
20{
21    /// Creates a new, empty [`NodeHooks`] instance for the given node type.
22    pub fn new() -> Self {
23        Self {
24            on_component_initialized: Box::<()>::default(),
25            on_node_started: Box::<()>::default(),
26            _marker: Default::default(),
27        }
28    }
29
30    /// Sets the hook that is run once the node's components are initialized.
31    pub(crate) fn set_on_component_initialized<F>(&mut self, hook: F) -> &mut Self
32    where
33        F: OnComponentInitializedHook<Node> + 'static,
34    {
35        self.on_component_initialized = Box::new(hook);
36        self
37    }
38
39    /// Sets the hook that is run once the node's components are initialized.
40    #[expect(unused)]
41    pub(crate) fn on_component_initialized<F>(mut self, hook: F) -> Self
42    where
43        F: OnComponentInitializedHook<Node> + 'static,
44    {
45        self.set_on_component_initialized(hook);
46        self
47    }
48
49    /// Sets the hook that is run once the node has started.
50    pub(crate) fn set_on_node_started<F>(&mut self, hook: F) -> &mut Self
51    where
52        F: OnNodeStartedHook<Node, AddOns> + 'static,
53    {
54        self.on_node_started = Box::new(hook);
55        self
56    }
57
58    /// Sets the hook that is run once the node has started.
59    #[expect(unused)]
60    pub(crate) fn on_node_started<F>(mut self, hook: F) -> Self
61    where
62        F: OnNodeStartedHook<Node, AddOns> + 'static,
63    {
64        self.set_on_node_started(hook);
65        self
66    }
67}
68
69impl<Node, AddOns> Default for NodeHooks<Node, AddOns>
70where
71    Node: FullNodeComponents,
72    AddOns: NodeAddOns<Node>,
73{
74    fn default() -> Self {
75        Self::new()
76    }
77}
78impl<Node, AddOns> fmt::Debug for NodeHooks<Node, AddOns>
79where
80    Node: FullNodeComponents,
81    AddOns: NodeAddOns<Node>,
82{
83    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
84        f.debug_struct("NodeHooks")
85            .field("on_component_initialized", &"...")
86            .field("on_node_started", &"...")
87            .finish()
88    }
89}
90
91/// A helper trait for the event hook that is run once the node is initialized.
92pub trait OnComponentInitializedHook<Node>: Send {
93    /// Consumes the event hook and runs it.
94    ///
95    /// If this returns an error, the node launch will be aborted.
96    fn on_event(self: Box<Self>, node: Node) -> eyre::Result<()>;
97}
98
99impl<Node, F> OnComponentInitializedHook<Node> for F
100where
101    F: FnOnce(Node) -> eyre::Result<()> + Send,
102{
103    fn on_event(self: Box<Self>, node: Node) -> eyre::Result<()> {
104        (*self)(node)
105    }
106}
107
108/// A helper trait that is run once the node is started.
109pub trait OnNodeStartedHook<Node: FullNodeComponents, AddOns: NodeAddOns<Node>>: Send {
110    /// Consumes the event hook and runs it.
111    ///
112    /// If this returns an error, the node launch will be aborted.
113    fn on_event(self: Box<Self>, node: FullNode<Node, AddOns>) -> eyre::Result<()>;
114}
115
116impl<Node, AddOns, F> OnNodeStartedHook<Node, AddOns> for F
117where
118    Node: FullNodeComponents,
119    AddOns: NodeAddOns<Node>,
120    F: FnOnce(FullNode<Node, AddOns>) -> eyre::Result<()> + Send,
121{
122    fn on_event(self: Box<Self>, node: FullNode<Node, AddOns>) -> eyre::Result<()> {
123        (*self)(node)
124    }
125}
126
127impl<Node> OnComponentInitializedHook<Node> for () {
128    fn on_event(self: Box<Self>, _node: Node) -> eyre::Result<()> {
129        Ok(())
130    }
131}
132
133impl<Node, AddOns> OnNodeStartedHook<Node, AddOns> for ()
134where
135    Node: FullNodeComponents,
136    AddOns: NodeAddOns<Node>,
137{
138    fn on_event(self: Box<Self>, _node: FullNode<Node, AddOns>) -> eyre::Result<()> {
139        Ok(())
140    }
141}