renamed PayloadType -> Payload, added common reexports in messages
This commit is contained in:
parent
4b0af4f249
commit
f283197a8d
|
@ -1,5 +1,7 @@
|
||||||
use ser::Error as ReaderError;
|
use ser::Error as ReaderError;
|
||||||
|
|
||||||
|
pub type MessageResult<T> = Result<T, Error>;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
/// Deserialization failed.
|
/// Deserialization failed.
|
||||||
|
|
|
@ -6,13 +6,13 @@ extern crate serialization as ser;
|
||||||
|
|
||||||
pub mod common;
|
pub mod common;
|
||||||
mod message;
|
mod message;
|
||||||
pub mod serialization;
|
mod serialization;
|
||||||
pub mod types;
|
pub mod types;
|
||||||
mod error;
|
mod error;
|
||||||
|
|
||||||
pub use primitives::{hash, bytes};
|
pub use primitives::{hash, bytes};
|
||||||
|
|
||||||
pub use message::{Message, MessageHeader};
|
pub use common::{Command, Magic};
|
||||||
pub use error::Error;
|
pub use message::{Message, MessageHeader, Payload};
|
||||||
pub use serialization::PayloadType;
|
pub use serialization::{serialize_payload, deserialize_payload};
|
||||||
pub type MessageResult<T> = Result<T, Error>;
|
pub use error::{Error, MessageResult};
|
||||||
|
|
|
@ -2,13 +2,13 @@ use ser::Stream;
|
||||||
use bytes::TaggedBytes;
|
use bytes::TaggedBytes;
|
||||||
use common::Magic;
|
use common::Magic;
|
||||||
use serialization::serialize_payload;
|
use serialization::serialize_payload;
|
||||||
use {PayloadType, MessageResult, MessageHeader};
|
use {Payload, MessageResult, MessageHeader};
|
||||||
|
|
||||||
pub struct Message<T> {
|
pub struct Message<T> {
|
||||||
bytes: TaggedBytes<T>,
|
bytes: TaggedBytes<T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Message<T> where T: PayloadType {
|
impl<T> Message<T> where T: Payload {
|
||||||
pub fn new(magic: Magic, version: u32, payload: &T) -> MessageResult<Self> {
|
pub fn new(magic: Magic, version: u32, payload: &T) -> MessageResult<Self> {
|
||||||
let serialized = try!(serialize_payload(payload, version));
|
let serialized = try!(serialize_payload(payload, version));
|
||||||
let header = MessageHeader::for_data(magic, T::command().into(), &serialized);
|
let header = MessageHeader::for_data(magic, T::command().into(), &serialized);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
mod message;
|
mod message;
|
||||||
mod message_header;
|
mod message_header;
|
||||||
|
pub mod payload;
|
||||||
|
|
||||||
pub use self::message::Message;
|
pub use self::message::Message;
|
||||||
pub use self::message_header::MessageHeader;
|
pub use self::message_header::MessageHeader;
|
||||||
|
pub use self::payload::Payload;
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
use ser::{Reader, Stream};
|
||||||
|
use MessageResult;
|
||||||
|
|
||||||
|
pub trait Payload: Send + 'static {
|
||||||
|
fn version() -> u32;
|
||||||
|
fn command() -> &'static str;
|
||||||
|
fn deserialize_payload(reader: &mut Reader, version: u32) -> MessageResult<Self> where Self: Sized;
|
||||||
|
fn serialize_payload(&self, stream: &mut Stream, version: u32) -> MessageResult<()>;
|
||||||
|
}
|
|
@ -1,14 +1,5 @@
|
||||||
mod stream;
|
mod stream;
|
||||||
mod reader;
|
mod reader;
|
||||||
|
|
||||||
pub use self::stream::{PayloadStream, serialize_payload};
|
pub use self::stream::serialize_payload;
|
||||||
pub use self::reader::{PayloadReader, deserialize_payload};
|
pub use self::reader::deserialize_payload;
|
||||||
use ser::{Reader, Stream};
|
|
||||||
use MessageResult;
|
|
||||||
|
|
||||||
pub trait PayloadType: Send + 'static {
|
|
||||||
fn version() -> u32;
|
|
||||||
fn command() -> &'static str;
|
|
||||||
fn deserialize_payload(reader: &mut Reader, version: u32) -> MessageResult<Self> where Self: Sized;
|
|
||||||
fn serialize_payload(&self, stream: &mut Stream, version: u32) -> MessageResult<()>;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
use ser::Reader;
|
use ser::Reader;
|
||||||
use serialization::PayloadType;
|
use {Payload, Error};
|
||||||
use Error;
|
|
||||||
|
|
||||||
pub fn deserialize_payload<T>(buffer: &[u8], version: u32) -> Result<T, Error> where T: PayloadType {
|
pub fn deserialize_payload<T>(buffer: &[u8], version: u32) -> Result<T, Error> where T: Payload {
|
||||||
let mut reader = PayloadReader::new(buffer, version);
|
let mut reader = PayloadReader::new(buffer, version);
|
||||||
let result = try!(reader.read());
|
let result = try!(reader.read());
|
||||||
if !reader.is_finished() {
|
if !reader.is_finished() {
|
||||||
|
@ -25,7 +24,7 @@ impl<'a> PayloadReader<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read<T>(&mut self) -> Result<T, Error> where T: PayloadType {
|
pub fn read<T>(&mut self) -> Result<T, Error> where T: Payload {
|
||||||
if T::version() > self.version {
|
if T::version() > self.version {
|
||||||
return Err(Error::InvalidVersion);
|
return Err(Error::InvalidVersion);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use ser::Stream;
|
use ser::Stream;
|
||||||
use {PayloadType, Error, MessageResult};
|
use {Payload, Error, MessageResult};
|
||||||
|
|
||||||
pub fn serialize_payload<T>(t: &T, version: u32) -> MessageResult<Bytes> where T: PayloadType {
|
pub fn serialize_payload<T>(t: &T, version: u32) -> MessageResult<Bytes> where T: Payload {
|
||||||
let mut stream = PayloadStream::new(version);
|
let mut stream = PayloadStream::new(version);
|
||||||
try!(stream.append(t));
|
try!(stream.append(t));
|
||||||
Ok(stream.out())
|
Ok(stream.out())
|
||||||
|
@ -21,7 +21,7 @@ impl PayloadStream {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn append<T>(&mut self, t: &T) -> MessageResult<()> where T: PayloadType {
|
pub fn append<T>(&mut self, t: &T) -> MessageResult<()> where T: Payload {
|
||||||
if T::version() > self.version {
|
if T::version() > self.version {
|
||||||
return Err(Error::InvalidVersion);
|
return Err(Error::InvalidVersion);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ use ser::{
|
||||||
Deserializable, Reader, Error as ReaderError,
|
Deserializable, Reader, Error as ReaderError,
|
||||||
};
|
};
|
||||||
use common::NetAddress;
|
use common::NetAddress;
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum Addr {
|
pub enum Addr {
|
||||||
|
@ -11,7 +11,7 @@ pub enum Addr {
|
||||||
V31402(V31402),
|
V31402(V31402),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for Addr {
|
impl Payload for Addr {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use common::BlockTransactions;
|
use common::BlockTransactions;
|
||||||
use {MessageResult, PayloadType};
|
use {MessageResult, Payload};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct BlockTxn {
|
pub struct BlockTxn {
|
||||||
request: BlockTransactions,
|
request: BlockTransactions,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for BlockTxn {
|
impl Payload for BlockTxn {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
70014
|
70014
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use common::BlockHeaderAndIDs;
|
use common::BlockHeaderAndIDs;
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct CompactBlock {
|
pub struct CompactBlock {
|
||||||
header: BlockHeaderAndIDs,
|
header: BlockHeaderAndIDs,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for CompactBlock {
|
impl Payload for CompactBlock {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
70014
|
70014
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct FeeFilter {
|
pub struct FeeFilter {
|
||||||
fee_rate: u64,
|
fee_rate: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for FeeFilter {
|
impl Payload for FeeFilter {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
70013
|
70013
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct FilterAdd {
|
pub struct FilterAdd {
|
||||||
|
@ -8,7 +8,7 @@ pub struct FilterAdd {
|
||||||
data: Bytes,
|
data: Bytes,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for FilterAdd {
|
impl Payload for FilterAdd {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
70001
|
70001
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct FilterClear;
|
pub struct FilterClear;
|
||||||
|
|
||||||
impl PayloadType for FilterClear {
|
impl Payload for FilterClear {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
70001
|
70001
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct FilterLoad {
|
pub struct FilterLoad {
|
||||||
|
@ -11,7 +11,7 @@ pub struct FilterLoad {
|
||||||
flags: u8,
|
flags: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for FilterLoad {
|
impl Payload for FilterLoad {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
70001
|
70001
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct GetAddr;
|
pub struct GetAddr;
|
||||||
|
|
||||||
impl PayloadType for GetAddr {
|
impl Payload for GetAddr {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
60002
|
60002
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use hash::H256;
|
use hash::H256;
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct GetBlocks {
|
pub struct GetBlocks {
|
||||||
|
@ -9,7 +9,7 @@ pub struct GetBlocks {
|
||||||
hash_stop: H256,
|
hash_stop: H256,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for GetBlocks {
|
impl Payload for GetBlocks {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use common::BlockTransactionsRequest;
|
use common::BlockTransactionsRequest;
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct GetBlockTxn {
|
pub struct GetBlockTxn {
|
||||||
request: BlockTransactionsRequest,
|
request: BlockTransactionsRequest,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for GetBlockTxn {
|
impl Payload for GetBlockTxn {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
70014
|
70014
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use common::InventoryVector;
|
use common::InventoryVector;
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct GetData {
|
pub struct GetData {
|
||||||
pub inventory: Vec<InventoryVector>,
|
pub inventory: Vec<InventoryVector>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for GetData {
|
impl Payload for GetData {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use hash::H256;
|
use hash::H256;
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct GetHeaders {
|
pub struct GetHeaders {
|
||||||
|
@ -9,7 +9,7 @@ pub struct GetHeaders {
|
||||||
hash_stop: H256,
|
hash_stop: H256,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for GetHeaders {
|
impl Payload for GetHeaders {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use chain::BlockHeader;
|
use chain::BlockHeader;
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct Headers {
|
pub struct Headers {
|
||||||
|
@ -8,7 +8,7 @@ pub struct Headers {
|
||||||
headers: Vec<BlockHeader>,
|
headers: Vec<BlockHeader>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for Headers {
|
impl Payload for Headers {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use common::InventoryVector;
|
use common::InventoryVector;
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct Inv {
|
pub struct Inv {
|
||||||
pub inventory: Vec<InventoryVector>,
|
pub inventory: Vec<InventoryVector>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for Inv {
|
impl Payload for Inv {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct MemPool;
|
pub struct MemPool;
|
||||||
|
|
||||||
impl PayloadType for MemPool {
|
impl Payload for MemPool {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
60002
|
60002
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ use hash::H256;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use chain::BlockHeader;
|
use chain::BlockHeader;
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct MerkleBlock {
|
pub struct MerkleBlock {
|
||||||
|
@ -12,7 +12,7 @@ pub struct MerkleBlock {
|
||||||
flags: Bytes,
|
flags: Bytes,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for MerkleBlock {
|
impl Payload for MerkleBlock {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
70014
|
70014
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use common::InventoryVector;
|
use common::InventoryVector;
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct NotFound {
|
pub struct NotFound {
|
||||||
pub inventory: Vec<InventoryVector>,
|
pub inventory: Vec<InventoryVector>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for NotFound {
|
impl Payload for NotFound {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {MessageResult, PayloadType};
|
use {MessageResult, Payload};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct Ping {
|
pub struct Ping {
|
||||||
pub nonce: u64,
|
pub nonce: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for Ping {
|
impl Payload for Ping {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct Pong {
|
pub struct Pong {
|
||||||
pub nonce: u64,
|
pub nonce: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for Pong {
|
impl Payload for Pong {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone, Copy)]
|
#[derive(Debug, PartialEq, Clone, Copy)]
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
|
@ -59,7 +59,7 @@ pub struct Reject {
|
||||||
// TODO: data
|
// TODO: data
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for Reject {
|
impl Payload for Reject {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct SendCompact {
|
pub struct SendCompact {
|
||||||
|
@ -7,7 +7,7 @@ pub struct SendCompact {
|
||||||
second: u64,
|
second: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for SendCompact {
|
impl Payload for SendCompact {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
70014
|
70014
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct SendHeaders;
|
pub struct SendHeaders;
|
||||||
|
|
||||||
impl PayloadType for SendHeaders {
|
impl Payload for SendHeaders {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
70012
|
70012
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
use ser::{Stream, Reader};
|
use ser::{Stream, Reader};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct Verack;
|
pub struct Verack;
|
||||||
|
|
||||||
impl PayloadType for Verack {
|
impl Payload for Verack {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ use ser::{
|
||||||
Deserializable, Reader, Error as ReaderError,
|
Deserializable, Reader, Error as ReaderError,
|
||||||
};
|
};
|
||||||
use common::{NetAddress, ServiceFlags};
|
use common::{NetAddress, ServiceFlags};
|
||||||
use {PayloadType, MessageResult};
|
use {Payload, MessageResult};
|
||||||
use serialization::deserialize_payload;
|
use serialization::deserialize_payload;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
|
@ -14,7 +14,7 @@ pub enum Version {
|
||||||
V70001(V0, V106, V70001),
|
V70001(V0, V106, V70001),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PayloadType for Version {
|
impl Payload for Version {
|
||||||
fn version() -> u32 {
|
fn version() -> u32 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
use std::io;
|
use std::io;
|
||||||
use futures::{Future, Poll, Async};
|
use futures::{Future, Poll, Async};
|
||||||
use tokio_core::io::{ReadExact, read_exact};
|
use tokio_core::io::{ReadExact, read_exact};
|
||||||
use message::{MessageHeader, MessageResult};
|
use message::{MessageHeader, MessageResult, Magic};
|
||||||
use message::common::Magic;
|
|
||||||
|
|
||||||
pub fn read_header<A>(a: A, magic: Magic) -> ReadHeader<A> where A: io::Read {
|
pub fn read_header<A>(a: A, magic: Magic) -> ReadHeader<A> where A: io::Read {
|
||||||
ReadHeader {
|
ReadHeader {
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use futures::{Poll, Future, Async};
|
use futures::{Poll, Future, Async};
|
||||||
use message::{MessageResult, Error};
|
use message::{MessageResult, Error, Magic, Payload};
|
||||||
use message::common::Magic;
|
|
||||||
use message::serialization::PayloadType;
|
|
||||||
use io::{read_header, ReadHeader, read_payload, ReadPayload};
|
use io::{read_header, ReadHeader, read_payload, ReadPayload};
|
||||||
|
|
||||||
pub fn read_message<M, A>(a: A, magic: Magic, version: u32) -> ReadMessage<M, A>
|
pub fn read_message<M, A>(a: A, magic: Magic, version: u32) -> ReadMessage<M, A>
|
||||||
where A: io::Read, M: PayloadType {
|
where A: io::Read, M: Payload {
|
||||||
ReadMessage {
|
ReadMessage {
|
||||||
state: ReadMessageState::ReadHeader {
|
state: ReadMessageState::ReadHeader {
|
||||||
version: version,
|
version: version,
|
||||||
|
@ -33,7 +31,7 @@ pub struct ReadMessage<M, A> {
|
||||||
message_type: PhantomData<M>,
|
message_type: PhantomData<M>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<M, A> Future for ReadMessage<M, A> where A: io::Read, M: PayloadType {
|
impl<M, A> Future for ReadMessage<M, A> where A: io::Read, M: Payload {
|
||||||
type Item = (A, MessageResult<M>);
|
type Item = (A, MessageResult<M>);
|
||||||
type Error = io::Error;
|
type Error = io::Error;
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,7 @@ use futures::{Future, Poll, Async};
|
||||||
use futures::stream::Stream;
|
use futures::stream::Stream;
|
||||||
use tokio_core::io::{read_exact, ReadExact};
|
use tokio_core::io::{read_exact, ReadExact};
|
||||||
use crypto::checksum;
|
use crypto::checksum;
|
||||||
use message::{Error, MessageHeader, MessageResult};
|
use message::{Error, MessageHeader, MessageResult, Magic, Command};
|
||||||
use message::common::{Magic, Command};
|
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use io::{read_header, ReadHeader};
|
use io::{read_header, ReadHeader};
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,10 @@ use tokio_core::io::{read_exact, ReadExact};
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use hash::H32;
|
use hash::H32;
|
||||||
use crypto::checksum;
|
use crypto::checksum;
|
||||||
use message::{Error, MessageResult};
|
use message::{Error, MessageResult, Payload, deserialize_payload};
|
||||||
use message::serialization::{PayloadType, deserialize_payload};
|
|
||||||
|
|
||||||
pub fn read_payload<M, A>(a: A, version: u32, len: usize, checksum: H32) -> ReadPayload<M, A>
|
pub fn read_payload<M, A>(a: A, version: u32, len: usize, checksum: H32) -> ReadPayload<M, A>
|
||||||
where A: io::Read, M: PayloadType {
|
where A: io::Read, M: Payload {
|
||||||
ReadPayload {
|
ReadPayload {
|
||||||
reader: read_exact(a, Bytes::new_with_len(len)),
|
reader: read_exact(a, Bytes::new_with_len(len)),
|
||||||
version: version,
|
version: version,
|
||||||
|
@ -25,7 +24,7 @@ pub struct ReadPayload<M, A> {
|
||||||
payload_type: PhantomData<M>,
|
payload_type: PhantomData<M>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<M, A> Future for ReadPayload<M, A> where A: io::Read, M: PayloadType {
|
impl<M, A> Future for ReadPayload<M, A> where A: io::Read, M: Payload {
|
||||||
type Item = (A, MessageResult<M>);
|
type Item = (A, MessageResult<M>);
|
||||||
type Error = io::Error;
|
type Error = io::Error;
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,7 @@ use futures::Poll;
|
||||||
use futures::stream::Stream;
|
use futures::stream::Stream;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use message::{MessageResult, PayloadType};
|
use message::{MessageResult, Payload, Command};
|
||||||
use message::common::Command;
|
|
||||||
use net::Connection;
|
use net::Connection;
|
||||||
use io::{read_message_stream, ReadMessageStream, SharedTcpStream, WriteMessage};
|
use io::{read_message_stream, ReadMessageStream, SharedTcpStream, WriteMessage};
|
||||||
|
|
||||||
|
@ -22,7 +21,7 @@ impl Channel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn write_message<T>(&self, payload: &T) -> WriteMessage<T, SharedTcpStream> where T: PayloadType {
|
pub fn write_message<T>(&self, payload: &T) -> WriteMessage<T, SharedTcpStream> where T: Payload {
|
||||||
self.connection.write_message(payload)
|
self.connection.write_message(payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
use std::net;
|
use std::net;
|
||||||
use message::{Message, PayloadType};
|
use message::{Message, Payload, Magic};
|
||||||
use message::common::Magic;
|
|
||||||
use io::{write_message, WriteMessage, SharedTcpStream};
|
use io::{write_message, WriteMessage, SharedTcpStream};
|
||||||
|
|
||||||
pub struct Connection {
|
pub struct Connection {
|
||||||
|
@ -11,7 +10,7 @@ pub struct Connection {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Connection {
|
impl Connection {
|
||||||
pub fn write_message<T>(&self, payload: &T) -> WriteMessage<T, SharedTcpStream> where T: PayloadType {
|
pub fn write_message<T>(&self, payload: &T) -> WriteMessage<T, SharedTcpStream> where T: Payload {
|
||||||
let message = match Message::new(self.magic, self.version, payload) {
|
let message = match Message::new(self.magic, self.version, payload) {
|
||||||
Ok(message) => message,
|
Ok(message) => message,
|
||||||
Err(_err) => {
|
Err(_err) => {
|
||||||
|
|
|
@ -5,7 +5,7 @@ use parking_lot::RwLock;
|
||||||
use futures::{finished, Future};
|
use futures::{finished, Future};
|
||||||
use futures_cpupool::CpuPool;
|
use futures_cpupool::CpuPool;
|
||||||
use tokio_core::reactor::Handle;
|
use tokio_core::reactor::Handle;
|
||||||
use message::PayloadType;
|
use message::Payload;
|
||||||
use net::{Connection, Channel};
|
use net::{Connection, Channel};
|
||||||
use PeerId;
|
use PeerId;
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ impl Connections {
|
||||||
|
|
||||||
/// Broadcast messages to the network.
|
/// Broadcast messages to the network.
|
||||||
/// Returned future completes of first confirmed receive.
|
/// Returned future completes of first confirmed receive.
|
||||||
pub fn broadcast<T>(connections: &Arc<Connections>, handle: &Handle, pool: &CpuPool, payload: T) where T: PayloadType {
|
pub fn broadcast<T>(connections: &Arc<Connections>, handle: &Handle, pool: &CpuPool, payload: T) where T: Payload {
|
||||||
let channels = connections.channels();
|
let channels = connections.channels();
|
||||||
for (id, channel) in channels.into_iter() {
|
for (id, channel) in channels.into_iter() {
|
||||||
let write = channel.write_message(&payload);
|
let write = channel.write_message(&payload);
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
use std::sync::mpsc::{Sender, Receiver, channel};
|
use std::sync::mpsc::{Sender, Receiver, channel};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use message::{Error, PayloadType};
|
use message::{Error, Payload, Command, deserialize_payload};
|
||||||
use message::common::Command;
|
|
||||||
use message::types::{Addr, GetAddr};
|
use message::types::{Addr, GetAddr};
|
||||||
use message::serialization::deserialize_payload;
|
|
||||||
use PeerId;
|
use PeerId;
|
||||||
|
|
||||||
struct Handler<S> {
|
struct Handler<S> {
|
||||||
|
@ -19,7 +17,7 @@ impl<S> Default for Handler<S> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S> Handler<S> where S: PayloadType {
|
impl<S> Handler<S> where S: Payload {
|
||||||
fn command(&self) -> Command {
|
fn command(&self) -> Command {
|
||||||
S::command().into()
|
S::command().into()
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ use futures::{Future, finished};
|
||||||
use futures::stream::Stream;
|
use futures::stream::Stream;
|
||||||
use futures_cpupool::CpuPool;
|
use futures_cpupool::CpuPool;
|
||||||
use tokio_core::reactor::Handle;
|
use tokio_core::reactor::Handle;
|
||||||
use message::PayloadType;
|
use message::Payload;
|
||||||
use net::{connect, listen, Connections, Subscriber, MessagesHandler};
|
use net::{connect, listen, Connections, Subscriber, MessagesHandler};
|
||||||
use Config;
|
use Config;
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ impl P2P {
|
||||||
self.event_loop_handle.spawn(pool_work);
|
self.event_loop_handle.spawn(pool_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn broadcast<T>(&self, payload: T) where T: PayloadType {
|
pub fn broadcast<T>(&self, payload: T) where T: Payload {
|
||||||
Connections::broadcast(&self.connections, &self.event_loop_handle, &self.pool, payload)
|
Connections::broadcast(&self.connections, &self.event_loop_handle, &self.pool, payload)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue