@@ -4,6 +4,17 @@ use super::inspector::*;
44use super :: websocket:: { closing_websocket_handler, websocket_inspector_token} ;
55use super :: * ;
66
7+ /// Aborts the wrapped task on drop. Ensures the overlay task cannot outlive
8+ /// the websocket handler even if `on_close` never fires (for example when the
9+ /// handler is dropped due to actor teardown rather than a clean close frame).
10+ struct AbortOnDropTask ( JoinHandle < ( ) > ) ;
11+
12+ impl Drop for AbortOnDropTask {
13+ fn drop ( & mut self ) {
14+ self . 0 . abort ( ) ;
15+ }
16+ }
17+
718impl RegistryDispatcher {
819 pub ( super ) async fn handle_inspector_websocket (
920 self : & Arc < Self > ,
@@ -32,7 +43,7 @@ impl RegistryDispatcher {
3243 // Forced-sync: inspector websocket slots are filled/cleared inside
3344 // synchronous callback setup/teardown and moved out before awaiting.
3445 let subscription_slot = Arc :: new ( Mutex :: new ( None :: < InspectorSubscription > ) ) ;
35- let overlay_task_slot = Arc :: new ( Mutex :: new ( None :: < JoinHandle < ( ) > > ) ) ;
46+ let overlay_task_slot = Arc :: new ( Mutex :: new ( None :: < AbortOnDropTask > ) ) ;
3647 let attach_guard_slot = Arc :: new ( Mutex :: new ( None :: < InspectorAttachGuard > ) ) ;
3748 let on_open_instance = instance. clone ( ) ;
3849 let on_open_dispatcher = dispatcher. clone ( ) ;
@@ -64,9 +75,7 @@ impl RegistryDispatcher {
6475 let mut guard = slot. lock ( ) ;
6576 guard. take ( ) ;
6677 let mut overlay_guard = overlay_slot. lock ( ) ;
67- if let Some ( task) = overlay_guard. take ( ) {
68- task. abort ( ) ;
69- }
78+ overlay_guard. take ( ) ;
7079 let mut attach_guard = attach_slot. lock ( ) ;
7180 attach_guard. take ( ) ;
7281 } )
@@ -146,7 +155,7 @@ impl RegistryDispatcher {
146155 }
147156 } ) ;
148157 let mut overlay_guard = on_open_overlay_slot. lock ( ) ;
149- * overlay_guard = Some ( overlay_task) ;
158+ * overlay_guard = Some ( AbortOnDropTask ( overlay_task) ) ;
150159
151160 let listener_dispatcher = on_open_dispatcher. clone ( ) ;
152161 let listener_instance = on_open_instance. clone ( ) ;
@@ -356,9 +365,9 @@ impl RegistryDispatcher {
356365 inspector_protocol:: InitMessage {
357366 connections : inspector_wire_connections ( & instance. ctx ) ,
358367 state : Some ( instance. ctx . state ( ) ) ,
359- is_state_enabled : true ,
368+ is_state_enabled : instance . ctx . has_state ( ) ,
360369 rpcs : inspector_rpcs ( instance) ,
361- is_database_enabled : instance. ctx . sql ( ) . runtime_config ( ) . is_ok ( ) ,
370+ is_database_enabled : instance. ctx . sql ( ) . is_enabled ( ) ,
362371 queue_size : serde_bare:: Uint ( queue_size) ,
363372 workflow_history,
364373 is_workflow_enabled : workflow_supported,
@@ -374,7 +383,7 @@ impl RegistryDispatcher {
374383 inspector_protocol:: StateResponse {
375384 rid,
376385 state : Some ( instance. ctx . state ( ) ) ,
377- is_state_enabled : true ,
386+ is_state_enabled : instance . ctx . has_state ( ) ,
378387 }
379388 }
380389
0 commit comments