2016-10-17 01:52:15 -07:00
|
|
|
use std::{io, net};
|
2016-10-14 01:55:28 -07:00
|
|
|
use futures::Poll;
|
|
|
|
use futures::stream::Stream;
|
|
|
|
use parking_lot::Mutex;
|
|
|
|
use bytes::Bytes;
|
2016-10-17 01:52:15 -07:00
|
|
|
use message::{MessageResult, Payload, Command, Magic, Message};
|
2016-10-14 01:55:28 -07:00
|
|
|
use net::Connection;
|
2016-10-17 01:52:15 -07:00
|
|
|
use io::{read_message_stream, ReadMessageStream, SharedTcpStream, WriteMessage, write_message};
|
2016-10-14 01:55:28 -07:00
|
|
|
|
|
|
|
pub struct Channel {
|
2016-10-17 01:52:15 -07:00
|
|
|
write_stream: SharedTcpStream,
|
|
|
|
version: u32,
|
|
|
|
magic: Magic,
|
|
|
|
address: net::SocketAddr,
|
|
|
|
read_stream: Mutex<ReadMessageStream<SharedTcpStream>>,
|
2016-10-14 01:55:28 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Channel {
|
|
|
|
pub fn new(connection: Connection) -> Self {
|
|
|
|
let stream = read_message_stream(connection.stream.clone(), connection.magic);
|
|
|
|
Channel {
|
2016-10-17 01:52:15 -07:00
|
|
|
write_stream: connection.stream,
|
|
|
|
version: connection.version,
|
|
|
|
magic: connection.magic,
|
|
|
|
address: connection.address,
|
|
|
|
read_stream: Mutex::new(stream),
|
2016-10-14 01:55:28 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-14 02:44:11 -07:00
|
|
|
pub fn write_message<T>(&self, payload: &T) -> WriteMessage<T, SharedTcpStream> where T: Payload {
|
2016-10-17 01:52:15 -07:00
|
|
|
let message = Message::new(self.magic, self.version, payload).expect("failed to create outgoing message");
|
|
|
|
write_message(self.write_stream.clone(), message)
|
2016-10-14 01:55:28 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn poll_message(&self) -> Poll<Option<(MessageResult<(Command, Bytes)>)>, io::Error> {
|
2016-10-17 01:52:15 -07:00
|
|
|
self.read_stream.lock().poll()
|
2016-10-14 01:55:28 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn version(&self) -> u32 {
|
2016-10-17 01:52:15 -07:00
|
|
|
self.version
|
2016-10-14 01:55:28 -07:00
|
|
|
}
|
|
|
|
}
|