use rings_derive::wasm_export;
use super::model::pack_session;
use super::Account;
use super::Session;
use super::SessionSk;
use crate::consts::DEFAULT_SESSION_TTL_MS;
use crate::ecc::SecretKey;
use crate::error::Result;
use crate::utils;
#[wasm_export]
pub struct SessionSkBuilder {
sk: SecretKey,
account_entity: String,
account_type: String,
ttl_ms: u64,
ts_ms: u128,
sig: Vec<u8>,
}
#[wasm_export]
impl SessionSkBuilder {
pub fn new(account_entity: String, account_type: String) -> SessionSkBuilder {
let sk = SecretKey::random();
Self {
sk,
account_entity,
account_type,
ttl_ms: DEFAULT_SESSION_TTL_MS,
ts_ms: utils::get_epoch_ms(),
sig: vec![],
}
}
pub fn validate_account(&self) -> bool {
Account::try_from((self.account_entity.clone(), self.account_type.clone()))
.map_err(|error| {
tracing::debug!(?error, "session account validation failed");
error
})
.is_ok()
}
pub fn unsigned_proof(&self) -> String {
pack_session(self.sk.address().into(), self.ts_ms, self.ttl_ms)
}
pub fn set_session_sig(mut self, sig: Vec<u8>) -> Self {
self.sig = sig;
self
}
pub fn set_ttl(mut self, ttl_ms: u64) -> Self {
self.ttl_ms = ttl_ms;
self
}
pub fn build(self) -> Result<SessionSk> {
let account = Account::try_from((self.account_entity, self.account_type))?;
let session = Session {
session_id: self.sk.address().into(),
account,
ttl_ms: self.ttl_ms,
ts_ms: self.ts_ms,
sig: self.sig,
};
session.verify_self()?;
Ok(SessionSk::from_parts(session, self.sk))
}
}