// Copyright 2017-2019 Parity Technologies (UK) Ltd.
// This file is part of Substrate.
// Substrate is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Substrate is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Substrate. If not, see .
//! Substrate system API.
pub mod error;
mod helpers;
#[cfg(test)]
mod tests;
use std::sync::Arc;
use jsonrpc_derive::rpc;
use network;
use runtime_primitives::traits::{self, Header as HeaderT};
use self::error::Result;
pub use self::helpers::{Properties, SystemInfo, Health, PeerInfo};
/// Substrate system RPC API
#[rpc]
pub trait SystemApi {
/// Get the node's implementation name. Plain old string.
#[rpc(name = "system_name")]
fn system_name(&self) -> Result;
/// Get the node implementation's version. Should be a semver string.
#[rpc(name = "system_version")]
fn system_version(&self) -> Result;
/// Get the chain's type. Given as a string identifier.
#[rpc(name = "system_chain")]
fn system_chain(&self) -> Result;
/// Get a custom set of properties as a JSON object, defined in the chain spec.
#[rpc(name = "system_properties")]
fn system_properties(&self) -> Result;
/// Return health status of the node.
///
/// Node is considered healthy if it is:
/// - connected to some peers (unless running in dev mode)
/// - not performing a major sync
#[rpc(name = "system_health")]
fn system_health(&self) -> Result;
/// Returns currently connected peers
#[rpc(name = "system_peers")]
fn system_peers(&self) -> Result>>;
/// Returns current state of the network.
///
/// **Warning**: This API is not stable.
// TODO: make this stable and move structs https://github.com/paritytech/substrate/issues/1890
#[rpc(name = "system_networkState")]
fn system_network_state(&self) -> Result;
}
/// System API implementation
pub struct System {
info: SystemInfo,
sync: Arc>,
should_have_peers: bool,
}
impl System {
/// Creates new `System` given the `SystemInfo`.
pub fn new(
info: SystemInfo,
sync: Arc>,
should_have_peers: bool,
) -> Self {
System {
info,
should_have_peers,
sync,
}
}
}
impl SystemApi::Number> for System {
fn system_name(&self) -> Result {
Ok(self.info.impl_name.clone())
}
fn system_version(&self) -> Result {
Ok(self.info.impl_version.clone())
}
fn system_chain(&self) -> Result {
Ok(self.info.chain_name.clone())
}
fn system_properties(&self) -> Result {
Ok(self.info.properties.clone())
}
fn system_health(&self) -> Result {
Ok(Health {
peers: self.sync.peers_debug_info().len(),
is_syncing: self.sync.is_major_syncing(),
should_have_peers: self.should_have_peers,
})
}
fn system_peers(&self) -> Result::Number>>> {
Ok(self.sync.peers_debug_info().into_iter().map(|(peer_id, p)| PeerInfo {
peer_id: peer_id.to_base58(),
roles: format!("{:?}", p.roles),
protocol_version: p.protocol_version,
best_hash: p.best_hash,
best_number: p.best_number,
}).collect())
}
fn system_network_state(&self) -> Result {
Ok(self.sync.network_state())
}
}