pub struct WsProxy { /* private fields */ }Expand description
WebSocket reverse proxy with round-robin load balancing.
Accepts HTTP/1.1 WebSocket upgrade requests and tunnels traffic to one of the configured backends.
Backend URL schemes:
"host:port"— plain TCP (no scheme)"ws://host:port"— plain TCP (port defaults to 80)"wss://host:port"— TLS (port defaults to 443); requires thehttp-clientorhttp2Cargo feature
Call WsProxy::bind to start. It blocks the calling thread indefinitely.
Implementations§
Source§impl WsProxy
impl WsProxy
Sourcepub fn new<I, S>(backends: I) -> Self
pub fn new<I, S>(backends: I) -> Self
Create a proxy that distributes connections across backends in
round-robin order. Every backend is treated as always live — no
health check is attached; use the config-driven proxy’s
[ws_proxy.health_check] for that.
Each entry may be "host:port", "ws://host:port", or
"wss://host:port". wss:// requires the http-client or http2
Cargo feature.
Sourcepub fn with_live_backends(
all_backends: Vec<String>,
live: Arc<RwLock<Vec<String>>>,
) -> Self
pub fn with_live_backends( all_backends: Vec<String>, live: Arc<RwLock<Vec<String>>>, ) -> Self
Build a proxy whose live-backend list is externally managed —
live is shared with (and expected to be updated by) a health
checker you run yourself, on whatever schedule and probe logic you
choose. all_backends is the full configured list, used only for
bind()’s empty-configuration check; round-robin only ever picks
from live.
This is what the config-driven proxy’s [ws_proxy.health_check]
uses internally (see proxy_config::health::start_health_checker),
exposed directly for library users who want WS backend health
checking without the config file — e.g. a custom probe that performs
a real WebSocket handshake rather than a plain HTTP GET.
use std::sync::{Arc, RwLock};
use rust_web_server::ws_proxy::WsProxy;
let all = vec!["ws://chat-a:9000".to_string(), "ws://chat-b:9000".to_string()];
let live = Arc::new(RwLock::new(all.clone()));
// Run your own probe loop on another thread, writing into `live`:
let checker_live = Arc::clone(&live);
std::thread::spawn(move || loop {
std::thread::sleep(std::time::Duration::from_secs(10));
// *checker_live.write().unwrap() = probe_and_filter(&all);
let _ = &checker_live;
});
WsProxy::with_live_backends(all, live)
.bind("0.0.0.0:8080")
.expect("WS proxy failed");Sourcepub fn connect_timeout_ms(self, ms: u64) -> Self
pub fn connect_timeout_ms(self, ms: u64) -> Self
Override the TCP connect timeout to each backend (default: 5 s).
Sourcepub fn read_timeout_ms(self, ms: u64) -> Self
pub fn read_timeout_ms(self, ms: u64) -> Self
Override the idle read timeout on client connections (default: 30 s).
For wss:// backends this controls the outer idle timeout on the
client side; the internal polling interval is fixed at 5 ms.
Auto Trait Implementations§
impl Freeze for WsProxy
impl RefUnwindSafe for WsProxy
impl Send for WsProxy
impl Sync for WsProxy
impl Unpin for WsProxy
impl UnsafeUnpin for WsProxy
impl UnwindSafe for WsProxy
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more