1use napi::bindgen_prelude::{BigInt, Buffer};
2use napi_derive::napi;
3
4const DEFAULT_CAPACITY: u32 = 64 * 1024;
5const DEFAULT_DRAIN: u32 = 64 * 1024;
6
7fn reason(error: acta_abi::Error) -> napi::Error {
8 napi::Error::from_reason(error.to_string())
9}
10
11#[napi]
12pub struct Logger {
13 inner: Option<acta_abi::Logger>,
14}
15
16#[napi]
17impl Logger {
18 #[napi(constructor)]
19 pub fn new(config: Option<serde_json::Value>, capacity: Option<u32>) -> napi::Result<Self> {
20 let config = config.unwrap_or_else(|| serde_json::Value::Object(serde_json::Map::new()));
21 acta_abi::Logger::from_config_value(config, capacity.unwrap_or(DEFAULT_CAPACITY) as usize)
22 .map(|logger| Self {
23 inner: Some(logger),
24 })
25 .map_err(reason)
26 }
27
28 #[napi]
29 pub fn log(&self, level: u32, message: String) -> napi::Result<()> {
30 self.with(|logger| logger.log(level, &message).map_err(reason))
31 }
32
33 #[napi]
34 pub fn event(&self, event: serde_json::Value) -> napi::Result<()> {
35 self.with(|logger| logger.event_value(event).map_err(reason))
36 }
37
38 #[napi]
39 pub fn create_span(&self, event: serde_json::Value) -> napi::Result<u32> {
40 self.with(|logger| logger.create_span_value(event).map_err(reason))
41 }
42
43 #[napi]
44 pub fn record_span(&self, id: u32, fields: serde_json::Value) -> napi::Result<()> {
45 self.with(|logger| logger.record_span_value(id, fields).map_err(reason))
46 }
47
48 #[napi]
49 pub fn close_span(&self, id: u32) -> napi::Result<()> {
50 self.with(|logger| logger.close_span(id).map_err(reason))
51 }
52
53 #[napi]
54 pub fn drain(&self, max_bytes: Option<u32>) -> napi::Result<Buffer> {
55 self.with(|logger| {
56 Ok(Buffer::from(
57 logger.drain(max_bytes.unwrap_or(DEFAULT_DRAIN) as usize),
58 ))
59 })
60 }
61
62 #[napi]
63 pub fn dropped(&self) -> napi::Result<BigInt> {
64 self.with(|logger| {
65 Ok(BigInt {
66 sign_bit: false,
67 words: vec![logger.dropped()],
68 })
69 })
70 }
71
72 #[napi]
73 pub fn set_filter(&self, filter: String) -> napi::Result<()> {
74 self.with(|logger| logger.set_filter(&filter).map_err(reason))
75 }
76
77 #[napi]
78 pub fn close(&mut self) {
79 self.inner.take();
80 }
81
82 fn with<T>(
83 &self,
84 operation: impl FnOnce(&acta_abi::Logger) -> napi::Result<T>,
85 ) -> napi::Result<T> {
86 operation(
87 self.inner
88 .as_ref()
89 .ok_or_else(|| napi::Error::from_reason("Logger is closed"))?,
90 )
91 }
92}
93
94#[napi]
95pub fn abi_version() -> u32 {
96 acta_abi::ABI_VERSION
97}
98
99#[napi]
100pub fn version() -> String {
101 acta_abi::VERSION.to_owned()
102}