use wasm_bindgen::prelude::*;
#[cfg(feature = "console_error_panic_hook")]
pub fn set_panic_hook() {
console_error_panic_hook::set_once();
}
#[wasm_bindgen(js_name = "ashInit")]
pub fn ash_init() {
#[cfg(feature = "console_error_panic_hook")]
set_panic_hook();
}
#[wasm_bindgen(js_name = "ashCanonicalizeJson")]
pub fn ash_canonicalize_json(input: &str) -> Result<String, JsValue> {
ash_core::canonicalize_json(input).map_err(|e| JsValue::from_str(&e.to_string()))
}
#[wasm_bindgen(js_name = "ashCanonicalizeUrlencoded")]
pub fn ash_canonicalize_urlencoded(input: &str) -> Result<String, JsValue> {
ash_core::canonicalize_urlencoded(input).map_err(|e| JsValue::from_str(&e.to_string()))
}
#[wasm_bindgen(js_name = "ashBuildProof")]
pub fn ash_build_proof(
mode: &str,
binding: &str,
context_id: &str,
nonce: Option<String>,
canonical_payload: &str,
) -> Result<String, JsValue> {
let ash_mode: ash_core::AshMode = mode
.parse()
.map_err(|e: ash_core::AshError| JsValue::from_str(&e.to_string()))?;
ash_core::build_proof(
ash_mode,
binding,
context_id,
nonce.as_deref(),
canonical_payload,
)
.map_err(|e| JsValue::from_str(&e.to_string()))
}
#[wasm_bindgen(js_name = "ashVerifyProof")]
pub fn ash_verify_proof(expected: &str, actual: &str) -> bool {
ash_core::timing_safe_equal(expected.as_bytes(), actual.as_bytes())
}
#[wasm_bindgen(js_name = "ashNormalizeBinding")]
pub fn ash_normalize_binding(method: &str, path: &str) -> Result<String, JsValue> {
ash_core::normalize_binding(method, path).map_err(|e| JsValue::from_str(&e.to_string()))
}
#[wasm_bindgen(js_name = "ashTimingSafeEqual")]
pub fn ash_timing_safe_equal(a: &str, b: &str) -> bool {
ash_core::timing_safe_equal(a.as_bytes(), b.as_bytes())
}
#[wasm_bindgen(js_name = "ashVersion")]
pub fn ash_version() -> String {
"ASHv1".to_string()
}
#[wasm_bindgen(js_name = "ashLibraryVersion")]
pub fn ash_library_version() -> String {
env!("CARGO_PKG_VERSION").to_string()
}
#[wasm_bindgen(js_name = "canonicalizeJson")]
pub fn canonicalize_json(input: &str) -> Result<String, JsValue> {
ash_canonicalize_json(input)
}
#[wasm_bindgen(js_name = "canonicalizeUrlencoded")]
pub fn canonicalize_urlencoded(input: &str) -> Result<String, JsValue> {
ash_canonicalize_urlencoded(input)
}
#[wasm_bindgen(js_name = "buildProof")]
pub fn build_proof(
mode: &str,
binding: &str,
context_id: &str,
nonce: Option<String>,
canonical_payload: &str,
) -> Result<String, JsValue> {
ash_build_proof(mode, binding, context_id, nonce, canonical_payload)
}
#[wasm_bindgen(js_name = "verifyProof")]
pub fn verify_proof(expected: &str, actual: &str) -> bool {
ash_verify_proof(expected, actual)
}
#[wasm_bindgen(js_name = "normalizeBinding")]
pub fn normalize_binding(method: &str, path: &str) -> Result<String, JsValue> {
ash_normalize_binding(method, path)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_canonicalize_json() {
let result = ash_canonicalize_json(r#"{"z":1,"a":2}"#).unwrap();
assert_eq!(result, r#"{"a":2,"z":1}"#);
}
#[test]
fn test_canonicalize_urlencoded() {
let result = ash_canonicalize_urlencoded("z=1&a=2").unwrap();
assert_eq!(result, "a=2&z=1");
}
#[test]
fn test_build_and_verify_proof() {
let proof1 =
ash_build_proof("balanced", "POST /api/test", "ctx123", None, r#"{"a":1}"#).unwrap();
let proof2 =
ash_build_proof("balanced", "POST /api/test", "ctx123", None, r#"{"a":1}"#).unwrap();
assert!(ash_verify_proof(&proof1, &proof2));
}
#[test]
fn test_normalize_binding() {
let result = ash_normalize_binding("post", "/api//test/").unwrap();
assert_eq!(result, "POST /api/test");
}
#[test]
fn test_version() {
assert_eq!(ash_version(), "ASHv1");
}
}