A Rust implementation of TURN server and client.
```rust use futures::Future; use rustun::message::Request; use rustun::transport::StunUdpTransporter; use rusturn::auth::AuthParams; use rusturn::transport::UdpOverTurnTransporter; use stun_codec::{rfc5389, MessageDecoder, MessageEncoder};
let clientauthparams = AuthParams::new("foo", "bar")?; let serverauthparams = AuthParams::withrealmand_nonce("foo", "bar", "baz", "qux")?;
// STUN server (peer) let stunserver = fibersglobal::execute(rustun::server::UdpServer::start( fibersglobal::handle(), "127.0.0.1:0".parse().unwrap(), rustun::server::BindingHandler, ))?; let stunserveraddr = stunserver.localaddr(); fibersglobal::spawn(stunserver.map(|| ()).map_err(|e| panic!("{}", e)));
// TURN server let turnserver = fibersglobal::execute(rusturn::server::UdpServer::start( "127.0.0.1:0".parse().unwrap(), serverauthparams, ))?; let turnserveraddr = turnserver.localaddr(); fibersglobal::spawn(turnserver.map_err(|e| panic!("{}", e)));
// TURN client let turnclient = fibersglobal::execute(rusturn::client::UdpClient::allocate( turnserveraddr, clientauthparams ))?; let transporter = UdpOverTurnTransporter::<_, MessageEncoder<_>, MessageDecoder<_>>::new(turn_client);
// STUN client (over TURN) let stunchannel = rustun::channel::Channel::new(StunUdpTransporter::new(transporter)); let stunclient = rustun::client::Client::new(&fibersglobal::handle(), stunchannel);
// BINDING request
let request = Request::