Skip to main content

antenna_protocol/handshake/
joiner.rs

1use crate::handshake::{HandshakeInput, HandshakeOutput, HandshakeState};
2use anyhow::{Result, anyhow};
3
4/// Joiner-side handshake FSM
5pub struct Joiner {
6    state: HandshakeState,
7}
8
9impl Default for Joiner {
10    fn default() -> Self {
11        Self::new()
12    }
13}
14
15impl Joiner {
16    pub fn new() -> Self {
17        Self {
18            state: HandshakeState::Idle,
19        }
20    }
21
22    pub fn state(&self) -> &HandshakeState {
23        &self.state
24    }
25
26    pub fn process(&mut self, input: HandshakeInput) -> Result<Option<HandshakeOutput>> {
27        match (&self.state, input) {
28            (HandshakeState::Idle, HandshakeInput::Offer(offer)) => {
29                self.state = HandshakeState::CreatingAnswer;
30                Ok(Some(HandshakeOutput::RequestSDPAnswer(offer)))
31            }
32            (HandshakeState::CreatingAnswer, HandshakeInput::AnswerCreated(_)) => {
33                self.state = HandshakeState::WaitingForDataChannel;
34                Ok(None)
35            }
36            (HandshakeState::WaitingForDataChannel, HandshakeInput::DataChannelOpen) => {
37                self.state = HandshakeState::Connected;
38                Ok(Some(HandshakeOutput::Connected))
39            }
40            (_, HandshakeInput::ConnectionDropped) => {
41                self.state = HandshakeState::Closed;
42                Ok(Some(HandshakeOutput::Close))
43            }
44            _ => Err(anyhow!("Unhandled input by joiner fsm")),
45        }
46    }
47}