1- use std:: { collections:: HashMap , sync:: Arc } ;
1+ use std:: {
2+ collections:: HashMap ,
3+ hash:: { BuildHasher , Hash } ,
4+ sync:: Arc ,
5+ } ;
26
37use contextforge_gateway_rs_apis:: user_store:: VirtualHost ;
48use tokio:: sync:: Mutex ;
@@ -7,6 +11,32 @@ use tracing::{debug, info};
711use super :: mcp_gateway:: { BackendTransportKey , BackendTransportService , ServiceHolder } ;
812use crate :: layers:: session_id:: SessionId ;
913
14+ pub fn borrow_transport_entry < K , V , Service , Hasher > (
15+ transports : & mut HashMap < K , V , Hasher > ,
16+ key : & K ,
17+ service_slot : impl FnOnce ( & mut V ) -> & mut Option < Service > ,
18+ ) -> Option < Option < Service > >
19+ where
20+ K : Eq + Hash ,
21+ Hasher : BuildHasher ,
22+ {
23+ transports. get_mut ( key) . map ( |entry| service_slot ( entry) . take ( ) )
24+ }
25+
26+ pub fn return_transport_entry < K , V , Service , Hasher > (
27+ transports : & mut HashMap < K , V , Hasher > ,
28+ key : & K ,
29+ running_service : Option < Service > ,
30+ service_slot : impl FnOnce ( & mut V ) -> & mut Option < Service > ,
31+ ) where
32+ K : Eq + Hash ,
33+ Hasher : BuildHasher ,
34+ {
35+ if let Some ( entry) = transports. get_mut ( key) {
36+ * service_slot ( entry) = running_service;
37+ }
38+ }
39+
1040pub struct SessionManager < ' a > {
1141 virtual_host : & ' a VirtualHost ,
1242 session_id : & ' a SessionId ,
@@ -32,9 +62,9 @@ impl<'a> SessionManager<'a> {
3262 names
3363 . into_iter ( )
3464 . filter_map ( |name| {
35- transports
36- . get_mut ( & BackendTransportKey :: from ( ( & name , self . session_id ) ) )
37- . map ( |b | ServiceHolder :: new ( name, b . service . take ( ) ) )
65+ let key = BackendTransportKey :: from ( ( & name , self . session_id ) ) ;
66+ borrow_transport_entry ( & mut transports , & key , |entry| & mut entry . service )
67+ . map ( |service | ServiceHolder :: new ( name, service) )
3868 } )
3969 . collect ( )
4070 }
@@ -44,9 +74,8 @@ impl<'a> SessionManager<'a> {
4474 info ! ( "Returning transports {:?} {backend_transports:?}" , self . session_id) ;
4575 let mut transports = self . transports . lock ( ) . await ;
4676 for svc_holder in backend_transports {
47- transports
48- . entry ( BackendTransportKey :: from ( ( & svc_holder. name , self . session_id ) ) )
49- . and_modify ( |e| e. service = svc_holder. running_service ) ;
77+ let key = BackendTransportKey :: from ( ( & svc_holder. name , self . session_id ) ) ;
78+ return_transport_entry ( & mut transports, & key, svc_holder. running_service , |entry| & mut entry. service ) ;
5079 }
5180 }
5281
0 commit comments