1#![deny(unsafe_code)]
2
3#[cfg(target_arch = "wasm32")]
4use wasm_bindgen::prelude::*;
5
6#[cfg(target_arch = "wasm32")]
7#[wasm_bindgen]
8pub struct Logger {
9 inner: Option<acta_abi::Logger>,
10}
11
12#[cfg(target_arch = "wasm32")]
13#[wasm_bindgen]
14impl Logger {
15 #[wasm_bindgen(constructor)]
16 pub fn new(config_json: &str, capacity: u32) -> Result<Logger, JsValue> {
17 acta_abi::Logger::from_config_json(config_json, capacity as usize)
18 .map(|logger| Self {
19 inner: Some(logger),
20 })
21 .map_err(js_error)
22 }
23
24 pub fn log(&self, level: u32, message: &str) -> Result<(), JsValue> {
25 self.with(|logger| logger.log(level, message))
26 }
27
28 pub fn drain(&self, max_bytes: u32) -> Result<Vec<u8>, JsValue> {
29 self.with(|logger| Ok(logger.drain(max_bytes as usize)))
30 }
31
32 pub fn event(&self, event_json: &str) -> Result<(), JsValue> {
33 self.with(|logger| logger.event_json(event_json))
34 }
35
36 #[wasm_bindgen(js_name = createSpan)]
37 pub fn create_span(&self, event_json: &str) -> Result<u32, JsValue> {
38 self.with(|logger| logger.create_span_json(event_json))
39 }
40
41 #[wasm_bindgen(js_name = recordSpan)]
42 pub fn record_span(&self, id: u32, fields_json: &str) -> Result<(), JsValue> {
43 self.with(|logger| logger.record_span_json(id, fields_json))
44 }
45
46 #[wasm_bindgen(js_name = closeSpan)]
47 pub fn close_span(&self, id: u32) -> Result<(), JsValue> {
48 self.with(|logger| logger.close_span(id))
49 }
50
51 pub fn dropped(&self) -> Result<u64, JsValue> {
52 self.with(|logger| Ok(logger.dropped()))
53 }
54
55 #[wasm_bindgen(js_name = setFilter)]
56 pub fn set_filter(&self, filter: &str) -> Result<(), JsValue> {
57 self.with(|logger| logger.set_filter(filter))
58 }
59
60 pub fn close(&mut self) {
61 self.inner.take();
62 }
63}
64
65#[cfg(target_arch = "wasm32")]
66#[wasm_bindgen(js_name = abiVersion)]
67pub fn abi_version() -> u32 {
68 acta_abi::ABI_VERSION
69}
70
71#[cfg(target_arch = "wasm32")]
72#[wasm_bindgen]
73pub fn version() -> String {
74 acta_abi::VERSION.to_owned()
75}
76
77#[cfg(target_arch = "wasm32")]
78impl Logger {
79 fn with<T>(
80 &self,
81 operation: impl FnOnce(&acta_abi::Logger) -> acta_abi::Result<T>,
82 ) -> Result<T, JsValue> {
83 let logger = self
84 .inner
85 .as_ref()
86 .ok_or_else(|| JsValue::from_str("Logger is closed"))?;
87 operation(logger).map_err(js_error)
88 }
89}
90
91#[cfg(target_arch = "wasm32")]
92fn js_error(error: acta_abi::Error) -> JsValue {
93 JsValue::from_str(&error.to_string())
94}