yrs-webrtc

This is a Yrs integrated network provider which makes use of WebRTC protocol to propagate changes. It's compatible with y-webrtc JavaScript client and makes use of the same signaling server protocol (there are Node.js and Rust implementations of that protocol for you to use).

Example

```rust use yrswebrtc::signal::PeerEvent; use yrswebrtc::{Error, Room, SignalingConn};

// start a WebRTC peer async fn peer(topic: &str) -> Result<(), Error> { // create a signaling client let conn = Arc::new(SignalingConn::connect("ws://localhost:8000/signaling").await?); // create a new peer collaborating on a given topic let room = Room::open(topic, Awareness::default(), [conn]); let mut peerevents = room.peerevents().subscribe();

// wait for room to initialize connection to signaling server
room.connect().await?;

// listen for events about connecting/disconnecting peers
let _ = tokio::spawn(async move {
    while let Ok(e) = peer_events.recv().await {
        println!("received peer event: {e:?}");
    }
});

// watch for incoming updates
let _ = {
    let awareness = room.awareness().write().await;
    awareness.doc().observe_update_v1(move |txn, u| {
        let u = Update::decode_v1(&u.update).unwrap();
        println!("received update: {u:?}");
    })
};

// keep room alive and close it when you're done
room.close().await?;

}

// create y-webrtc/yrs-webrtc compatible signaling server use yrswarp::signaling::{signalingconn, SignalingService};

[tokio::main]

async fn main() -> Result<(), Error> { let signaling = SignalingService::new();

let ws = warp::path("signaling")
    .and(warp::ws())
    .and(warp::any().map(move || signaling.clone()))
    .and_then(ws_handler);

warp::serve(ws).run(([0, 0, 0, 0], 8000)).await;
Ok(())

}

async fn wshandler(ws: Ws, svc: SignalingService) -> Result { Ok(ws.onupgrade(move |socket| ws_conn(socket, svc))) }

async fn wsconn(ws: WebSocket, svc: SignalingService) { match signalingconn(ws, svc).await { Ok(_) => println!("signaling connection stopped"), Err(e) => eprintln!("signaling connection failed: {}", e), } } ```