fix(websocket): retain WsPumps handle on the server path (WS-08)
This commit is contained in:
@@ -87,6 +87,7 @@ pub struct HttpAdapter {
|
||||
alpn: &'static [u8],
|
||||
router: Router,
|
||||
openapi_doc: CachedOpenAPIDoc,
|
||||
ws_sessions: Arc<crate::websocket::WsSessions>,
|
||||
}
|
||||
|
||||
impl HttpAdapter {
|
||||
@@ -111,11 +112,13 @@ impl HttpAdapter {
|
||||
) -> Self {
|
||||
let decoy = DecoyConfig::default();
|
||||
let openapi_doc = CachedOpenAPIDoc::new(®istry);
|
||||
let ws_sessions = Arc::new(crate::websocket::WsSessions::new());
|
||||
let state = RouterState {
|
||||
registry: Arc::clone(®istry),
|
||||
identity_provider: Arc::clone(&identity_provider),
|
||||
decoy: decoy.clone(),
|
||||
openapi_doc: openapi_doc.clone(),
|
||||
ws_sessions: Arc::clone(&ws_sessions),
|
||||
};
|
||||
let router = build_router(state, None);
|
||||
Self {
|
||||
@@ -126,6 +129,7 @@ impl HttpAdapter {
|
||||
alpn,
|
||||
router,
|
||||
openapi_doc,
|
||||
ws_sessions,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,6 +140,7 @@ impl HttpAdapter {
|
||||
identity_provider: Arc::clone(&self.identity_provider),
|
||||
decoy,
|
||||
openapi_doc: self.openapi_doc.clone(),
|
||||
ws_sessions: Arc::clone(&self.ws_sessions),
|
||||
};
|
||||
// `extra_routes` is borrowed, not consumed (SRV-05): a builder
|
||||
// call after `with_extra_routes` must keep the custom routes in
|
||||
@@ -151,12 +156,21 @@ impl HttpAdapter {
|
||||
identity_provider: Arc::clone(&self.identity_provider),
|
||||
decoy: self.decoy.clone(),
|
||||
openapi_doc: self.openapi_doc.clone(),
|
||||
ws_sessions: Arc::clone(&self.ws_sessions),
|
||||
};
|
||||
self.router = build_router(state, Some(routes.clone()));
|
||||
self.extra_routes = Some(routes);
|
||||
self
|
||||
}
|
||||
|
||||
/// The shared WS session registry (WS-08): live sessions'
|
||||
/// [`WsPumps`](crate::websocket::WsPumps) handles, evictable via
|
||||
/// `WsSessions::abort`. The upgrade handler registers against this
|
||||
/// instance.
|
||||
pub fn ws_sessions(&self) -> Arc<crate::websocket::WsSessions> {
|
||||
Arc::clone(&self.ws_sessions)
|
||||
}
|
||||
|
||||
pub fn decoy(&self) -> &DecoyConfig {
|
||||
&self.decoy
|
||||
}
|
||||
@@ -941,6 +955,7 @@ mod tests {
|
||||
identity_provider: idp,
|
||||
decoy: DecoyConfig::default(),
|
||||
openapi_doc: CachedOpenAPIDoc::new(&OperationRegistry::new()),
|
||||
ws_sessions: Arc::new(crate::websocket::WsSessions::new()),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user