rosu-render 0.5.1

An o!rdr wrapper to render osu! replays
Documentation
pub mod error;

pub(crate) mod packet;
pub(crate) mod socket;

use bytes::Bytes;

use crate::websocket::engineio::packet::Packet;

use self::{error::EngineIoError, packet::PacketId, socket::Socket};

pub(crate) struct EngineIo {
    socket: Socket,
}

impl EngineIo {
    pub(crate) async fn connect() -> Result<Self, EngineIoError> {
        Socket::new().await.map(|socket| Self { socket })
    }

    pub(crate) async fn next_message(&mut self) -> Result<Option<Bytes>, EngineIoError> {
        loop {
            match self.socket.next_packet().await? {
                Some(packet) => match packet.packet_id {
                    PacketId::Message => return Ok(Some(packet.data)),
                    PacketId::Close => return Ok(None),
                    PacketId::Ping => self.socket.pong().await?,
                    PacketId::Open | PacketId::Pong | PacketId::Upgrade => {}
                },
                None => return Ok(None),
            }
        }
    }

    pub(crate) async fn emit(&mut self, packet: Packet) -> Result<(), EngineIoError> {
        self.socket.emit(packet).await
    }

    pub(crate) async fn disconnect(self) -> Result<(), EngineIoError> {
        self.socket.disconnect().await
    }

    pub(crate) async fn reconnect(&mut self) -> Result<(), EngineIoError> {
        trace!("Reconnecting engine.io");
        self.socket = Socket::new().await?;

        Ok(())
    }
}