#[cfg(target_arch = "wasm32")]
use std::sync::{Mutex, MutexGuard, OnceLock};
use rand::{rngs::SmallRng, Rng, SeedableRng};
const RNG_SEED: u64 = 6148914691236517205;
pub type DeterministicRng = SmallRng;
#[cfg(not(target_arch = "wasm32"))]
pub type NonDeterministicRng = rand::rngs::ThreadRng;
#[cfg(target_arch = "wasm32")]
pub type NonDeterministicRng = MutexGuard<'static, DeterministicRng>;
pub fn make_deterministic_rng() -> DeterministicRng {
SmallRng::seed_from_u64(RNG_SEED)
}
pub fn make_nondeterministic_rng() -> NonDeterministicRng {
#[cfg(target_arch = "wasm32")]
{
static RNG: OnceLock<Mutex<SmallRng>> = OnceLock::new();
RNG.get_or_init(|| Mutex::new(make_deterministic_rng()))
.lock()
.expect("failed to lock RNG mutex")
}
#[cfg(not(target_arch = "wasm32"))]
{
rand::thread_rng()
}
}
pub fn generate_random_alphanumeric_string(length: usize, charset: &[u8]) -> String {
(0..length)
.map(|_| {
let random_index = make_nondeterministic_rng().gen_range(0..charset.len());
charset[random_index] as char
})
.collect()
}
pub fn generate_test_namespace() -> String {
let charset: &[u8] = b"0123456789abcdefghijklmnopqrstuvwxyz";
let entry = generate_random_alphanumeric_string(20, charset);
let namespace = format!("table_{}", entry);
tracing::warn!("Generating namespace={}", namespace);
namespace
}