use crate::handshake::{HandshakeInput, HandshakeOutput, HandshakeState};
use anyhow::{Result, anyhow};
pub struct Joiner {
state: HandshakeState,
}
impl Default for Joiner {
fn default() -> Self {
Self::new()
}
}
impl Joiner {
pub fn new() -> Self {
Self {
state: HandshakeState::Idle,
}
}
pub fn state(&self) -> &HandshakeState {
&self.state
}
pub fn process(&mut self, input: HandshakeInput) -> Result<Option<HandshakeOutput>> {
match (&self.state, input) {
(HandshakeState::Idle, HandshakeInput::Offer(offer)) => {
self.state = HandshakeState::CreatingAnswer;
Ok(Some(HandshakeOutput::RequestSDPAnswer(offer)))
}
(HandshakeState::CreatingAnswer, HandshakeInput::AnswerCreated(_)) => {
self.state = HandshakeState::WaitingForDataChannel;
Ok(None)
}
(HandshakeState::WaitingForDataChannel, HandshakeInput::DataChannelOpen) => {
self.state = HandshakeState::Connected;
Ok(Some(HandshakeOutput::Connected))
}
(_, HandshakeInput::ConnectionDropped) => {
self.state = HandshakeState::Closed;
Ok(Some(HandshakeOutput::Close))
}
_ => Err(anyhow!("Unhandled input by joiner fsm")),
}
}
}