@@ -31,7 +31,7 @@ use crate::message::sequence_reset::SequenceReset;
3131use crate :: message:: test_request:: TestRequest ;
3232use crate :: message_utils:: is_admin;
3333use crate :: session:: event:: AwaitingActiveSessionResponse ;
34- use crate :: session:: state:: AwaitingResendState ;
34+ use crate :: session:: state:: { ActiveState , AwaitingResendState } ;
3535use crate :: session_schedule:: SessionSchedule ;
3636use event:: SessionEvent ;
3737use hotfix_message:: parsed_message:: ParsedMessage ;
@@ -120,7 +120,6 @@ struct Session<M, S> {
120120 store : S ,
121121 awaiting_test_response : Option < TestRequestId > ,
122122
123- heartbeat_timer : Option < Pin < Box < Sleep > > > ,
124123 peer_timer : Pin < Box < Sleep > > ,
125124 schedule_check_timer : Pin < Box < Sleep > > ,
126125}
@@ -150,7 +149,6 @@ impl<M: FixMessage, S: MessageStore> Session<M, S> {
150149 application,
151150 store,
152151 awaiting_test_response : None ,
153- heartbeat_timer : None ,
154152 peer_timer : Box :: pin ( peer_timer) ,
155153 schedule_check_timer : Box :: pin ( schedule_check_timer) ,
156154 }
@@ -255,9 +253,12 @@ impl<M: FixMessage, S: MessageStore> Session<M, S> {
255253 async fn check_end_of_resend ( & mut self ) -> Result < ( ) > {
256254 let ended_state = if let SessionState :: AwaitingResend ( state) = & mut self . state {
257255 if self . store . next_target_seq_number ( ) > state. end_seq_number {
258- let new_state = SessionState :: Active {
256+ let new_state = SessionState :: Active ( ActiveState {
259257 writer : state. writer . clone ( ) ,
260- } ;
258+ heartbeat_timer : Box :: pin ( sleep ( Duration :: from_secs (
259+ self . config . heartbeat_interval ,
260+ ) ) ) ,
261+ } ) ;
261262 Some ( std:: mem:: replace ( & mut self . state , new_state) )
262263 } else {
263264 None
@@ -355,9 +356,12 @@ impl<M: FixMessage, S: MessageStore> Session<M, S> {
355356 match self . verify_message ( message) . await {
356357 Ok ( _) => {
357358 // happy logon flow, the session is now active
358- self . state = SessionState :: Active {
359+ self . state = SessionState :: Active ( ActiveState {
359360 writer : writer. clone ( ) ,
360- }
361+ heartbeat_timer : Box :: pin ( sleep ( Duration :: from_secs (
362+ self . config . heartbeat_interval ,
363+ ) ) ) ,
364+ } )
361365 }
362366 Err ( err) => match err {
363367 MessageVerificationError :: SeqNumberTooLow { actual, expected } => {
@@ -543,13 +547,8 @@ impl<M: FixMessage, S: MessageStore> Session<M, S> {
543547 }
544548
545549 fn reset_heartbeat_timer ( & mut self ) {
546- let deadline = Instant :: now ( ) + Duration :: from_secs ( self . config . heartbeat_interval ) ;
547- if let Some ( heartbeat_timer) = & mut self . heartbeat_timer {
548- heartbeat_timer. as_mut ( ) . reset ( deadline) ;
549- } else {
550- let timer = sleep ( Duration :: from_secs ( self . config . heartbeat_interval ) ) ;
551- self . heartbeat_timer = Some ( Box :: pin ( timer) ) ;
552- }
550+ self . state
551+ . reset_heartbeat_timer ( self . config . heartbeat_interval ) ;
553552 }
554553
555554 fn reset_peer_timer ( & mut self , awaiting_req_id : Option < TestRequestId > ) {
@@ -747,7 +746,7 @@ where
747746 }
748747 }
749748 ( ) = async {
750- if let Some ( ref mut timer) = session. heartbeat_timer {
749+ if let Some ( ref mut timer) = session. state . heartbeat_timer( ) {
751750 timer. as_mut( ) . await
752751 } else {
753752 std:: future:: pending( ) . await
0 commit comments