Handle WebSocket backpressure: log lagged clients, increase buffer

- Increase broadcast channel capacity 256→1024
- Handle RecvError::Lagged in WS handler: log warning with drop count
  instead of silently ignoring. Connection stays alive.
- Remove resolved tasks from TASKS.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
main
Regela 1 day ago
parent 0e29569770
commit 5ccf92e4a2

@ -30,9 +30,6 @@ No Makefile or build automation exists. Need a script for:
## Medium
### Implement WebSocket backpressure
`bridge.rs` broadcast channel has capacity 256. Events are silently dropped when full. Should either increase capacity, add warning logging, or implement backpressure.
### Improve fallback JSON encoder
`rgl_framework.lua` fallback JSON decoder only handles flat `{"key":"value"}` — fails on nested objects, arrays, numbers, booleans. Since cjson is always expected to be present, consider making it a hard requirement instead of silently degrading.
@ -63,9 +60,6 @@ No protection against API spam. Could add simple per-endpoint rate limits.
### Add request/response logging middleware
No HTTP access logging in Rust. Add optional access log for debugging API calls.
### Optimize broadcast channel capacity
Current 256 capacity is arbitrary. Profile actual event rates and set appropriately.
### Add module versioning
No way to track which version of a module is loaded. Could add `M.version` field and display in admin panel.

@ -66,7 +66,7 @@ fn lock_or_recover<T>(mutex: &Mutex<T>) -> MutexGuard<'_, T> {
/// Initialize the event broadcast channel. Called once from server::start.
pub fn init_event_channel() -> tokio::sync::broadcast::Receiver<EventMessage> {
let (tx, rx) = tokio::sync::broadcast::channel(256);
let (tx, rx) = tokio::sync::broadcast::channel(1024);
*lock_or_recover(&state().event_tx) = Some(tx);
rx
}

@ -283,7 +283,9 @@ async fn handle_ws(mut socket: WebSocket) {
loop {
tokio::select! {
Ok(event) = event_rx.recv() => {
result = event_rx.recv() => {
match result {
Ok(event) => {
let json = serde_json::json!({
"type": "event",
"event": event.event,
@ -294,6 +296,13 @@ async fn handle_ws(mut socket: WebSocket) {
break;
}
}
Err(tokio::sync::broadcast::error::RecvError::Lagged(n)) => {
logging::log("WARN", "WS", &format!("client lagged, {n} events dropped"));
continue;
}
Err(_) => break, // channel closed
}
}
msg = socket.recv() => {
match msg {
Some(Ok(Message::Text(text))) => {

Loading…
Cancel
Save