5 releases
Uses old Rust 2015
0.1.4 | Oct 12, 2019 |
---|---|
0.1.3 | Apr 17, 2018 |
0.1.2 | Apr 17, 2018 |
0.1.1 | Mar 25, 2018 |
0.1.0 | Mar 17, 2018 |
#185 in WebSocket
17KB
342 lines
phoenix-channels-rs
A Rust library providing functionality to connect to a phoenix channel.
It is intended to become at least a production grade client however it is very early in development and as such should be treated as experimental.
Currently there are two ways to use this library. The first is a high level threaded client and the second is a low level sender/receiver.
Connecting via the client
Connecting via the client will return a tuple with the Client
struct and a mpsc::Receiver
of
processed incoming messages. This allows for messages to be received in a separate thread if desired.
An very basic example of connecting with the Client
:
use std::thread;
extern crate phoenix_channels;
use phoenix_channels::client;
let url = "ws://localhost:4000/socket";
let token = "abcde12345";
let params = vec![("token", token)];
let (client, messages) = client::Client::new(url, params, None).unwrap();
thread::spawn(move || {
for message in messages {
println!("{:?}", message);
}
});
client.join("room:lobby").unwrap();
The client itself will handle the heartbeat and anything else required to deliver a serde json struct to the message iterator result. However, it is an opinionated implementation of a phoenix client and uses threading, mutexes and channels to achieve its end goal of an easy to use interface. This may not be desirable for scenarios where more control is required.
Connecting via the Sender/Receiver
An alternative to the high level Client
is to purely use the low level Sender
and Receiver
structs
and handle the threading and heartbeats yourself. The processing of messages is still handled and methods such
as join
and heartbeat
are still conveniently available on the Sender
struct (the Client
library
actually uses these under the hood).
Here is an example of how one can use the Sender
/Receiver
structs themselves:
use std::thread;
use std::time::Duration;
extern crate phoenix_channels;
use phoenix_channels::client;
let url = "ws://localhost:4000/socket";
let token = "abcde12345";
let params = vec![("token", token)];
let (mut sender, receiver) = client::connect(url, params, None).unwrap();
sender.join("room:lobby").unwrap();
// create a heartbeat thread
thread::spawn(move || {
loop {
sender.heartbeat().unwrap();
thread::sleep(Duration::from_secs(2));
}
});
for message in receiver {
println!("{:?}", message);
}
Using the lower level API requires more work but it gives you full control over the threading and flow of messages being sent and received to the server.
Logging
Both the high level and low level APIs use slog under the hood for structured logging. To enable this
you can pass your logger via both connect
and Client::new
by specifying Some(logger)
where the
examples currently specify None
.
Dependencies
~7.5MB
~157K SLoC