@@ -91,8 +91,16 @@ impl PrimeServerCapabilities {
9191 }
9292}
9393
94+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , Deserialize ) ]
95+ #[ serde( rename_all = "kebab-case" ) ]
96+ pub ( super ) enum OwnedSessionCleanupStatus {
97+ Active ,
98+ Stopping ,
99+ Settled ,
100+ }
101+
94102#[ derive( Debug , Deserialize ) ]
95- #[ serde( tag = "kind" , rename_all = "kebab-case" ) ]
103+ #[ serde( tag = "kind" , rename_all = "kebab-case" , deny_unknown_fields ) ]
96104pub ( super ) enum BridgeResponse {
97105 #[ serde( rename_all = "camelCase" ) ]
98106 Loaded {
@@ -107,6 +115,12 @@ pub(super) enum BridgeResponse {
107115 protocol_version : u64 ,
108116 capabilities : Vec < String > ,
109117 } ,
118+ #[ serde( rename_all = "camelCase" ) ]
119+ OwnedSessionCleanup {
120+ v : u8 ,
121+ id : u64 ,
122+ status : OwnedSessionCleanupStatus ,
123+ } ,
110124 Shutdown {
111125 v : u8 ,
112126 id : u64 ,
@@ -124,6 +138,7 @@ impl BridgeResponse {
124138 let ( version, id) = match self {
125139 Self :: Loaded { v, id, .. }
126140 | Self :: Ready { v, id, .. }
141+ | Self :: OwnedSessionCleanup { v, id, .. }
127142 | Self :: Shutdown { v, id, .. }
128143 | Self :: Error { v, id, .. } => ( * v, * id) ,
129144 } ;
@@ -193,4 +208,39 @@ mod tests {
193208 } ;
194209 assert ! ( response. validate_meta( 1 ) . is_err( ) ) ;
195210 }
211+
212+ #[ test]
213+ fn cleanup_status_is_bounded_and_metadata_is_correlated ( ) {
214+ for ( wire, expected) in [
215+ ( "active" , OwnedSessionCleanupStatus :: Active ) ,
216+ ( "stopping" , OwnedSessionCleanupStatus :: Stopping ) ,
217+ ( "settled" , OwnedSessionCleanupStatus :: Settled ) ,
218+ ] {
219+ let bytes = format ! (
220+ r#"{{"v":{CONTROL_VERSION},"id":7,"kind":"owned-session-cleanup","status":"{wire}"}}"#
221+ ) ;
222+ let response: BridgeResponse = serde_json:: from_str ( & bytes) . unwrap ( ) ;
223+ assert ! ( response. validate_meta( 7 ) . is_ok( ) ) ;
224+ assert ! ( matches!(
225+ response,
226+ BridgeResponse :: OwnedSessionCleanup { status, .. } if status == expected
227+ ) ) ;
228+ }
229+
230+ let unknown = format ! (
231+ r#"{{"v":{CONTROL_VERSION},"id":7,"kind":"owned-session-cleanup","status":"/private/native-id"}}"#
232+ ) ;
233+ assert ! ( serde_json:: from_str:: <BridgeResponse >( & unknown) . is_err( ) ) ;
234+ let injected = format ! (
235+ r#"{{"v":{CONTROL_VERSION},"id":7,"kind":"owned-session-cleanup","status":"settled","raw":"/private/native-id"}}"#
236+ ) ;
237+ assert ! ( serde_json:: from_str:: <BridgeResponse >( & injected) . is_err( ) ) ;
238+
239+ let response = BridgeResponse :: OwnedSessionCleanup {
240+ v : CONTROL_VERSION ,
241+ id : 7 ,
242+ status : OwnedSessionCleanupStatus :: Settled ,
243+ } ;
244+ assert ! ( response. validate_meta( 8 ) . is_err( ) ) ;
245+ }
196246}
0 commit comments