use sentry::{protocol::EnvelopeItem, Breadcrumb, Client, Envelope};
use serde::Deserialize;
use tauri::State;
#[derive(Debug, Clone, Deserialize)]
#[serde(untagged)]
#[allow(missing_docs)]
pub enum Buffer {
Text(String),
Raw(Vec<u8>),
}
#[tauri::command]
pub fn envelope(sentry_client: State<'_, Client>, envelope: Buffer) {
let buffer = match envelope {
Buffer::Text(str) => str.into_bytes(),
Buffer::Raw(vec) => vec,
};
let parsed = Envelope::from_slice(&buffer);
if parsed.is_err() {
if let Ok(raw) = Envelope::from_bytes_raw(buffer) {
sentry_client.send_envelope(raw);
}
return;
}
if let Ok(envelope) = parsed {
if let Some(mut event) = envelope.event().cloned() {
event.platform = "javascript".into();
event.release = None;
event.environment = None;
event.dist = None;
if let Some(ref mut req) = event.request {
req.headers.remove("User-Agent");
}
let attachments = envelope
.items()
.filter_map(|item| match item {
EnvelopeItem::Attachment(attachment) => Some(attachment.clone()),
_ => None,
})
.collect::<Vec<_>>();
sentry::with_scope(
|scope| {
for attachment in attachments {
scope.add_attachment(attachment);
}
},
|| {
sentry::capture_event(event);
},
)
} else {
sentry_client.send_envelope(envelope);
}
}
}
#[tauri::command]
pub fn breadcrumb(breadcrumb: Breadcrumb) {
sentry::add_breadcrumb(breadcrumb);
}