use crate::hooks::random::invoke_on_init_random_seed;
use crate::memory::state::services::with_runtime_rng_mut;
use getrandom::Error;
use ic_cdk_timers::set_timer;
use junobuild_shared::random::get_random_seed;
use rand::RngCore;
use std::time::Duration;
pub fn defer_init_random_seed() {
set_timer(Duration::ZERO, async { init_random_seed().await });
}
pub async fn init_random_seed() {
let seed = get_random_seed().await;
with_runtime_rng_mut(|rng| *rng = seed);
invoke_on_init_random_seed();
}
#[no_mangle]
unsafe extern "Rust" fn __getrandom_v03_custom(dest: *mut u8, len: usize) -> Result<(), Error> {
with_runtime_rng_mut(|rng| {
match rng {
None => Err(Error::UNEXPECTED),
Some(rng) => {
let buf: &mut [u8] = unsafe {
core::ptr::write_bytes(dest, 0, len);
core::slice::from_raw_parts_mut(dest, len)
};
rng.fill_bytes(buf);
Ok(())
}
}
})
}