axum_cometd/context/
builder.rs1use 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#[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 #[inline(always)]
54 pub fn new() -> Self {
55 Self::default()
56 }
57
58 #[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 #[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 #[inline(always)]
103 #[must_use]
104 pub fn interval_ms(self, _interval_ms: u64) -> Self {
105 unimplemented!()
106 }
114
115 #[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 #[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 #[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 #[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 #[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 #[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}