aboutsummaryrefslogtreecommitdiff
path: root/client-native-rift/src/signaling.rs
blob: 2ac3edca2e80eace66c9113ef010f7686f4c8212 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use crate::protocol::ClientboundPacket;
use crate::{crypto::hash, protocol::ServerboundPacket};
use futures_util::{SinkExt, StreamExt};
use log::{debug, info};
use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender};
use tokio_tungstenite::tungstenite::{self, Message};

pub async fn signaling_connect(
    host: &str,
    secret: &str,
) -> (
    UnboundedSender<ServerboundPacket>,
    UnboundedReceiver<ClientboundPacket>,
) {
    let uri = format!("wss://{host}/signaling/{}", hash(secret));
    info!("connecting to signaling server at {uri:?}");
    let (conn, _) = tokio_tungstenite::connect_async(url::Url::parse(&uri).unwrap())
        .await
        .unwrap();
    info!("connection established");

    let (mut tx, rx) = conn.split();

    let (in_tx, in_rx) = unbounded_channel();
    let (out_tx, mut out_rx) = unbounded_channel();

    tokio::spawn(async {
        rx.for_each(move |mesg| {
            info!("packet in");
            let mesg = mesg.unwrap();
            match mesg {
                tungstenite::Message::Text(t) => {
                    let p: ClientboundPacket = serde_json::from_str(t.as_str()).unwrap();
                    debug!("<-  {p:?}");
                    in_tx.send(p).unwrap()
                }
                tungstenite::Message::Close(_) => {
                    eprintln!("ws closed :(");
                    unreachable!();
                }
                _ => (),
            }
            Box::pin(async { () })
        })
        .await;
    });
    tokio::spawn(async move {
        while let Some(p) = out_rx.recv().await {
            debug!(" ->  {p:?}");
            tx.send(Message::Text(
                serde_json::to_string::<ServerboundPacket>(&p).unwrap(),
            ))
            .await
            .unwrap()
        }
    });

    (out_tx, in_rx)
}