Skip to main content

systemprompt_analytics/services/
providers.rs

1//! Authoritative session persistence contracts.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use super::service::AnalyticsService;
7use crate::repository::FingerprintRepository;
8use async_trait::async_trait;
9use http::HeaderMap;
10use systemprompt_identifiers::SessionId;
11use systemprompt_traits::{
12    AnalyticsProvider, AnalyticsProviderError, AnalyticsResult, ExtractSignals,
13    FingerprintProvider, SessionAnalytics,
14};
15impl AnalyticsProvider for AnalyticsService {
16    fn extract_analytics(
17        &self,
18        headers: &HeaderMap,
19        signals: ExtractSignals<'_>,
20    ) -> SessionAnalytics {
21        Self::extract_analytics(self, headers, signals)
22    }
23}
24#[async_trait]
25impl FingerprintProvider for FingerprintRepository {
26    async fn count_active_sessions(&self, fingerprint: &str) -> AnalyticsResult<i64> {
27        self.count_active_sessions(fingerprint)
28            .await
29            .map(i64::from)
30            .map_err(|e| AnalyticsProviderError::Internal(e.to_string()))
31    }
32
33    async fn find_reusable_session(&self, fingerprint: &str) -> AnalyticsResult<Option<SessionId>> {
34        self.find_reusable_session(fingerprint)
35            .await
36            .map_err(|e| AnalyticsProviderError::Internal(e.to_string()))
37    }
38
39    async fn upsert_fingerprint(
40        &self,
41        fingerprint: &str,
42        ip_address: Option<&str>,
43        user_agent: Option<&str>,
44        _screen_info: Option<&str>,
45    ) -> AnalyticsResult<()> {
46        self.upsert_fingerprint(fingerprint, ip_address, user_agent, None)
47            .await
48            .map(|_| ())
49            .map_err(|e| AnalyticsProviderError::Internal(e.to_string()))
50    }
51}