axum_cometd/context/
builder.rs

1use crate::{consts::*, LongPollingServiceContext};
2use ahash::{HashMap, HashMapExt as _};
3use async_broadcast::broadcast;
4use core::time::Duration;
5use std::sync::Arc;
6use tokio::sync::RwLock;
7
8/// A builder to construct `LongPoolingServiceContext`.
9#[derive(Debug)]
10pub struct LongPollingServiceContextBuilder {
11    events_channel_capacity: usize,
12    subscriptions_storage_capacity: usize,
13    client_ids_storage_capacity: usize,
14    consts: LongPollingServiceContextConsts,
15}
16
17impl Default for LongPollingServiceContextBuilder {
18    #[inline(always)]
19    fn default() -> Self {
20        Self {
21            events_channel_capacity: DEFAULT_CHANNEL_CAPACITY,
22            subscriptions_storage_capacity: DEFAULT_STORAGE_CAPACITY,
23            client_ids_storage_capacity: DEFAULT_STORAGE_CAPACITY,
24            consts: Default::default(),
25        }
26    }
27}
28
29#[derive(Debug)]
30pub(crate) struct LongPollingServiceContextConsts {
31    pub(crate) timeout: Duration,
32    pub(crate) interval: Duration,
33    pub(crate) max_interval: Duration,
34    pub(crate) client_channel_capacity: usize,
35    pub(crate) subscription_channel_capacity: usize,
36}
37
38impl Default for LongPollingServiceContextConsts {
39    #[inline(always)]
40    fn default() -> Self {
41        Self {
42            timeout: DEFAULT_TIMEOUT,
43            interval: DEFAULT_INTERVAL,
44            max_interval: DEFAULT_MAX_INTERVAL,
45            client_channel_capacity: DEFAULT_CHANNEL_CAPACITY,
46            subscription_channel_capacity: DEFAULT_CHANNEL_CAPACITY,
47        }
48    }
49}
50
51impl LongPollingServiceContextBuilder {
52    /// Construct a new `LongPoolingServiceContextBuilder`.
53    #[inline(always)]
54    pub fn new() -> Self {
55        Self::default()
56    }
57
58    /// Return a `LongPoolingServiceContextBuilder`.
59    ///
60    /// # Example
61    /// ```rust,no_run
62    /// use axum_cometd::LongPollingServiceContextBuilder;
63    ///
64    /// let context = LongPollingServiceContextBuilder::new().build::<(), ()>();
65    /// ```
66    #[inline(always)]
67    pub fn build<AdditionalData, CustomData>(
68        self,
69    ) -> Arc<LongPollingServiceContext<AdditionalData, CustomData>> {
70        let Self {
71            events_channel_capacity,
72            subscriptions_storage_capacity,
73            client_ids_storage_capacity,
74            consts,
75        } = self;
76
77        let (tx, mut rx) = broadcast(events_channel_capacity);
78        rx.set_await_active(false);
79
80        Arc::new(LongPollingServiceContext {
81            tx,
82            inactive_rx: rx.deactivate(),
83            wildnames_cache: Default::default(),
84            channel_name_validator: Default::default(),
85            consts,
86            channels_data: RwLock::new(HashMap::with_capacity(subscriptions_storage_capacity)),
87            client_id_senders: Arc::new(RwLock::new(HashMap::with_capacity(
88                client_ids_storage_capacity,
89            ))),
90        })
91    }
92
93    /// Set message wait timeout.
94    #[inline(always)]
95    #[must_use]
96    pub const fn timeout(mut self, timeout: Duration) -> Self {
97        self.consts.timeout = timeout;
98        self
99    }
100
101    /// Set timeout, that the client must wait between two connects.
102    #[inline(always)]
103    #[must_use]
104    pub fn interval_ms(self, _interval_ms: u64) -> Self {
105        unimplemented!()
106        /*Self {
107            consts: LongPoolingServiceContextConsts {
108                interval_ms,
109                ..self.consts
110            },
111            ..self
112        }*/
113    }
114
115    /// Set timeout, which server wait between erase clientId.
116    #[inline(always)]
117    #[must_use]
118    pub const fn max_interval(mut self, max_interval: Duration) -> Self {
119        self.consts.max_interval = max_interval;
120        self
121    }
122
123    /// Set capacity of event channel.
124    #[inline(always)]
125    #[must_use]
126    pub const fn events_channel_capacity(mut self, capacity: usize) -> Self {
127        self.events_channel_capacity = capacity;
128        self
129    }
130
131    /// Set capacity of internal client channels.
132    #[inline(always)]
133    #[must_use]
134    pub const fn client_channel_capacity(mut self, capacity: usize) -> Self {
135        self.consts.client_channel_capacity = capacity;
136        self
137    }
138
139    /// Set capacity of internal client channels storage.
140    #[inline(always)]
141    #[must_use]
142    pub const fn client_storage_capacity(mut self, capacity: usize) -> Self {
143        self.client_ids_storage_capacity = capacity;
144        self
145    }
146
147    /// Set capacity of internal subscription channels.
148    #[inline(always)]
149    #[must_use]
150    pub const fn subscription_channel_capacity(mut self, capacity: usize) -> Self {
151        self.consts.subscription_channel_capacity = capacity;
152        self
153    }
154
155    /// Set capacity of internal subscription channels storage.
156    #[inline(always)]
157    #[must_use]
158    pub const fn subscription_storage_capacity(mut self, capacity: usize) -> Self {
159        self.subscriptions_storage_capacity = capacity;
160        self
161    }
162}