Mountain/IPC/EmitWithTraceparent.rs
1#![allow(non_snake_case)]
2
3//! Wrap `app_handle.emit(name, payload)` so every outbound Sky-side
4//! Tauri event carries a W3C `_traceparent` field on its JSON payload.
5//! Sky's `Workbench/Electron/TraceparentBridge.ts::ConsumeFromPayload`
6//! strips the field at the receiving end, registers the trace context
7//! for the duration of the event handler, and Sky's `OTELBridge` reads
8//! it so spans emitted inside the handler attach to the same trace.
9//!
10//! Migration plan: replace `app_handle.emit(...)` call sites
11//! incrementally with `EmitWithTraceparent::Fn(...)`. Both paths
12//! coexist - the bridge tolerates payloads without `_traceparent`.
13
14use serde_json::{Value, json};
15use tauri::{AppHandle, Emitter};
16
17/// Emit a Tauri event with a `_traceparent` field merged into its
18/// JSON payload. `Payload` must be a JSON object (or null - we'll
19/// build one). Non-object payloads pass through unchanged so existing
20/// emit sites that send raw arrays / numbers / strings stay correct.
21///
22/// Release builds: `cfg!(debug_assertions)` short-circuits to a plain
23/// `app_handle.emit(...)` so no traceparent bytes ship to production.
24pub fn Fn<R:tauri::Runtime>(ApplicationHandle:&AppHandle<R>, EventName:&str, Payload:Value) -> tauri::Result<()> {
25 if !cfg!(debug_assertions) {
26 return ApplicationHandle.emit(EventName, Payload);
27 }
28
29 let Header = CommonLibrary::Telemetry::Traceparent::Build();
30
31 let Stamped = match Payload {
32 Value::Object(mut Map) => {
33 Map.insert("_traceparent".to_string(), Value::String(Header));
34
35 Value::Object(Map)
36 },
37
38 Value::Null => json!({ "_traceparent": Header }),
39
40 Other => Other,
41 };
42
43 ApplicationHandle.emit(EventName, Stamped)
44}
45
46/// Variant for callers that already serialise into a `serde_json::Map`.
47pub fn FnMap<R:tauri::Runtime>(
48 ApplicationHandle:&AppHandle<R>,
49
50 EventName:&str,
51
52 mut Map:serde_json::Map<String, Value>,
53) -> tauri::Result<()> {
54 if cfg!(debug_assertions) {
55 let Header = CommonLibrary::Telemetry::Traceparent::Build();
56
57 Map.insert("_traceparent".to_string(), Value::String(Header));
58 }
59
60 ApplicationHandle.emit(EventName, Value::Object(Map))
61}