webterm_agent/models/
relay_connection.rs

1use crate::models::agent_error::AgentError;
2use crate::models::connection_manager::ConnectionManager;
3use crate::models::relay::Relay;
4use crate::models::socket_reader::{SocketReader, SocketSubscriber};
5use crate::models::socket_writer::{SocketPublisher, SocketWriter};
6use futures::StreamExt;
7use std::sync::Arc;
8use tokio_tungstenite::connect_async;
9use tracing::debug;
10
11pub struct RelayConnection {
12    writer: SocketWriter,
13    reader: SocketReader,
14}
15
16impl RelayConnection {
17    pub async fn new(
18        relay: Arc<Relay>,
19        nonce: String,
20        cm: Arc<ConnectionManager>,
21    ) -> Result<Self, AgentError> {
22        debug!("Connecting to relay: {}", relay.websocket_url(None));
23
24        let socket = connect_async(relay.websocket_url(Some(nonce))).await?;
25        let (socket, _) = socket;
26        let (relay_writer, relay_reader) = socket.split();
27
28        Ok(Self {
29            writer: SocketWriter::new(relay_writer, cm.clone()),
30            reader: SocketReader::new(relay_reader, cm),
31        })
32    }
33
34    pub async fn publisher(&self) -> SocketPublisher {
35        self.writer.publisher()
36    }
37
38    pub async fn subscriber(&self) -> SocketSubscriber {
39        self.reader.subscriber()
40    }
41}