1use ic_cdk::api::management_canister::main::raw_rand;
2use std::time::Duration;
3
4pub async fn generate_rand_nonce() -> Result<u64, String> {
12 generate_rand_byte_array().await.map(u64::from_be_bytes)
13}
14
15pub async fn generate_rand_byte_array() -> Result<[u8; 8], String> {
21 match raw_rand().await {
22 Ok((random_bytes,)) => {
23 let bytes_array: Result<[u8; 8], _> = random_bytes[0..8].try_into();
24
25 match bytes_array {
26 Ok(bytes) => Ok(bytes),
27 Err(err) => Err(format!("Initialising slicing byte array: {}", err)),
28 }
29 }
30 Err(err) => Err(format!("Random bytes generation error: {:?}", err)),
31 }
32}
33
34pub async fn generate_random_delay(max_interval: Duration) -> Result<Duration, String> {
44 let random_nonce = generate_rand_nonce().await?;
45
46 let random_delay_nanos = random_nonce % (max_interval.as_nanos() as u64);
47
48 Ok(Duration::from_nanos(random_delay_nanos))
49}