bare websockets - #6932
Conversation
Merging this PR will not alter performance
Performance Changes
Comparing Footnotes
|
Greptile SummaryThe PR replaces the default Socket.IO transport with a lightweight plain-WebSocket protocol, retains Socket.IO as an optional transport, and migrates test serving to Granian.
Confidence Score: 3/5The PR does not yet appear safe to merge because linked clients can still generate unrestricted version-mismatch warnings through repeated reconnects. The current connection path logs every linked version mismatch without applying the shared process-wide logging budget, leaving the previously reported backend log-exhaustion path outstanding. Files Needing Attention: reflex/event_namespace.py
|
| Filename | Overview |
|---|---|
| reflex/event_namespace.py | Implements the plain-WebSocket backend protocol and closes malformed event frames, but the previously reported version-mismatch warning remains outside the shared logging budget. |
| packages/reflex-base/src/reflex_base/.templates/web/utils/helpers/websocket.js | Implements the lightweight browser transport, with the previously requested human-readable timeout and unit documentation now present. |
| packages/reflex-base/src/reflex_base/.templates/web/utils/state.js | Selects the plain or optional Socket.IO transport and adds lifecycle cleanup for asynchronous connection setup. |
| reflex/utils/exec.py | Updates backend launch paths for Granian and optional Uvicorn WebSocket serving. |
| reflex/testing.py | Migrates AppHarness to an embedded Granian server and updates readiness and cleanup behavior. |
| pyproject.toml | Moves Socket.IO and Uvicorn-related dependencies into optional extras for the new default transport. |
| tests/units/test_event_namespace.py | Exercises connection validation, malformed-frame closure, UTF-8 byte limits, heartbeat behavior, and event dispatch. |
Reviews (31): Last reviewed commit: "only warn about version mismatch for lin..." | Re-trigger Greptile
There was a problem hiding this comment.
All reported issues were addressed across 19 files
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
…ace, awaited disconnect cleanup; revert server-wide ws_max_size
There was a problem hiding this comment.
All reported issues were addressed across 17 files
Requires human review: Auto-approval blocked because this review re-detected 1 unresolved issue already reported by Cubic.
Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 4 files (changes from recent commits).
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
… message shape, log protocol closes; add transport benchmarks
…cut client watchdog churn
There was a problem hiding this comment.
All reported issues were addressed across 4 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 6 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
…icorn] extra with gunicorn
There was a problem hiding this comment.
All reported issues were addressed across 6 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 1 file (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 2 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 2 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
…ayer via ws_max_size make greptile happy
|
I really like this lightweight approach 👍 . |
Thanks 🙏 Yes, the new bare websockets implementation does not support http long-polling yet. However one could still choose the old socketio based transport to archive this. Also iirc longpolling was disabled by default anyway, i guess not a lot of users use it. If this is really needed i could add support to our bare websockets implementation as well. |
saves ~11.6 KB gz / ~41 KB raw frontend size (a small js chunk replaces whole socketio)
dropped python deps: wsproto, simple-websocket, python-socketio, python-engineio, bidict
new benchmarks in test_event_transport.py show about 2x performance increase compared to socketio
also migrates AppHarness to granian for consistency. otherwise downstream tests using AppHarness still need uvicorn and wsproto/websockets