11use crate :: {
22 channel_receiver_state:: { ChannelReceiverStates , DeliveryCause } ,
3+ channel_recovery_context:: ChannelRecoveryContext ,
34 types:: { ChannelId , Identifier , PayloadSize } ,
4- Result ,
5+ Error , Result ,
56} ;
67use parking_lot:: Mutex ;
78use std:: { fmt, sync:: Arc } ;
@@ -12,7 +13,7 @@ pub struct ChannelStatus(Arc<Mutex<Inner>>);
1213
1314impl ChannelStatus {
1415 pub fn initializing ( & self ) -> bool {
15- self . 0 . lock ( ) . state == ChannelState :: Initial
16+ [ ChannelState :: Initial , ChannelState :: Reconnecting ] . contains ( & self . 0 . lock ( ) . state )
1617 }
1718
1819 pub fn closing ( & self ) -> bool {
@@ -23,6 +24,17 @@ impl ChannelStatus {
2324 self . 0 . lock ( ) . state == ChannelState :: Connected
2425 }
2526
27+ pub ( crate ) fn update_recovery_context < F : Fn ( & mut ChannelRecoveryContext ) > ( & self , apply : F ) {
28+ let mut inner = self . 0 . lock ( ) ;
29+ if let Some ( context) = inner. recovery_context . as_mut ( ) {
30+ apply ( context) ;
31+ }
32+ }
33+
34+ pub ( crate ) fn finalize_recovery ( & self ) {
35+ self . 0 . lock ( ) . finalize_recovery ( ) ;
36+ }
37+
2638 pub ( crate ) fn can_receive_messages ( & self ) -> bool {
2739 [ ChannelState :: Closing , ChannelState :: Connected ] . contains ( & self . 0 . lock ( ) . state )
2840 }
@@ -32,8 +44,10 @@ impl ChannelStatus {
3244 }
3345
3446 pub ( crate ) fn set_confirm ( & self ) {
35- self . 0 . lock ( ) . confirm = true ;
47+ let mut inner = self . 0 . lock ( ) ;
48+ inner. confirm = true ;
3649 trace ! ( "Publisher confirms activated" ) ;
50+ inner. finalize_recovery ( ) ;
3751 }
3852
3953 pub fn state ( & self ) -> ChannelState {
@@ -44,6 +58,12 @@ impl ChannelStatus {
4458 self . 0 . lock ( ) . state = state;
4559 }
4660
61+ pub ( crate ) fn set_reconnecting ( & self , error : Error ) {
62+ let mut inner = self . 0 . lock ( ) ;
63+ inner. state = ChannelState :: Reconnecting ;
64+ inner. recovery_context = Some ( ChannelRecoveryContext :: new ( error) ) ;
65+ }
66+
4767 pub ( crate ) fn auto_close ( & self , id : ChannelId ) -> bool {
4868 id != 0 && self . 0 . lock ( ) . state == ChannelState :: Connected
4969 }
@@ -116,6 +136,7 @@ impl ChannelStatus {
116136pub enum ChannelState {
117137 #[ default]
118138 Initial ,
139+ Reconnecting ,
119140 Connected ,
120141 Closing ,
121142 Closed ,
@@ -141,6 +162,7 @@ struct Inner {
141162 send_flow : bool ,
142163 state : ChannelState ,
143164 receiver_state : ChannelReceiverStates ,
165+ recovery_context : Option < ChannelRecoveryContext > ,
144166}
145167
146168impl Default for Inner {
@@ -150,6 +172,15 @@ impl Default for Inner {
150172 send_flow : true ,
151173 state : ChannelState :: default ( ) ,
152174 receiver_state : ChannelReceiverStates :: default ( ) ,
175+ recovery_context : None ,
176+ }
177+ }
178+ }
179+
180+ impl Inner {
181+ pub ( crate ) fn finalize_recovery ( & mut self ) {
182+ if let Some ( ctx) = self . recovery_context . take ( ) {
183+ ctx. finalize_recovery ( ) ;
153184 }
154185 }
155186}
0 commit comments