diff options
author | Leo K <crowlkats@toaxl.com> | 2021-06-05 14:46:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-05 14:46:24 +0200 |
commit | cf351f77c2c05255c211196957b551db871f2699 (patch) | |
tree | d3d44a1058eb8d1f609d111c236a201e76694759 /extensions/crypto/lib.rs | |
parent | e8be116ab6d06bed764ad9b6cb253d8de36ae73d (diff) |
feat(extensions/crypto): implement randomUUID (#10848)
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") } |