Skip to main content

stakpak_shared/
telemetry.rs

1//! Telemetry module for anonymous usage tracking
2//!
3//! This module provides integration for tracking local provider usage.
4//! Telemetry is opt-out and collects no personal data, prompts, or session content.
5
6use serde::Serialize;
7use std::fmt;
8
9const TELEMETRY_ENDPOINT: &str = "https://apiv2.stakpak.dev/v1/telemetry";
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
12pub enum TelemetryEvent {
13    FirstOpen,
14    UserPrompted,
15    InitCommandCalled,
16}
17
18impl fmt::Display for TelemetryEvent {
19    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
20        match self {
21            TelemetryEvent::FirstOpen => write!(f, "FirstOpen"),
22            TelemetryEvent::UserPrompted => write!(f, "UserPrompted"),
23            TelemetryEvent::InitCommandCalled => write!(f, "InitCommandCalled"),
24        }
25    }
26}
27
28#[derive(Serialize)]
29struct TelemetryPayload {
30    event: String,
31    machine_name: String,
32    provider: String,
33    user_id: String,
34}
35
36pub fn capture_event(
37    anonymous_id: &str,
38    machine_name: Option<&str>,
39    enabled: bool,
40    event: TelemetryEvent,
41) {
42    if !enabled {
43        return;
44    }
45
46    let payload = TelemetryPayload {
47        event: event.to_string(),
48        machine_name: machine_name.unwrap_or("").to_string(),
49        provider: "Local".to_string(),
50        user_id: anonymous_id.to_string(),
51    };
52
53    tokio::spawn(async move {
54        let client = match crate::tls_client::create_tls_client(
55            crate::tls_client::TlsClientConfig::default(),
56        ) {
57            Ok(c) => c,
58            Err(_) => return,
59        };
60        let _ = client.post(TELEMETRY_ENDPOINT).json(&payload).send().await;
61    });
62}