keyhive_wasm 0.3.0

WebAssembly wrappers for keyhive_core
Documentation
use keyhive_core::principal::{identifier::Identifier, public::Public};
use serde::{Deserialize, Serialize};
use thiserror::Error;
use wasm_bindgen::prelude::*;

#[wasm_bindgen(js_name = Identifier)]
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct JsIdentifier(pub(crate) Identifier);

#[wasm_bindgen(js_class = Identifier)]
impl JsIdentifier {
    #[wasm_bindgen(constructor)]
    pub fn new(bytes: Vec<u8>) -> Result<Self, CannotParseIdentifier> {
        let vec: [u8; 32] = bytes.try_into().map_err(|_| CannotParseIdentifier)?;

        // NOTE signature::Error is opaque, so we can just ignore the inbuilt error
        let vk =
            ed25519_dalek::VerifyingKey::from_bytes(&vec).map_err(|_| CannotParseIdentifier)?;

        Ok(JsIdentifier(Identifier::from(vk)))
    }

    #[wasm_bindgen(js_name = publicId)]
    pub fn public_id() -> Self {
        JsIdentifier(Public.id())
    }

    #[wasm_bindgen(js_name = toBytes)]
    pub fn to_bytes(&self) -> Vec<u8> {
        self.0.as_bytes().to_vec()
    }
}

impl From<Identifier> for JsIdentifier {
    fn from(id: Identifier) -> Self {
        JsIdentifier(id)
    }
}

#[wasm_bindgen]
#[derive(Debug, Clone, Copy, Error)]
#[error("Cannot parse identifier")]
pub struct CannotParseIdentifier;