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