- Notifications
You must be signed in to change notification settings - Fork8
Easy-to-use wrapper for WebRTC DataChannels peer-to-peer connections written in Rust and compiling to WASM.
License
Apache-2.0, MIT licenses found
Licenses found
wasm-peers/wasm-peers
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
This crate provides an easy-to-use wrapper around WebRTC and DataChannels for a peer-to-peer connections.
As creator ofagar.io famously statedWebRTC is hard.This library aims to help, by abstracting away all the setup, and providing a simple way to sendand receive messages over the data channel.
It's as easy as providing address to a signaling server instance fromaccompanying crate and specifying two callbacks.One that specifies what should happen when a connection is established, and one for when a message is received.After that you can send messages back and forth without worrying about the implementation details.
Library contains three network topologies,one-to-one
, which creates an equal connection between two peers,one-to-many
, which specifies a host and arbitrary number of clientsandmany-to-many
that creates connection for each pair of peers and allows sending messages to any of them.
For a "production ready" apps built with thislibrary check out eitherLive Document orFootballers.
This example shows two peers sendingping
andpong
messages to each other.
use wasm_peers::ConnectionType;use wasm_peers::one_to_one::NetworkManager;use web_sys::console;// there must be a signaling server from accompanying crate running on this portconstSIGNALING_SERVER_URL:&str ="ws://0.0.0.0:9001/one-to-one";fnmain(){// there must be some mechanism for exchanging session ids between peerslet session_id =SessionId::new("some-session-id".to_string());letmut peer1 =NetworkManager::new(SIGNALING_SERVER_URL, session_id.clone(),&ConnectionType::Stun,).unwrap();let peer1_clone = peer1.clone();let peer1_on_open =move || peer1_clone.send_message("ping!").unwrap();let peer1_on_message ={move |message|{ console::log_1(&format!("peer1 received message: {}", message).into());}}; peer1.start(peer1_on_open, peer1_on_message).unwrap();letmut peer2 =NetworkManager::new(SIGNALING_SERVER_URL, session_id,&ConnectionType::Stun,).unwrap();let peer2_on_open = ||{/* do nothing */};let peer2_clone = peer2.clone();let peer2_on_message ={let peer2_received_message = peer2_received_message.clone();move |message|{ console::log_1(&format!("peer2 received message: {}", message).into()); peer2_clone.send_message("pong!").unwrap();}}; peer2.start(peer2_on_open, peer2_on_message).unwrap();}
For examples of other topologies check out thedocs.
- Add tests
- Improve error handling
- Introduce alternative API with futures
- Add possibility to pass video/audio streams over established connection
- 0.4
- MiniServer callbacks don't accept UserId argument now (it'd always be hosts)
- Fix documentation tests so that they compile
- 0.3
- Initial release to the public
This project is licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE orhttp://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT orhttp://opensource.org/licenses/MIT)
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, asdefined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Tom KarwowskiLinkedIn
These projects helped me grasp WebRTC in Rust:
Also, special thanks to the guys with whom I did my B.Eng. thesis.
About
Easy-to-use wrapper for WebRTC DataChannels peer-to-peer connections written in Rust and compiling to WASM.