keyhive_wasm 0.3.0

WebAssembly wrappers for keyhive_core
Documentation
use super::{change_id::JsChangeId, event::JsEvent, signer::JsSigner};
use beekem::operation::CgkaOperation;
use derive_more::{From, Into};
use dupe::Dupe;
use keyhive_core::{
    event::Event,
    listener::{cgka::CgkaListener, membership::MembershipListener, prekey::PrekeyListener},
    principal::{
        group::{delegation::Delegation, revocation::Revocation},
        individual::op::{add_key::AddKeyOp, rotate_key::RotateKeyOp},
    },
};
use keyhive_crypto::signed::Signed;
use std::sync::Arc;
use wasm_bindgen::prelude::*;

#[derive(Debug, Clone, From, Into)]
pub struct JsEventHandler(pub(crate) js_sys::Function);

impl JsEventHandler {
    pub fn call(&self, event: JsEvent) {
        self.0.call1(&JsValue::NULL, &event.into()).unwrap();
    }
}

impl Dupe for JsEventHandler {
    fn dupe(&self) -> Self {
        self.clone()
    }
}

impl PrekeyListener for JsEventHandler {
    async fn on_prekeys_expanded(&self, e: &Arc<Signed<AddKeyOp>>) {
        self.call(Event::PrekeysExpanded(e.dupe()).into())
    }

    async fn on_prekey_rotated(&self, e: &Arc<Signed<RotateKeyOp>>) {
        self.call(Event::PrekeyRotated(e.dupe()).into())
    }
}

impl MembershipListener<JsSigner, JsChangeId> for JsEventHandler {
    async fn on_delegation(&self, data: &Arc<Signed<Delegation<JsSigner, JsChangeId, Self>>>) {
        self.call(Event::Delegated(data.dupe()).into())
    }

    async fn on_revocation(&self, data: &Arc<Signed<Revocation<JsSigner, JsChangeId, Self>>>) {
        self.call(Event::Revoked(data.dupe()).into())
    }
}

impl CgkaListener for JsEventHandler {
    async fn on_cgka_op(&self, data: &Arc<Signed<CgkaOperation>>) {
        self.call(Event::CgkaOperation(data.dupe()).into())
    }
}