//! Call key derivation. use crate::errors::to_js_err; use wasm_bindgen::prelude::*; /// Call keys for encrypted voice/video media. /// /// Call `free()` when done to zeroize key material. #[wasm_bindgen] pub struct CallKeys { inner: Option, } #[wasm_bindgen] impl CallKeys { /// Current send key (32 bytes). #[wasm_bindgen(js_name = "sendKey")] pub fn send_key(&self) -> Result, JsValue> { let inner = self .inner .as_ref() .ok_or_else(|| crate::errors::js_error("call keys consumed"))?; Ok(inner.send_key().to_vec()) } /// Current recv key (32 bytes). #[wasm_bindgen(js_name = "recvKey")] pub fn recv_key(&self) -> Result, JsValue> { let inner = self .inner .as_ref() .ok_or_else(|| crate::errors::js_error("call keys consumed"))?; Ok(inner.recv_key().to_vec()) } /// Advance the call chain — derives fresh keys, zeroizes old ones. pub fn advance(&mut self) -> Result<(), JsValue> { let inner = self .inner .as_mut() .ok_or_else(|| crate::errors::js_error("call keys consumed"))?; inner.advance().map_err(to_js_err) } pub fn free(&mut self) { self.inner = None; } } impl CallKeys { pub fn from_inner(inner: soliton::call::CallKeys) -> Self { Self { inner: Some(inner) } } }