use getrandom::getrandom;
use rand_core::{CryptoRng, RngCore};
use crate::traits::AllowedRng;
pub struct WasmRng;
impl CryptoRng for WasmRng {}
impl RngCore for WasmRng {
fn next_u32(&mut self) -> u32 {
let mut bytes = [0u8; 4];
self.fill_bytes(&mut bytes);
u32::from_le_bytes(bytes)
}
fn next_u64(&mut self) -> u64 {
let mut bytes = [0u8; 8];
self.fill_bytes(&mut bytes);
u64::from_le_bytes(bytes)
}
fn fill_bytes(&mut self, dest: &mut [u8]) {
getrandom(dest).expect("getrandom failed in browser environment");
}
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand_core::Error> {
self.fill_bytes(dest);
Ok(())
}
}
impl AllowedRng for WasmRng {}
impl Default for WasmRng {
fn default() -> Self {
Self
}
}
pub type WasmRngFromSeed = rand_chacha::ChaCha20Rng;