#[cfg(feature = "wasm")]
use crate::interface::settings::{RUNNING_SETTINGS, NetworkFormat, NetworkEndpointUrl};
#[cfg(feature = "wasm")]
use serde_json::json;
#[cfg(feature = "wasm")]
pub(super) fn send_log_line(level: &str, target: &str, message: &str) -> Result<(), String> {
let lvl = level.to_owned();
let trg = target.to_owned();
let msg = message.to_owned();
wasm_bindgen_futures::spawn_local(async move {
if let Err(error) = async {
let running_settings = RUNNING_SETTINGS.get().unwrap();
let url: String = {
match &running_settings.network_endpoint_url {
NetworkEndpointUrl::Single(single) => {
single.url.clone()
}
NetworkEndpointUrl::Multiple(multiple) => {
match lvl.as_str() {
"trace" => multiple.trace.clone(),
"debug" => multiple.debug.clone(),
"debugx" => multiple.debugx.clone(),
"info" => multiple.info.clone(),
"warn" => multiple.warn.clone(),
"error" => multiple.error.clone(),
_ => {
return Err(format!(r#"better-logger: Unsupported log level "{}" for network endpoint url"#, lvl));
}
}
}
}
};
let header_level: &str = {
match lvl.as_str() {
"trace" => "TRACE",
"debug" => "DEBUG",
"debugx" => "DEBUG",
"info" => "INFO",
"warn" => "WARN",
"error" => "ERROR",
_ => return Err(format!(r#"better-logger: Unsupported log level "{}" for network formatting"#, lvl)),
}
};
let timestamp = match js_sys::Date::new_0().to_iso_string().as_string() {
Some(value) => {
value
}
None => {
return Err(format!(r#"better-logger: Failed to format timestamp"#));
}
};
let header: String = format!("[{} {} {}]", timestamp, header_level, trg);
let line: String = format!("{} {}", header, msg);
match &running_settings.network_format {
NetworkFormat::PlainText => {
let mut request = gloo_net::http::Request::post(&url)
.header("Content-Type", "text/plain; charset=utf-8");
if running_settings.use_bearer_auth == true {
request = request.header("Authorization", &format!("Bearer {}", running_settings.bearer_auth_key));
}
request
.body(line)
.map_err(|error| format!("build request (PlainText) failed: {:?}", error))?
.send()
.await
.map(|_| ())
.map_err(|error| format!("network log POST (PlainText) failed: {:?}", error))
}
NetworkFormat::JsonText { field } => {
let payload = json!({ field: line }).to_string();
let mut request = gloo_net::http::Request::post(&url)
.header("Content-Type", "application/json; charset=utf-8");
if running_settings.use_bearer_auth == true {
request = request.header("Authorization", &format!("Bearer {}", running_settings.bearer_auth_key));
}
request
.body(payload)
.map_err(|error| format!("build request (JsonText) failed: {:?}", error))?
.send()
.await
.map(|_| ())
.map_err(|error| format!("network log POST (JsonText) failed: {:?}", error))
}
}
}.await {
web_sys::console::error_1(&error.into());
}
});
return Ok(());
}