webterm_agent/models/
relay_connection.rs1use 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}