diff options
Diffstat (limited to 'extensions')
-rw-r--r-- | extensions/crypto/01_crypto.js | 6 | ||||
-rw-r--r-- | extensions/crypto/Cargo.toml | 1 | ||||
-rw-r--r-- | extensions/crypto/lib.deno_crypto.d.ts | 1 | ||||
-rw-r--r-- | extensions/crypto/lib.rs | 30 |
4 files changed, 34 insertions, 4 deletions
diff --git a/extensions/crypto/01_crypto.js b/extensions/crypto/01_crypto.js index dba6b0091..627035c28 100644 --- a/extensions/crypto/01_crypto.js +++ b/extensions/crypto/01_crypto.js @@ -41,10 +41,16 @@ return arrayBufferView; } + function randomUUID() { + return core.opSync("op_crypto_random_uuid"); + } + window.crypto = { getRandomValues, + randomUUID, }; window.__bootstrap.crypto = { getRandomValues, + randomUUID, }; })(this); diff --git a/extensions/crypto/Cargo.toml b/extensions/crypto/Cargo.toml index fa0a6634e..8b919b611 100644 --- a/extensions/crypto/Cargo.toml +++ b/extensions/crypto/Cargo.toml @@ -16,3 +16,4 @@ path = "lib.rs" [dependencies] deno_core = { version = "0.88.1", path = "../../core" } rand = "0.8.3" +uuid = { version = "0.8.2", features = ["v4"] } diff --git a/extensions/crypto/lib.deno_crypto.d.ts b/extensions/crypto/lib.deno_crypto.d.ts index a00757e71..854696676 100644 --- a/extensions/crypto/lib.deno_crypto.d.ts +++ b/extensions/crypto/lib.deno_crypto.d.ts @@ -23,4 +23,5 @@ declare interface Crypto { >( array: T, ): T; + randomUUID(): string; } 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") } |