balius_runtime/sign/
mod.rs1pub 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}