77//!
88//! The solution is to track client sessions:
99//! 1. Clients register and receive unique IDs
10- //! 2. Each request carries (client_id, sequence_number)
10+ //! 2. Each request carries (` client_id`, ` sequence_number` )
1111//! 3. The state machine tracks the last completed sequence per client
1212//! 4. Duplicate requests return cached responses
1313//!
@@ -95,10 +95,7 @@ pub struct ClientSession<R> {
9595
9696impl < R > Default for ClientSession < R > {
9797 fn default ( ) -> Self {
98- Self {
99- last_sequence : 0 ,
100- last_response : None ,
101- }
98+ Self { last_sequence : 0 , last_response : None }
10299 }
103100}
104101
@@ -138,10 +135,7 @@ pub struct SessionTracker<R> {
138135impl < R : Clone > SessionTracker < R > {
139136 /// Create a new session tracker.
140137 pub fn new ( ) -> Self {
141- Self {
142- sessions : BTreeMap :: new ( ) ,
143- next_client_id : 1 ,
144- }
138+ Self { sessions : BTreeMap :: new ( ) , next_client_id : 1 }
145139 }
146140
147141 /// Register a new client session.
@@ -185,12 +179,7 @@ impl<R: Clone> SessionTracker<R> {
185179 ///
186180 /// Call this after executing a command. Caches the response for
187181 /// duplicate detection.
188- pub fn record_completion (
189- & mut self ,
190- client_id : ClientId ,
191- sequence : SequenceNum ,
192- response : R ,
193- ) {
182+ pub fn record_completion ( & mut self , client_id : ClientId , sequence : SequenceNum , response : R ) {
194183 let session = self . sessions . entry ( client_id) . or_default ( ) ;
195184 if sequence > session. last_sequence {
196185 session. last_sequence = sequence;
@@ -244,10 +233,7 @@ mod tests {
244233 let mut tracker: SessionTracker < String > = SessionTracker :: new ( ) ;
245234 let client = tracker. register_client ( ) ;
246235
247- assert ! ( matches!(
248- tracker. check_duplicate( client, 1 ) ,
249- DuplicateCheck :: New
250- ) ) ;
236+ assert ! ( matches!( tracker. check_duplicate( client, 1 ) , DuplicateCheck :: New ) ) ;
251237 }
252238
253239 #[ test]
@@ -274,10 +260,7 @@ mod tests {
274260 tracker. record_completion ( client, 5 , "response5" . to_string ( ) ) ;
275261
276262 // Sequence 3 is stale
277- assert ! ( matches!(
278- tracker. check_duplicate( client, 3 ) ,
279- DuplicateCheck :: Stale
280- ) ) ;
263+ assert ! ( matches!( tracker. check_duplicate( client, 3 ) , DuplicateCheck :: Stale ) ) ;
281264 }
282265
283266 #[ test]
@@ -288,10 +271,7 @@ mod tests {
288271 tracker. record_completion ( client, 1 , "response1" . to_string ( ) ) ;
289272
290273 // Sequence 2 is new
291- assert ! ( matches!(
292- tracker. check_duplicate( client, 2 ) ,
293- DuplicateCheck :: New
294- ) ) ;
274+ assert ! ( matches!( tracker. check_duplicate( client, 2 ) , DuplicateCheck :: New ) ) ;
295275 }
296276
297277 #[ test]
@@ -309,10 +289,7 @@ mod tests {
309289 let tracker: SessionTracker < String > = SessionTracker :: new ( ) ;
310290 let unknown = ClientId ( 999 ) ;
311291
312- assert ! ( matches!(
313- tracker. check_duplicate( unknown, 1 ) ,
314- DuplicateCheck :: New
315- ) ) ;
292+ assert ! ( matches!( tracker. check_duplicate( unknown, 1 ) , DuplicateCheck :: New ) ) ;
316293 }
317294
318295 #[ test]
0 commit comments