balius_runtime/sign/
mod.rs

1pub mod in_memory;
2
3use std::sync::Arc;
4
5use tokio::sync::Mutex;
6
7use crate::wit::balius::app::sign as wit;
8
9#[derive(Clone)]
10pub enum Signer {
11    InMemory(in_memory::Signer),
12    Custom(Arc<Mutex<dyn SignerProvider + Send + Sync>>),
13}
14
15impl From<in_memory::Signer> for Signer {
16    fn from(signer: in_memory::Signer) -> Self {
17        Signer::InMemory(signer)
18    }
19}
20
21pub struct SignerHost {
22    worker_id: String,
23    provider: Signer,
24}
25impl SignerHost {
26    pub fn new(worker_id: &str, provider: &Signer) -> Self {
27        Self {
28            worker_id: worker_id.to_string(),
29            provider: provider.clone(),
30        }
31    }
32
33    pub async fn add_key(&mut self, key_name: String, algorithm: String) -> Vec<u8> {
34        match &mut self.provider {
35            Signer::InMemory(signer) => signer.add_key(&self.worker_id, key_name, algorithm).await,
36            Signer::Custom(signer) => {
37                let mut lock = signer.lock().await;
38                lock.add_key(&self.worker_id, key_name, algorithm).await
39            }
40        }
41    }
42}
43
44#[async_trait::async_trait]
45pub trait SignerProvider {
46    async fn add_key(&mut self, worker_id: &str, key_name: String, algorithm: String) -> Vec<u8>;
47    async fn sign_payload(
48        &mut self,
49        worker_id: &str,
50        key_name: String,
51        payload: wit::Payload,
52    ) -> Result<wit::Signature, wit::SignError>;
53}
54
55#[async_trait::async_trait]
56impl wit::Host for SignerHost {
57    async fn sign_payload(
58        &mut self,
59        key_name: String,
60        payload: wit::Payload,
61    ) -> Result<wit::Signature, wit::SignError> {
62        match &mut self.provider {
63            Signer::InMemory(signer) => {
64                signer
65                    .sign_payload(&self.worker_id, key_name, payload)
66                    .await
67            }
68            Signer::Custom(signer) => {
69                let mut lock = signer.lock().await;
70                lock.sign_payload(&self.worker_id, key_name, payload).await
71            }
72        }
73    }
74}