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