extern crate websocket;
extern crate futures;
extern crate tokio_core;
use websocket::message::OwnedMessage;
use websocket::server::InvalidConnection;
use websocket::async::Server;
use tokio_core::reactor::Core;
use futures::{Future, Sink, Stream};
fn main() {
let mut core = Core::new().unwrap();
let handle = core.handle();
let server = Server::bind("127.0.0.1:9002", &handle).unwrap();
let f = server.incoming()
.map_err(|InvalidConnection { error, .. }| error)
.for_each(|(upgrade, addr)| {
println!("Got a connection from: {}", addr);
let f = upgrade
.accept()
.and_then(|(s, _)| {
let (sink, stream) = s.split();
stream
.take_while(|m| Ok(!m.is_close()))
.filter_map(|m| {
match m {
OwnedMessage::Ping(p) => Some(OwnedMessage::Pong(p)),
OwnedMessage::Pong(_) => None,
_ => Some(m),
}
})
.forward(sink)
.and_then(|(_, sink)| {
sink.send(OwnedMessage::Close(None))
})
});
handle.spawn(f.map_err(move |e| println!("{}: '{:?}'", addr, e))
.map(move |_| println!("{} closed.", addr)));
Ok(())
});
core.run(f).unwrap();
}