websocket-stream [](https://travis-ci.org/nathansizemore/websocket-stream)
================
websocket-stream is a [RFC-6455](https://tools.ietf.org/html/rfc6455)
wrapper for [TcpStream](http://doc.rust-lang.org/std/net/struct.TcpStream.html)
on POSIX-like kernels. It can be used in blocking or non-blocking mode.
I don't do enough Windows development to care about ensuring it is platform agnostic. Feel free to send me a pull request if you want to take the time to implement Windows sockets as well.
It achieves it's non-blocking state by setting the `O_NONBLOCK` flag on the
stream's file descriptor.
### Example Usage
~~~rust
extern crate websocket_stream as wss;
use wss::{WebsocketStream, ReadResult, WriteResult, Mode};
use wss::util::{OpCode, ReadError, WriteError};
fn some_function() {
// stream is some std::net::TcpStream
let mut ws_stream = match WebsocketStream::new(stream, Mode::NonBlock) {
Ok(ws) => ws,
Err(e) => {
// This arm is hit when the system does not support 0_NONBLOCK
panic!("Websocket creation failed, errno: {}", e)
}
};
// Read a thing
match ws_stream.read() {
Ok(res_tuple) => {
match res_tuple.0 {
OpCode::Continuation => handle_cont(res_tuple.1),
OpCode::Text => handle_text(res_tuple.1),
OpCode::Binary => handle_binary(res_tuple.1),
OpCode::Close => handle_close(res_tuple.1),
OpCode::Ping => handle_ping(res_tuple.1),
OpCode::Pong => handle_pong(res_tuple.1)
}
}
Err(e) => {
match e {
ReadError::EAGAIN => {
// This arm is hit in Mode::NonBlock
// Signifies there was no data to read
}
_ => {
// This arm is hit on syscall level errors.
// ReadError can be printed for details
}
}
}
}
// Write a thing
let mut buf: Vec = Vec::new(); // Buffer full of awesome
match ws_stream.write(OpCode::Text, &mut buf) {
Ok(num_written) => {
// Obv, num_written is the amount of bytes written
}
Err(e) => {
// This arm is hit on syscall level errors.
// WriteError can be printed for details
}
}
}
~~~