diff options
Diffstat (limited to 'extensions/crypto/lib.rs')
-rw-r--r-- | extensions/crypto/lib.rs | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/extensions/crypto/lib.rs b/extensions/crypto/lib.rs index 45473f4d5..bf4174f75 100644 --- a/extensions/crypto/lib.rs +++ b/extensions/crypto/lib.rs @@ -21,10 +21,13 @@ pub fn init(maybe_seed: Option<u64>) -> Extension { prefix "deno:extensions/crypto", "01_crypto.js", )) - .ops(vec![( - "op_crypto_get_random_values", - op_sync(op_crypto_get_random_values), - )]) + .ops(vec![ + ( + "op_crypto_get_random_values", + op_sync(op_crypto_get_random_values), + ), + ("op_crypto_random_uuid", op_sync(op_crypto_random_uuid)), + ]) .state(move |state| { if let Some(seed) = maybe_seed { state.put(StdRng::seed_from_u64(seed)); @@ -51,6 +54,25 @@ pub fn op_crypto_get_random_values( Ok(()) } +pub fn op_crypto_random_uuid( + state: &mut OpState, + _args: (), + _zero_copy: (), +) -> Result<String, AnyError> { + let maybe_seeded_rng = state.try_borrow_mut::<StdRng>(); + let uuid = if let Some(seeded_rng) = maybe_seeded_rng { + let mut bytes = [0u8; 16]; + seeded_rng.fill(&mut bytes); + uuid::Builder::from_bytes(bytes) + .set_version(uuid::Version::Random) + .build() + } else { + uuid::Uuid::new_v4() + }; + + Ok(uuid.to_string()) +} + pub fn get_declaration() -> PathBuf { PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("lib.deno_crypto.d.ts") } |