summaryrefslogtreecommitdiff
path: root/extensions/crypto/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/crypto/lib.rs')
-rw-r--r--extensions/crypto/lib.rs30
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")
}