This change fixes tasks hanging due to rare cases of messages being lost between full Discord reconnections by placing a configurable timeout on the `ConnectionInfo` responses. This is a companion fix to [serenity#1255](https://github.com/serenity-rs/serenity/pull/1255). To make this doable, `Config`s are now used by all versions of `Songbird`/`Call`, and relevant functions are added to simplify setup with configuration. These are now non-exhaustive, correcting an earlier oversight. For future extensibility, this PR moves the return type of `join`/`join_gateway` into a custom future (no longer leaking flume's `RecvFut` type). Additionally, this fixes the Makefile's feature sets for driver/gateway-only compilation. This is a breaking change in: * the return types of `join`/`join_gateway` * moving `crate::driver::Config` -> `crate::Config`, * `Config` and `JoinError` becoming `#[non_breaking]`. This was tested via `cargo make ready`, and by testing `examples/serenity/voice_receive` with various timeout settings.
99 lines
2.2 KiB
Rust
99 lines
2.2 KiB
Rust
use super::message::*;
|
|
use crate::ws::Error as WsError;
|
|
use audiopus::Error as OpusError;
|
|
use flume::SendError;
|
|
use std::io::Error as IoError;
|
|
use xsalsa20poly1305::aead::Error as CryptoError;
|
|
|
|
#[derive(Debug)]
|
|
pub enum Recipient {
|
|
AuxNetwork,
|
|
Event,
|
|
Mixer,
|
|
UdpRx,
|
|
UdpTx,
|
|
}
|
|
|
|
pub type Result<T> = std::result::Result<T, Error>;
|
|
|
|
#[derive(Debug)]
|
|
#[non_exhaustive]
|
|
pub enum Error {
|
|
Crypto(CryptoError),
|
|
/// Received an illegal voice packet on the voice UDP socket.
|
|
IllegalVoicePacket,
|
|
InterconnectFailure(Recipient),
|
|
Io(IoError),
|
|
Opus(OpusError),
|
|
Ws(WsError),
|
|
}
|
|
|
|
impl Error {
|
|
pub(crate) fn should_trigger_connect(&self) -> bool {
|
|
matches!(
|
|
self,
|
|
Error::InterconnectFailure(Recipient::AuxNetwork)
|
|
| Error::InterconnectFailure(Recipient::UdpRx)
|
|
| Error::InterconnectFailure(Recipient::UdpTx)
|
|
)
|
|
}
|
|
|
|
pub(crate) fn should_trigger_interconnect_rebuild(&self) -> bool {
|
|
matches!(self, Error::InterconnectFailure(Recipient::Event))
|
|
}
|
|
}
|
|
|
|
impl From<CryptoError> for Error {
|
|
fn from(e: CryptoError) -> Self {
|
|
Error::Crypto(e)
|
|
}
|
|
}
|
|
|
|
impl From<IoError> for Error {
|
|
fn from(e: IoError) -> Error {
|
|
Error::Io(e)
|
|
}
|
|
}
|
|
|
|
impl From<OpusError> for Error {
|
|
fn from(e: OpusError) -> Error {
|
|
Error::Opus(e)
|
|
}
|
|
}
|
|
|
|
impl From<SendError<WsMessage>> for Error {
|
|
fn from(_e: SendError<WsMessage>) -> Error {
|
|
Error::InterconnectFailure(Recipient::AuxNetwork)
|
|
}
|
|
}
|
|
|
|
impl From<SendError<EventMessage>> for Error {
|
|
fn from(_e: SendError<EventMessage>) -> Error {
|
|
Error::InterconnectFailure(Recipient::Event)
|
|
}
|
|
}
|
|
|
|
impl From<SendError<MixerMessage>> for Error {
|
|
fn from(_e: SendError<MixerMessage>) -> Error {
|
|
Error::InterconnectFailure(Recipient::Mixer)
|
|
}
|
|
}
|
|
|
|
impl From<SendError<UdpRxMessage>> for Error {
|
|
fn from(_e: SendError<UdpRxMessage>) -> Error {
|
|
Error::InterconnectFailure(Recipient::UdpRx)
|
|
}
|
|
}
|
|
|
|
impl From<SendError<UdpTxMessage>> for Error {
|
|
fn from(_e: SendError<UdpTxMessage>) -> Error {
|
|
Error::InterconnectFailure(Recipient::UdpTx)
|
|
}
|
|
}
|
|
|
|
impl From<WsError> for Error {
|
|
fn from(e: WsError) -> Error {
|
|
Error::Ws(e)
|
|
}
|
|
}
|