antenna_protocol/handshake/
joiner.rs1use crate::handshake::{HandshakeInput, HandshakeOutput, HandshakeState};
2use anyhow::{Result, anyhow};
3
4pub 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}