Skip to main content

Mountain/Binary/Build/PostHogPlugin/
Initialize.rs

1
2//! Bring up the global PostHog client and emit
3//! `land:mountain:session:start`. Must be called once during boot;
4//! re-entrancy is safe because the underlying `OnceLock::set` returns
5//! `Err` on subsequent attempts.
6//!
7//! Note: posthog-rs 0.5 renamed `api_endpoint` → `host` on
8//! `ClientOptionsBuilder` to match the JS/Python SDK vocabulary; keep
9//! `host(...)` here.
10
11use crate::{
12	Binary::Build::PostHogPlugin::{CaptureAllowed, CaptureEvent, Client, Constants},
13	dev_log,
14};
15
16pub async fn Fn() {
17	if !CaptureAllowed::Fn() {
18		return;
19	}
20
21	let Options = posthog_rs::ClientOptionsBuilder::default()
22		.api_key(Constants::POSTHOG_API_KEY.to_string())
23		.host(Constants::POSTHOG_HOST.to_string())
24		.build()
25		.expect("PostHog client options");
26
27	let PostHogClient = posthog_rs::client(Options).await;
28
29	let _ = Client::CLIENT.set(PostHogClient);
30
31	dev_log!(
32		"lifecycle",
33		"[PostHog] Initialized (host={}, debug mode)",
34		Constants::POSTHOG_HOST
35	);
36
37	CaptureEvent::Fn(
38		"land:mountain:session:start",
39		Some(vec![
40			("pid", Box::leak(format!("{}", std::process::id()).into_boxed_str())),
41			("os", std::env::consts::OS),
42			("arch", std::env::consts::ARCH),
43		]),
44	);
45}