removing dev branch, many changes
This commit is contained in:
		@@ -10,8 +10,8 @@ crate-type = ["cdylib", "rlib"]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[features]
 | 
			
		||||
default = [ "veilid-core/rt-tokio", "veilid-core/default" ]
 | 
			
		||||
crypto-test = [ "veilid-core/rt-tokio", "veilid-core/crypto-test"]
 | 
			
		||||
default = [ "veilid-core/rt-wasm-bindgen", "veilid-core/default" ]
 | 
			
		||||
crypto-test = [ "veilid-core/rt-wasm-bindgen", "veilid-core/crypto-test"]
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
veilid-core = { path = "../veilid-core", default-features = false  }
 | 
			
		||||
 
 | 
			
		||||
@@ -59,6 +59,12 @@ fn take_veilid_api() -> Result<veilid_core::VeilidAPI, veilid_core::VeilidAPIErr
 | 
			
		||||
pub fn to_json<T: Serialize + Debug>(val: T) -> JsValue {
 | 
			
		||||
    JsValue::from_str(&serialize_json(val))
 | 
			
		||||
}
 | 
			
		||||
pub fn to_opt_json<T: Serialize + Debug>(val: Option<T>) -> JsValue {
 | 
			
		||||
    match val {
 | 
			
		||||
        Some(v) => JsValue::from_str(&serialize_json(v)),
 | 
			
		||||
        None => JsValue::UNDEFINED,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn to_jsvalue<T>(val: T) -> JsValue
 | 
			
		||||
where
 | 
			
		||||
@@ -94,7 +100,7 @@ fn parse_target(s: String) -> APIResult<veilid_core::Target> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Is this a node id?
 | 
			
		||||
    if let Ok(nid) = veilid_core::PublicKey::from_str(&s) {
 | 
			
		||||
    if let Ok(nid) = veilid_core::TypedKey::from_str(&s) {
 | 
			
		||||
        return Ok(veilid_core::Target::NodeId(nid));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -113,6 +119,14 @@ where
 | 
			
		||||
    future_to_promise(future.map(|res| res.map(|v| to_json(v)).map_err(|e| to_json(e))))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn wrap_api_future_opt_json<F, T>(future: F) -> Promise
 | 
			
		||||
where
 | 
			
		||||
    F: Future<Output = APIResult<Option<T>>> + 'static,
 | 
			
		||||
    T: Serialize + Debug + 'static,
 | 
			
		||||
{
 | 
			
		||||
    future_to_promise(future.map(|res| res.map(|v| to_opt_json(v)).map_err(|e| to_json(e))))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn wrap_api_future_plain<F, T>(future: F) -> Promise
 | 
			
		||||
where
 | 
			
		||||
    F: Future<Output = APIResult<T>> + 'static,
 | 
			
		||||
@@ -375,9 +389,6 @@ pub fn routing_context_app_call(id: u32, target: String, request: String) -> Pro
 | 
			
		||||
        .decode(request.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    wrap_api_future_plain(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let routing_table = veilid_api.routing_table()?;
 | 
			
		||||
 | 
			
		||||
        let routing_context = {
 | 
			
		||||
            let rc = (*ROUTING_CONTEXTS).borrow();
 | 
			
		||||
            let Some(routing_context) = rc.get(&id) else {
 | 
			
		||||
@@ -399,9 +410,6 @@ pub fn routing_context_app_message(id: u32, target: String, message: String) ->
 | 
			
		||||
        .decode(message.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    wrap_api_future_void(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let routing_table = veilid_api.routing_table()?;
 | 
			
		||||
 | 
			
		||||
        let routing_context = {
 | 
			
		||||
            let rc = (*ROUTING_CONTEXTS).borrow();
 | 
			
		||||
            let Some(routing_context) = rc.get(&id) else {
 | 
			
		||||
@@ -416,6 +424,167 @@ pub fn routing_context_app_message(id: u32, target: String, message: String) ->
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn routing_context_create_dht_record(id: u32, kind: u32, schema: String) -> Promise {
 | 
			
		||||
    let crypto_kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
    let schema: veilid_core::DHTSchema = veilid_core::deserialize_json(&schema).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let routing_context = {
 | 
			
		||||
            let rc = (*ROUTING_CONTEXTS).borrow();
 | 
			
		||||
            let Some(routing_context) = rc.get(&id) else {
 | 
			
		||||
                return APIResult::Err(veilid_core::VeilidAPIError::invalid_argument("routing_context_create_dht_record", "id", id));
 | 
			
		||||
            };
 | 
			
		||||
            routing_context.clone()
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let dht_record_descriptor = routing_context
 | 
			
		||||
            .create_dht_record(crypto_kind, schema)
 | 
			
		||||
            .await?;
 | 
			
		||||
        APIResult::Ok(dht_record_descriptor)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn routing_context_open_dht_record(id: u32, key: String, writer: Option<String>) -> Promise {
 | 
			
		||||
    let key: veilid_core::TypedKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    let writer: Option<veilid_core::KeyPair> =
 | 
			
		||||
        writer.map(|s| veilid_core::deserialize_json(&s).unwrap());
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let routing_context = {
 | 
			
		||||
            let rc = (*ROUTING_CONTEXTS).borrow();
 | 
			
		||||
            let Some(routing_context) = rc.get(&id) else {
 | 
			
		||||
                return APIResult::Err(veilid_core::VeilidAPIError::invalid_argument("routing_context_open_dht_record", "id", id));
 | 
			
		||||
            };
 | 
			
		||||
            routing_context.clone()
 | 
			
		||||
        };
 | 
			
		||||
        let dht_record_descriptor = routing_context.open_dht_record(key, writer).await?;
 | 
			
		||||
        APIResult::Ok(dht_record_descriptor)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn routing_context_close_dht_record(id: u32, key: String) -> Promise {
 | 
			
		||||
    let key: veilid_core::TypedKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    wrap_api_future_void(async move {
 | 
			
		||||
        let routing_context = {
 | 
			
		||||
            let rc = (*ROUTING_CONTEXTS).borrow();
 | 
			
		||||
            let Some(routing_context) = rc.get(&id) else {
 | 
			
		||||
                return APIResult::Err(veilid_core::VeilidAPIError::invalid_argument("routing_context_close_dht_record", "id", id));
 | 
			
		||||
            };
 | 
			
		||||
            routing_context.clone()
 | 
			
		||||
        };
 | 
			
		||||
        routing_context.close_dht_record(key).await?;
 | 
			
		||||
        APIRESULT_UNDEFINED
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn routing_context_delete_dht_record(id: u32, key: String) -> Promise {
 | 
			
		||||
    let key: veilid_core::TypedKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    wrap_api_future_void(async move {
 | 
			
		||||
        let routing_context = {
 | 
			
		||||
            let rc = (*ROUTING_CONTEXTS).borrow();
 | 
			
		||||
            let Some(routing_context) = rc.get(&id) else {
 | 
			
		||||
                return APIResult::Err(veilid_core::VeilidAPIError::invalid_argument("routing_context_delete_dht_record", "id", id));
 | 
			
		||||
            };
 | 
			
		||||
            routing_context.clone()
 | 
			
		||||
        };
 | 
			
		||||
        routing_context.delete_dht_record(key).await?;
 | 
			
		||||
        APIRESULT_UNDEFINED
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn routing_context_get_dht_value(
 | 
			
		||||
    id: u32,
 | 
			
		||||
    key: String,
 | 
			
		||||
    subkey: u32,
 | 
			
		||||
    force_refresh: bool,
 | 
			
		||||
) -> Promise {
 | 
			
		||||
    let key: veilid_core::TypedKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    wrap_api_future_opt_json(async move {
 | 
			
		||||
        let routing_context = {
 | 
			
		||||
            let rc = (*ROUTING_CONTEXTS).borrow();
 | 
			
		||||
            let Some(routing_context) = rc.get(&id) else {
 | 
			
		||||
                return APIResult::Err(veilid_core::VeilidAPIError::invalid_argument("routing_context_get_dht_value", "id", id));
 | 
			
		||||
            };
 | 
			
		||||
            routing_context.clone()
 | 
			
		||||
        };
 | 
			
		||||
        let res = routing_context
 | 
			
		||||
            .get_dht_value(key, subkey, force_refresh)
 | 
			
		||||
            .await?;
 | 
			
		||||
        APIResult::Ok(res)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn routing_context_set_dht_value(id: u32, key: String, subkey: u32, data: String) -> Promise {
 | 
			
		||||
    let key: veilid_core::TypedKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    let data: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(&data.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_opt_json(async move {
 | 
			
		||||
        let routing_context = {
 | 
			
		||||
            let rc = (*ROUTING_CONTEXTS).borrow();
 | 
			
		||||
            let Some(routing_context) = rc.get(&id) else {
 | 
			
		||||
                return APIResult::Err(veilid_core::VeilidAPIError::invalid_argument("routing_context_set_dht_value", "id", id));
 | 
			
		||||
            };
 | 
			
		||||
            routing_context.clone()
 | 
			
		||||
        };
 | 
			
		||||
        let res = routing_context.set_dht_value(key, subkey, data).await?;
 | 
			
		||||
        APIResult::Ok(res)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn routing_context_watch_dht_values(
 | 
			
		||||
    id: u32,
 | 
			
		||||
    key: String,
 | 
			
		||||
    subkeys: String,
 | 
			
		||||
    expiration: String,
 | 
			
		||||
    count: u32,
 | 
			
		||||
) -> Promise {
 | 
			
		||||
    let key: veilid_core::TypedKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    let subkeys: veilid_core::ValueSubkeyRangeSet =
 | 
			
		||||
        veilid_core::deserialize_json(&subkeys).unwrap();
 | 
			
		||||
    let expiration = veilid_core::Timestamp::from_str(&expiration).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_plain(async move {
 | 
			
		||||
        let routing_context = {
 | 
			
		||||
            let rc = (*ROUTING_CONTEXTS).borrow();
 | 
			
		||||
            let Some(routing_context) = rc.get(&id) else {
 | 
			
		||||
                return APIResult::Err(veilid_core::VeilidAPIError::invalid_argument("routing_context_watch_dht_values", "id", id));
 | 
			
		||||
            };
 | 
			
		||||
            routing_context.clone()
 | 
			
		||||
        };
 | 
			
		||||
        let res = routing_context
 | 
			
		||||
            .watch_dht_values(key, subkeys, expiration, count)
 | 
			
		||||
            .await?;
 | 
			
		||||
        APIResult::Ok(res.to_string())
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn routing_context_cancel_dht_watch(id: u32, key: String, subkeys: String) -> Promise {
 | 
			
		||||
    let key: veilid_core::TypedKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    let subkeys: veilid_core::ValueSubkeyRangeSet =
 | 
			
		||||
        veilid_core::deserialize_json(&subkeys).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_plain(async move {
 | 
			
		||||
        let routing_context = {
 | 
			
		||||
            let rc = (*ROUTING_CONTEXTS).borrow();
 | 
			
		||||
            let Some(routing_context) = rc.get(&id) else {
 | 
			
		||||
                return APIResult::Err(veilid_core::VeilidAPIError::invalid_argument("routing_context_cancel_dht_watch", "id", id));
 | 
			
		||||
            };
 | 
			
		||||
            routing_context.clone()
 | 
			
		||||
        };
 | 
			
		||||
        let res = routing_context.cancel_dht_watch(key, subkeys).await?;
 | 
			
		||||
        APIResult::Ok(res)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn new_private_route() -> Promise {
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
@@ -548,20 +717,23 @@ pub fn table_db_get_column_count(id: u32) -> u32 {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn table_db_get_keys(id: u32, col: u32) -> Option<String> {
 | 
			
		||||
    let table_dbs = (*TABLE_DBS).borrow();
 | 
			
		||||
    let Some(table_db) = table_dbs.get(&id) else {
 | 
			
		||||
        return None;
 | 
			
		||||
    };
 | 
			
		||||
    let Ok(keys) = table_db.clone().get_keys(col) else {
 | 
			
		||||
        return None;
 | 
			
		||||
    };
 | 
			
		||||
    let keys: Vec<String> = keys
 | 
			
		||||
        .into_iter()
 | 
			
		||||
        .map(|k| data_encoding::BASE64URL_NOPAD.encode(&k))
 | 
			
		||||
        .collect();
 | 
			
		||||
    let out = veilid_core::serialize_json(keys);
 | 
			
		||||
    Some(out)
 | 
			
		||||
pub fn table_db_get_keys(id: u32, col: u32) -> Promise {
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let table_db = {
 | 
			
		||||
            let table_dbs = (*TABLE_DBS).borrow();
 | 
			
		||||
            let Some(table_db) = table_dbs.get(&id) else {
 | 
			
		||||
                return APIResult::Err(veilid_core::VeilidAPIError::invalid_argument("table_db_store", "id", id));
 | 
			
		||||
            };
 | 
			
		||||
            table_db.clone()
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let keys = table_db.clone().get_keys(col).await?;
 | 
			
		||||
        let out: Vec<String> = keys
 | 
			
		||||
            .into_iter()
 | 
			
		||||
            .map(|k| data_encoding::BASE64URL_NOPAD.encode(&k))
 | 
			
		||||
            .collect();
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn add_table_db_transaction(tdbt: veilid_core::TableDBTransaction) -> u32 {
 | 
			
		||||
@@ -605,9 +777,7 @@ pub fn table_db_transaction_commit(id: u32) -> Promise {
 | 
			
		||||
            tdbt.clone()
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        tdbt.commit()
 | 
			
		||||
            .await
 | 
			
		||||
            .map_err(veilid_core::VeilidAPIError::generic)?;
 | 
			
		||||
        tdbt.commit().await?;
 | 
			
		||||
        APIRESULT_UNDEFINED
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
@@ -686,10 +856,7 @@ pub fn table_db_store(id: u32, col: u32, key: String, value: String) -> Promise
 | 
			
		||||
            table_db.clone()
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        table_db
 | 
			
		||||
            .store(col, &key, &value)
 | 
			
		||||
            .await
 | 
			
		||||
            .map_err(veilid_core::VeilidAPIError::generic)?;
 | 
			
		||||
        table_db.store(col, &key, &value).await?;
 | 
			
		||||
        APIRESULT_UNDEFINED
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
@@ -708,9 +875,7 @@ pub fn table_db_load(id: u32, col: u32, key: String) -> Promise {
 | 
			
		||||
            table_db.clone()
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let out = table_db
 | 
			
		||||
            .load(col, &key)
 | 
			
		||||
            .map_err(veilid_core::VeilidAPIError::generic)?;
 | 
			
		||||
        let out = table_db.load(col, &key).await?;
 | 
			
		||||
        let out = out.map(|x| data_encoding::BASE64URL_NOPAD.encode(&x));
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
@@ -730,14 +895,575 @@ pub fn table_db_delete(id: u32, col: u32, key: String) -> Promise {
 | 
			
		||||
            table_db.clone()
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let out = table_db
 | 
			
		||||
            .delete(col, &key)
 | 
			
		||||
            .await
 | 
			
		||||
            .map_err(veilid_core::VeilidAPIError::generic)?;
 | 
			
		||||
        let out = table_db.delete(col, &key).await?;
 | 
			
		||||
        let out = out.map(|x| data_encoding::BASE64URL_NOPAD.encode(&x));
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn valid_crypto_kinds() -> String {
 | 
			
		||||
    veilid_core::serialize_json(
 | 
			
		||||
        veilid_core::VALID_CRYPTO_KINDS
 | 
			
		||||
            .iter()
 | 
			
		||||
            .map(|k| (*k).into())
 | 
			
		||||
            .collect::<Vec<u32>>(),
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn best_crypto_kind() -> u32 {
 | 
			
		||||
    veilid_core::best_crypto_kind().into()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn verify_signatures(node_ids: String, data: String, signatures: String) -> Promise {
 | 
			
		||||
    let node_ids: Vec<veilid_core::TypedKey> = veilid_core::deserialize_json(&node_ids).unwrap();
 | 
			
		||||
 | 
			
		||||
    let data: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(data.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let typed_signatures: Vec<veilid_core::TypedSignature> =
 | 
			
		||||
        veilid_core::deserialize_json(&signatures).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let out = crypto.verify_signatures(&node_ids, &data, &typed_signatures)?;
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn generate_signatures(data: String, key_pairs: String) -> Promise {
 | 
			
		||||
    let data: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(data.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let key_pairs: Vec<veilid_core::TypedKeyPair> =
 | 
			
		||||
        veilid_core::deserialize_json(&key_pairs).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let out = crypto.generate_signatures(&data, &key_pairs, |k, s| {
 | 
			
		||||
            veilid_core::TypedSignature::new(k.kind, s)
 | 
			
		||||
        })?;
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn generate_key_pair(kind: u32) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let out = veilid_core::Crypto::generate_keypair(kind)?;
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_cached_dh(kind: u32, key: String, secret: String) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    let key: veilid_core::PublicKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    let secret: veilid_core::SecretKey = veilid_core::deserialize_json(&secret).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_cached_dh",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.cached_dh(&key, &secret)?;
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_compute_dh(kind: u32, key: String, secret: String) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    let key: veilid_core::PublicKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    let secret: veilid_core::SecretKey = veilid_core::deserialize_json(&secret).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_compute_dh",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.compute_dh(&key, &secret)?;
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_random_bytes(kind: u32, len: u32) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_plain(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_random_bytes",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.random_bytes(len);
 | 
			
		||||
        let out = data_encoding::BASE64URL_NOPAD.encode(&out);
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_default_salt_length(kind: u32) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_plain(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_default_salt_length",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.default_salt_length();
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_hash_password(kind: u32, password: String, salt: String) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
    let password: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(password.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    let salt: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(salt.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_plain(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_hash_password",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.hash_password(&password, &salt)?;
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_verify_password(kind: u32, password: String, password_hash: String) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
    let password: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(password.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_plain(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_verify_password",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.verify_password(&password, &password_hash)?;
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_derive_shared_secret(kind: u32, password: String, salt: String) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
    let password: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(password.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    let salt: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(salt.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_derive_shared_secret",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.derive_shared_secret(&password, &salt)?;
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_random_nonce(kind: u32) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_random_nonce",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.random_nonce();
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_random_shared_secret(kind: u32) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_random_shared_secret",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.random_shared_secret();
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_generate_key_pair(kind: u32) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_generate_key_pair",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.generate_keypair();
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_generate_hash(kind: u32, data: String) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    let data: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(data.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_generate_hash",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.generate_hash(&data);
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_validate_key_pair(kind: u32, key: String, secret: String) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    let key: veilid_core::PublicKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    let secret: veilid_core::SecretKey = veilid_core::deserialize_json(&secret).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_plain(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_validate_key_pair",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.validate_keypair(&key, &secret);
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_validate_hash(kind: u32, data: String, hash: String) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    let data: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(data.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let hash: veilid_core::HashDigest = veilid_core::deserialize_json(&hash).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_plain(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_validate_hash",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.validate_hash(&data, &hash);
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_distance(kind: u32, key1: String, key2: String) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    let key1: veilid_core::CryptoKey = veilid_core::deserialize_json(&key1).unwrap();
 | 
			
		||||
    let key2: veilid_core::CryptoKey = veilid_core::deserialize_json(&key2).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_distance",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.distance(&key1, &key2);
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_sign(kind: u32, key: String, secret: String, data: String) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    let key: veilid_core::CryptoKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    let secret: veilid_core::CryptoKey = veilid_core::deserialize_json(&secret).unwrap();
 | 
			
		||||
 | 
			
		||||
    let data: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(data.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument("crypto_sign", "kind", kind.to_string())
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.sign(&key, &secret, &data)?;
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_verify(kind: u32, key: String, data: String, signature: String) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    let key: veilid_core::CryptoKey = veilid_core::deserialize_json(&key).unwrap();
 | 
			
		||||
    let data: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(data.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    let signature: veilid_core::Signature = veilid_core::deserialize_json(&signature).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_void(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument("crypto_verify", "kind", kind.to_string())
 | 
			
		||||
        })?;
 | 
			
		||||
        csv.verify(&key, &data, &signature)?;
 | 
			
		||||
        APIRESULT_UNDEFINED
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_aead_overhead(kind: u32) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_plain(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_aead_overhead",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.aead_overhead();
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_decrypt_aead(
 | 
			
		||||
    kind: u32,
 | 
			
		||||
    body: String,
 | 
			
		||||
    nonce: String,
 | 
			
		||||
    shared_secret: String,
 | 
			
		||||
    associated_data: Option<String>,
 | 
			
		||||
) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    let body: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(body.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let nonce: veilid_core::Nonce = veilid_core::deserialize_json(&nonce).unwrap();
 | 
			
		||||
 | 
			
		||||
    let shared_secret: veilid_core::SharedSecret =
 | 
			
		||||
        veilid_core::deserialize_json(&shared_secret).unwrap();
 | 
			
		||||
 | 
			
		||||
    let associated_data: Option<Vec<u8>> = associated_data.map(|ad| {
 | 
			
		||||
        data_encoding::BASE64URL_NOPAD
 | 
			
		||||
            .decode(ad.as_bytes())
 | 
			
		||||
            .unwrap()
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_decrypt_aead",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.decrypt_aead(
 | 
			
		||||
            &body,
 | 
			
		||||
            &nonce,
 | 
			
		||||
            &shared_secret,
 | 
			
		||||
            match &associated_data {
 | 
			
		||||
                Some(ad) => Some(ad.as_slice()),
 | 
			
		||||
                None => None,
 | 
			
		||||
            },
 | 
			
		||||
        )?;
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_encrypt_aead(
 | 
			
		||||
    kind: u32,
 | 
			
		||||
    body: String,
 | 
			
		||||
    nonce: String,
 | 
			
		||||
    shared_secret: String,
 | 
			
		||||
    associated_data: Option<String>,
 | 
			
		||||
) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    let body: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(body.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let nonce: veilid_core::Nonce = veilid_core::deserialize_json(&nonce).unwrap();
 | 
			
		||||
 | 
			
		||||
    let shared_secret: veilid_core::SharedSecret =
 | 
			
		||||
        veilid_core::deserialize_json(&shared_secret).unwrap();
 | 
			
		||||
 | 
			
		||||
    let associated_data: Option<Vec<u8>> = associated_data.map(|ad| {
 | 
			
		||||
        data_encoding::BASE64URL_NOPAD
 | 
			
		||||
            .decode(ad.as_bytes())
 | 
			
		||||
            .unwrap()
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_encrypt_aead",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        let out = csv.encrypt_aead(
 | 
			
		||||
            &body,
 | 
			
		||||
            &nonce,
 | 
			
		||||
            &shared_secret,
 | 
			
		||||
            match &associated_data {
 | 
			
		||||
                Some(ad) => Some(ad.as_slice()),
 | 
			
		||||
                None => None,
 | 
			
		||||
            },
 | 
			
		||||
        )?;
 | 
			
		||||
        APIResult::Ok(out)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn crypto_crypt_no_auth(
 | 
			
		||||
    kind: u32,
 | 
			
		||||
    body: String,
 | 
			
		||||
    nonce: String,
 | 
			
		||||
    shared_secret: String,
 | 
			
		||||
) -> Promise {
 | 
			
		||||
    let kind: veilid_core::CryptoKind = veilid_core::FourCC::from(kind);
 | 
			
		||||
 | 
			
		||||
    let mut body: Vec<u8> = data_encoding::BASE64URL_NOPAD
 | 
			
		||||
        .decode(body.as_bytes())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let nonce: veilid_core::Nonce = veilid_core::deserialize_json(&nonce).unwrap();
 | 
			
		||||
 | 
			
		||||
    let shared_secret: veilid_core::SharedSecret =
 | 
			
		||||
        veilid_core::deserialize_json(&shared_secret).unwrap();
 | 
			
		||||
 | 
			
		||||
    wrap_api_future_json(async move {
 | 
			
		||||
        let veilid_api = get_veilid_api()?;
 | 
			
		||||
        let crypto = veilid_api.crypto()?;
 | 
			
		||||
        let csv = crypto.get(kind).ok_or_else(|| {
 | 
			
		||||
            veilid_core::VeilidAPIError::invalid_argument(
 | 
			
		||||
                "crypto_crypt_no_auth",
 | 
			
		||||
                "kind",
 | 
			
		||||
                kind.to_string(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
        csv.crypt_in_place_no_auth(&mut body, &nonce, &shared_secret);
 | 
			
		||||
        APIResult::Ok(body)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn now() -> u64 {
 | 
			
		||||
    veilid_core::get_aligned_timestamp().as_u64()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen()]
 | 
			
		||||
pub fn debug(command: String) -> Promise {
 | 
			
		||||
    wrap_api_future_plain(async move {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,8 @@
 | 
			
		||||
//! Test suite for the Web and headless browsers.
 | 
			
		||||
 | 
			
		||||
//XXXXXXXXXXXXXXX
 | 
			
		||||
//XXX DOES NOT WORK.
 | 
			
		||||
 | 
			
		||||
#![cfg(target_arch = "wasm32")]
 | 
			
		||||
 | 
			
		||||
extern crate alloc;
 | 
			
		||||
@@ -52,16 +56,16 @@ fn init_callbacks() {
 | 
			
		||||
            case "network.rpc.timeout": return 10000000;
 | 
			
		||||
            case "network.rpc.max_route_hop_count": return 4;
 | 
			
		||||
            case "network.rpc.default_route_hop_count": return 1;
 | 
			
		||||
            case "network.dht.resolve_node_timeout": return null;
 | 
			
		||||
            case "network.dht.resolve_node_count": return 20;
 | 
			
		||||
            case "network.dht.resolve_node_fanout": return 3;
 | 
			
		||||
            case "network.dht.max_find_node_count": return 20;
 | 
			
		||||
            case "network.dht.get_value_timeout": return null;
 | 
			
		||||
            case "network.dht.get_value_count": return 20;
 | 
			
		||||
            case "network.dht.get_value_fanout": return 3;
 | 
			
		||||
            case "network.dht.set_value_timeout": return null;
 | 
			
		||||
            case "network.dht.set_value_count": return 20;
 | 
			
		||||
            case "network.dht.set_value_fanout": return 5;
 | 
			
		||||
            case "network.dht.resolve_node_timeout": return 10000;
 | 
			
		||||
            case "network.dht.resolve_node_count": return 1;
 | 
			
		||||
            case "network.dht.resolve_node_fanout": return 4;
 | 
			
		||||
            case "network.dht.get_value_timeout": return 10000;
 | 
			
		||||
            case "network.dht.get_value_count": return 3;
 | 
			
		||||
            case "network.dht.get_value_fanout": return 4;
 | 
			
		||||
            case "network.dht.set_value_timeout": return 10000;
 | 
			
		||||
            case "network.dht.set_value_count": return 5;
 | 
			
		||||
            case "network.dht.set_value_fanout": return 4;
 | 
			
		||||
            case "network.dht.min_peer_count": return 20;
 | 
			
		||||
            case "network.dht.min_peer_refresh_time": return 2000000;
 | 
			
		||||
            case "network.dht.validate_dial_info_receipt_time": return 5000000;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user