use crate::error::{Error, Result};
use rand::{Rng, rng};
use std::net::{SocketAddr, ToSocketAddrs};
fn match_range(lower: u8, upper: u8) -> impl Fn(&[u8]) -> bool {
move |buf: &[u8]| -> bool {
if buf.is_empty() {
return false;
}
let b = buf[0];
b >= lower && b <= upper
}
}
pub fn match_dtls(b: &[u8]) -> bool {
match_range(20, 63)(b)
}
pub fn match_srtp_or_srtcp(b: &[u8]) -> bool {
match_range(128, 191)(b)
}
pub fn is_rtcp(buf: &[u8]) -> bool {
if buf.len() < 4 {
return false;
}
let rtcp_packet_type = buf[1];
(192..=223).contains(&rtcp_packet_type)
}
pub fn match_srtp(buf: &[u8]) -> bool {
match_srtp_or_srtcp(buf) && !is_rtcp(buf)
}
pub fn match_srtcp(buf: &[u8]) -> bool {
match_srtp_or_srtcp(buf) && is_rtcp(buf)
}
pub fn lookup_host<T>(use_ipv4: bool, host: T) -> Result<SocketAddr>
where
T: ToSocketAddrs,
{
for remote_addr in host.to_socket_addrs()? {
if (use_ipv4 && remote_addr.is_ipv4()) || (!use_ipv4 && remote_addr.is_ipv6()) {
return Ok(remote_addr);
}
}
Err(Error::ErrAddressParseFailed)
}
const RUNES_ALPHA: &[u8] = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
const RUNES_ALPHA_NUMBER: &[u8] = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
pub fn math_rand_alpha(n: usize) -> String {
generate_crypto_random_string(n, RUNES_ALPHA)
}
pub fn math_rand_alpha_number(n: usize) -> String {
generate_crypto_random_string(n, RUNES_ALPHA_NUMBER)
}
pub fn generate_crypto_random_string(n: usize, runes: &[u8]) -> String {
let mut rng = rng();
let rand_string: String = (0..n)
.map(|_| {
let idx = rng.random_range(0..runes.len());
runes[idx] as char
})
.collect();
rand_string
}