green_copper_runtime/modules/crypto/
mod.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use quickjs_runtime::builder::QuickJsRuntimeBuilder;
use quickjs_runtime::jsutils::jsproxies::JsProxy;
use quickjs_runtime::jsutils::JsError;
use quickjs_runtime::quickjsrealmadapter::QuickJsRealmAdapter;

pub(crate) fn init(builder: QuickJsRuntimeBuilder) -> QuickJsRuntimeBuilder {
    builder.realm_adapter_init_hook(|_rt, realm| {
        // init crypto proxy
        init_crypto_proxy(realm)
    })
}

// todo simple hashes
// https://www.geeksforgeeks.org/node-js-crypto-createhash-method/?ref=lbp

fn init_crypto_proxy(realm: &QuickJsRealmAdapter) -> Result<(), JsError> {
    let crypto_proxy = JsProxy::new().name("crypto").static_method(
        "randomUUID",
        |_rt, realm: &QuickJsRealmAdapter, _args| {
            let uuid = uuid::Uuid::new_v4().to_string();
            realm.create_string(uuid.as_str())
        },
    );
    realm.install_proxy(crypto_proxy, true)?;
    Ok(())
}

#[cfg(test)]
pub mod tests {
    use crate::init_greco_rt;
    use futures::executor::block_on;
    use quickjs_runtime::builder::QuickJsRuntimeBuilder;
    use quickjs_runtime::jsutils::Script;

    #[test]
    fn test_uuid() {
        let rt = init_greco_rt(QuickJsRuntimeBuilder::new()).build();
        let script = Script::new("uuid.js", "crypto.randomUUID();");
        #[allow(clippy::ok_expect)]
        let res = block_on(rt.eval(None, script)).ok().expect("script failed");
        assert!(res.is_string());
        //println!("uuid={}", res.get_str());
        assert_eq!(res.get_str().len(), 36);
    }
}