tlsn_wasm/verifier/
mod.rs

1mod config;
2
3pub use config::VerifierConfig;
4
5use enum_try_as_inner::EnumTryAsInner;
6use tlsn_verifier::{
7    state::{self, Initialized},
8    Verifier,
9};
10use tracing::info;
11use wasm_bindgen::prelude::*;
12use ws_stream_wasm::{WsMeta, WsStream};
13
14use crate::types::VerifierOutput;
15
16type Result<T> = std::result::Result<T, JsError>;
17
18#[wasm_bindgen(js_name = Verifier)]
19pub struct JsVerifier {
20    state: State,
21}
22
23#[derive(EnumTryAsInner)]
24#[derive_err(Debug)]
25enum State {
26    Initialized(Verifier<state::Initialized>),
27    Connected((Verifier<state::Initialized>, WsStream)),
28    Complete,
29    Error,
30}
31
32impl std::fmt::Debug for State {
33    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34        write!(f, "State")
35    }
36}
37
38impl State {
39    fn take(&mut self) -> Self {
40        std::mem::replace(self, State::Error)
41    }
42}
43
44#[wasm_bindgen(js_class = Verifier)]
45impl JsVerifier {
46    #[wasm_bindgen(constructor)]
47    pub fn new(config: VerifierConfig) -> JsVerifier {
48        JsVerifier {
49            state: State::Initialized(Verifier::new(config.into())),
50        }
51    }
52
53    /// Connect to the prover.
54    pub async fn connect(&mut self, prover_url: &str) -> Result<()> {
55        let verifier = self.state.take().try_into_initialized()?;
56
57        info!("Connecting to prover");
58
59        let (_, prover_conn) = WsMeta::connect(prover_url, None).await?;
60
61        info!("Connected to prover");
62
63        self.state = State::Connected((verifier, prover_conn));
64
65        Ok(())
66    }
67
68    /// Verifies the connection and finalizes the protocol.
69    pub async fn verify(&mut self) -> Result<VerifierOutput> {
70        let (verifier, prover_conn) = self.state.take().try_into_connected()?;
71
72        let (transcript, info) = verifier.verify(prover_conn.into_io()).await?;
73
74        self.state = State::Complete;
75
76        Ok(VerifierOutput {
77            server_name: info.server_name.as_str().to_string(),
78            connection_info: info.connection_info.into(),
79            transcript: transcript.into(),
80        })
81    }
82}
83
84impl From<tlsn_verifier::Verifier<Initialized>> for JsVerifier {
85    fn from(value: tlsn_verifier::Verifier<Initialized>) -> Self {
86        Self {
87            state: State::Initialized(value),
88        }
89    }
90}