use crate::rpc::{RethRpcServerHandles, RpcRegistry};
use reth_chainspec::ChainSpec;
use reth_network::NetworkHandle;
use reth_node_api::FullNodeComponents;
use reth_node_core::{
dirs::{ChainPath, DataDirPath},
node_config::NodeConfig,
rpc::api::EngineApiClient,
};
use reth_payload_builder::PayloadBuilderHandle;
use reth_provider::ChainSpecProvider;
use reth_rpc_builder::{auth::AuthServerHandle, RpcServerHandle};
use reth_tasks::TaskExecutor;
use std::{marker::PhantomData, sync::Arc};
use crate::components::NodeComponentsBuilder;
pub use reth_node_api::{FullNodeTypes, NodeTypes};
pub trait Node<N: FullNodeTypes>: NodeTypes + Clone {
type ComponentsBuilder: NodeComponentsBuilder<N>;
fn components_builder(self) -> Self::ComponentsBuilder;
}
#[derive(Clone, Default, Debug)]
pub struct AnyNode<N = (), C = ()>(PhantomData<N>, C);
impl<N, C> AnyNode<N, C> {
pub fn types<T>(self) -> AnyNode<T, C> {
AnyNode::<T, C>(PhantomData::<T>, self.1)
}
pub fn components_builder<T>(self, value: T) -> AnyNode<N, T> {
AnyNode::<N, T>(PhantomData::<N>, value)
}
}
impl<N, C> NodeTypes for AnyNode<N, C>
where
N: FullNodeTypes,
C: NodeComponentsBuilder<N> + Sync + Unpin + 'static,
{
type Primitives = N::Primitives;
type Engine = N::Engine;
}
impl<N, C> Node<N> for AnyNode<N, C>
where
N: FullNodeTypes + Clone,
C: NodeComponentsBuilder<N> + Clone + Sync + Unpin + 'static,
{
type ComponentsBuilder = C;
fn components_builder(self) -> Self::ComponentsBuilder {
self.1
}
}
#[derive(Debug, Clone)]
pub struct FullNode<Node: FullNodeComponents> {
pub evm_config: Node::Evm,
pub block_executor: Node::Executor,
pub pool: Node::Pool,
pub network: NetworkHandle,
pub provider: Node::Provider,
pub payload_builder: PayloadBuilderHandle<Node::Engine>,
pub task_executor: TaskExecutor,
pub rpc_server_handles: RethRpcServerHandles,
pub rpc_registry: RpcRegistry<Node>,
pub config: NodeConfig,
pub data_dir: ChainPath<DataDirPath>,
}
impl<Node: FullNodeComponents> FullNode<Node> {
pub fn chain_spec(&self) -> Arc<ChainSpec> {
self.provider.chain_spec()
}
pub const fn rpc_server_handle(&self) -> &RpcServerHandle {
&self.rpc_server_handles.rpc
}
pub const fn auth_server_handle(&self) -> &AuthServerHandle {
&self.rpc_server_handles.auth
}
pub fn engine_http_client(&self) -> impl EngineApiClient<Node::Engine> {
self.auth_server_handle().http_client()
}
pub async fn engine_ws_client(&self) -> impl EngineApiClient<Node::Engine> {
self.auth_server_handle().ws_client().await
}
#[cfg(unix)]
pub async fn engine_ipc_client(&self) -> Option<impl EngineApiClient<Node::Engine>> {
self.auth_server_handle().ipc_client().await
}
}