lighthouse/beacon_node/rpc/src/lib.rs

98 lines
3.0 KiB
Rust
Raw Normal View History

mod attestation;
mod beacon_block;
mod beacon_node;
2019-03-19 12:47:58 +00:00
pub mod config;
mod validator;
use self::attestation::AttestationServiceInstance;
use self::beacon_block::BeaconBlockServiceInstance;
use self::beacon_node::BeaconNodeServiceInstance;
use self::validator::ValidatorServiceInstance;
use beacon_chain::{BeaconChain, BeaconChainTypes};
2019-03-19 12:47:58 +00:00
pub use config::Config as RPCConfig;
use futures::Future;
use grpcio::{Environment, ServerBuilder};
use network::NetworkMessage;
use protos::services_grpc::{
create_attestation_service, create_beacon_block_service, create_beacon_node_service,
create_validator_service,
};
2019-03-22 05:46:52 +00:00
use slog::{info, o, warn};
use std::sync::Arc;
2019-03-22 05:46:52 +00:00
use tokio::runtime::TaskExecutor;
use tokio::sync::mpsc;
pub fn start_server<T: BeaconChainTypes + Clone + 'static>(
config: &RPCConfig,
2019-03-22 05:46:52 +00:00
executor: &TaskExecutor,
network_chan: mpsc::UnboundedSender<NetworkMessage>,
beacon_chain: Arc<BeaconChain<T>>,
log: &slog::Logger,
2019-06-13 16:21:09 +00:00
) -> exit_future::Signal {
2019-03-19 12:47:58 +00:00
let log = log.new(o!("Service"=>"RPC"));
let env = Arc::new(Environment::new(1));
2019-03-22 05:46:52 +00:00
// build a channel to kill the rpc server
let (rpc_exit_signal, rpc_exit) = exit_future::signal();
2019-03-22 05:46:52 +00:00
// build the individual rpc services
let beacon_node_service = {
let instance = BeaconNodeServiceInstance {
chain: beacon_chain.clone(),
log: log.clone(),
};
create_beacon_node_service(instance)
};
let beacon_block_service = {
let instance = BeaconBlockServiceInstance {
chain: beacon_chain.clone(),
2019-06-04 06:33:35 +00:00
network_chan: network_chan.clone(),
log: log.clone(),
};
create_beacon_block_service(instance)
};
let validator_service = {
let instance = ValidatorServiceInstance {
chain: beacon_chain.clone(),
log: log.clone(),
};
create_validator_service(instance)
};
let attestation_service = {
let instance = AttestationServiceInstance {
network_chan,
chain: beacon_chain.clone(),
log: log.clone(),
};
create_attestation_service(instance)
};
let mut server = ServerBuilder::new(env)
.register_service(beacon_block_service)
.register_service(validator_service)
2019-03-22 05:56:54 +00:00
.register_service(beacon_node_service)
.register_service(attestation_service)
2019-03-19 12:47:58 +00:00
.bind(config.listen_address.to_string(), config.port)
.build()
.unwrap();
2019-03-22 05:46:52 +00:00
let spawn_rpc = {
server.start();
for &(ref host, port) in server.bind_addrs() {
info!(log, "gRPC listening on {}:{}", host, port);
}
rpc_exit.and_then(move |_| {
info!(log, "RPC Server shutting down");
server
.shutdown()
.wait()
.map(|_| ())
.map_err(|e| warn!(log, "RPC server failed to shutdown: {:?}", e))?;
Ok(())
})
};
executor.spawn(spawn_rpc);
rpc_exit_signal
}