@@ -16,12 +16,15 @@ use crate::message::logon::Logon;
1616use crate :: message:: logout:: Logout ;
1717use crate :: message:: verification:: VerificationFlags ;
1818use crate :: session:: ctx:: { PreProcessDecision , SessionCtx , TransitionResult , VerificationResult } ;
19- use crate :: session:: error:: { InternalSendError , InternalSendResultExt , SessionOperationError } ;
19+ use crate :: session:: error:: {
20+ InternalSendError , InternalSendResultExt , SessionOperationError , SetNextTargetSeqNumError ,
21+ } ;
2022use crate :: session:: event:: ScheduleResponse ;
2123use crate :: session:: info:: Status as SessionInfoStatus ;
2224use crate :: transport:: writer:: WriterRef ;
2325use hotfix_message:: message:: Message ;
2426use hotfix_store:: MessageStore ;
27+ use std:: num:: NonZeroU64 ;
2528use std:: time:: Duration ;
2629use tokio:: sync:: oneshot;
2730use tokio:: time:: Instant ;
@@ -247,6 +250,33 @@ impl SessionState {
247250 }
248251 }
249252
253+ /// Set the next expected target sequence number. Only permitted while
254+ /// `Disconnected` — any other state returns `InvalidState`.
255+ ///
256+ /// The store stores "last seen" (see `inbound::on_sequence_reset` passing
257+ /// `end - 1`), so we subtract 1 to make `next_target_seq_number()` return
258+ /// `seq_num`. `NonZeroU64` guarantees the subtraction is safe.
259+ pub ( crate ) async fn try_set_next_target_seq_num < A , S > (
260+ & self ,
261+ ctx : & mut SessionCtx < A , S > ,
262+ seq_num : NonZeroU64 ,
263+ ) -> Result < ( ) , SetNextTargetSeqNumError >
264+ where
265+ A : Application ,
266+ S : MessageStore ,
267+ {
268+ match self {
269+ SessionState :: Disconnected ( _) => ctx
270+ . store
271+ . set_target_seq_number ( seq_num. get ( ) - 1 )
272+ . await
273+ . map_err ( SetNextTargetSeqNumError :: from) ,
274+ _ => Err ( SetNextTargetSeqNumError :: InvalidState {
275+ current : self . as_status ( ) ,
276+ } ) ,
277+ }
278+ }
279+
250280 /// Sends a logout message and puts the session state into an [`AwaitingLogout`] state.
251281 ///
252282 /// The session waits for a configurable timeout period for the counterparty to
0 commit comments