pub const ALPN: &[u8] = b"pulse";
pub const WIRE_VERSION: u32 = 2;
pub const CLOSE_INVALID_CONTROL: u32 = 1;
pub const CLOSE_UNAUTHENTICATED: u32 = 2;
pub const CLOSE_QUOTA_EXCEEDED: u32 = 3;
pub const CLOSE_UNSUPPORTED_VERSION: u32 = 4;
pub const CLOSE_TIER_NOT_ENTITLED: u32 = 5;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RetryClass {
Normal,
NonRetryable,
CredentialsRequired,
Transient,
Unknown,
}
pub const fn classify_close_code(code: u64) -> RetryClass {
match code {
0 => RetryClass::Normal,
1 | 4 | 5 => RetryClass::NonRetryable,
2 => RetryClass::CredentialsRequired,
3 => RetryClass::Transient,
_ => RetryClass::Unknown,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn public_close_codes_have_stable_retry_semantics() {
assert_eq!(classify_close_code(0), RetryClass::Normal);
assert_eq!(classify_close_code(1), RetryClass::NonRetryable);
assert_eq!(classify_close_code(2), RetryClass::CredentialsRequired);
assert_eq!(classify_close_code(3), RetryClass::Transient);
assert_eq!(classify_close_code(4), RetryClass::NonRetryable);
assert_eq!(classify_close_code(5), RetryClass::NonRetryable);
assert_eq!(classify_close_code(99), RetryClass::Unknown);
}
}