use std::net::TcpStream;
use std::marker::PhantomData;
use ws;
use ws::util::url::ToWebSocketUrlComponents;
use ws::receiver::{DataFrameIterator, MessageIterator};
use result::WebSocketResult;
use stream::WebSocketStream;
use dataframe::DataFrame;
use openssl::ssl::{SslContext, SslMethod, SslStream};
pub use self::request::Request;
pub use self::response::Response;
pub use self::sender::Sender;
pub use self::receiver::Receiver;
pub mod sender;
pub mod receiver;
pub mod request;
pub mod response;
pub struct Client<D, S, R> {
sender: S,
receiver: R,
_dataframe: PhantomData<D>
}
impl Client<DataFrame, Sender<WebSocketStream>, Receiver<WebSocketStream>> {
pub fn connect<T: ToWebSocketUrlComponents>(components: T) -> WebSocketResult<Request<WebSocketStream, WebSocketStream>> {
let context = try!(SslContext::new(SslMethod::Tlsv1));
Client::connect_ssl_context(components, &context)
}
pub fn connect_ssl_context<T: ToWebSocketUrlComponents>(components: T, context: &SslContext) -> WebSocketResult<Request<WebSocketStream, WebSocketStream>> {
let (host, resource_name, secure) = try!(components.to_components());
let connection = try!(TcpStream::connect(
(&host.hostname[..], host.port.unwrap_or(if secure { 443 } else { 80 }))
));
let stream = if secure {
let sslstream = try!(SslStream::new(context, connection));
WebSocketStream::Ssl(sslstream)
}
else {
WebSocketStream::Tcp(connection)
};
Request::new((host, resource_name, secure), try!(stream.try_clone()), stream)
}
}
impl<D, S: ws::Sender<D>, R: ws::Receiver<D>> Client<D, S, R> {
pub fn new(sender: S, receiver: R) -> Client<D, S, R> {
Client {
sender: sender,
receiver: receiver,
_dataframe: PhantomData
}
}
pub fn send_dataframe(&mut self, dataframe: D) -> WebSocketResult<()> {
self.sender.send_dataframe(dataframe)
}
pub fn send_message<M>(&mut self, message: M) -> WebSocketResult<()>
where M: ws::Message<D> {
self.sender.send_message(message)
}
pub fn recv_dataframe(&mut self) -> WebSocketResult<D> {
self.receiver.recv_dataframe()
}
pub fn incoming_dataframes<'a>(&'a mut self) -> DataFrameIterator<'a, R, D> {
self.receiver.incoming_dataframes()
}
pub fn recv_message<M, I>(&mut self) -> WebSocketResult<M>
where M: ws::Message<D, DataFrameIterator = I>, I: Iterator<Item = D> {
self.receiver.recv_message()
}
pub fn incoming_messages<'a, M>(&'a mut self) -> MessageIterator<'a, R, D, M>
where M: ws::Message<D> {
self.receiver.incoming_messages()
}
pub fn get_sender(&self) -> &S {
&self.sender
}
pub fn get_reciever(&self) -> &R {
&self.receiver
}
pub fn get_mut_sender(&mut self) -> &mut S {
&mut self.sender
}
pub fn get_mut_reciever(&mut self) -> &mut R {
&mut self.receiver
}
pub fn split(self) -> (S, R) {
(self.sender, self.receiver)
}
}