statsig_rust/networking/providers/
net_provider_global.rs

1use crate::{log_e, networking::NetworkProvider};
2use parking_lot::Mutex;
3use std::{
4    sync::{Arc, Weak},
5    time::Duration,
6};
7
8lazy_static::lazy_static! {
9    static ref INSTANCE: Mutex<Option<Weak<dyn NetworkProvider>>> = Mutex::new(None);
10}
11
12const TAG: &str = stringify!(NetworkProviderGlobal);
13
14pub struct NetworkProviderGlobal;
15
16impl NetworkProviderGlobal {
17    pub fn try_get() -> Option<Weak<dyn NetworkProvider>> {
18        let lock = match INSTANCE.try_lock_for(Duration::from_secs(5)) {
19            Some(lock) => lock,
20            None => {
21                log_e!(
22                    TAG,
23                    "Failed to get network provider: Failed to lock INSTANCE"
24                );
25                return None;
26            }
27        };
28
29        match lock.as_ref() {
30            Some(weak) => Some(weak.clone()),
31            None => None,
32        }
33    }
34
35    pub fn set(provider: &Arc<dyn NetworkProvider>) {
36        match INSTANCE.try_lock_for(Duration::from_secs(5)) {
37            Some(mut instance) => {
38                *instance = Some(Arc::downgrade(provider));
39            }
40            None => {
41                log_e!(
42                    TAG,
43                    "Failed to set network provider: Failed to lock INSTANCE"
44                );
45            }
46        }
47    }
48}