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 while retaining Socket.IO as an optional transport.
Confidence Score: 5/5The PR appears safe to merge. No blocking failure remains.
|
| Filename | Overview |
|---|---|
| reflex/event_namespace.py | Implements the plain-WebSocket event namespace and now closes malformed or invalid event streams without leaving the previously reported log-flood paths open. |
| packages/reflex-base/src/reflex_base/.templates/web/utils/helpers/websocket.js | Adds the browser transport with framing, heartbeat monitoring, connection timeout handling, and documented human-readable durations. |
| packages/reflex-base/src/reflex_base/.templates/web/utils/state.js | Selects the plain-WebSocket or optional Socket.IO client and adds connection/unmount lifecycle cleanup. |
| reflex/app.py | Registers the direct WebSocket route by default and lazily initializes the optional Socket.IO transport. |
| reflex/utils/exec.py | Updates backend launch paths and Uvicorn WebSocket sizing for the new transport configuration. |
| packages/reflex-base/src/reflex_base/event/processor/event_processor.py | Forks the root event context for streaming deltas so unrelated events cannot attach to a completed future. |
| pyproject.toml | Moves Socket.IO and Uvicorn support into optional extras and updates the Granian dependency. |
| tests/units/test_event_namespace.py | Covers WebSocket protocol handling, byte-size enforcement, malformed payload closure, and event routing. |
Reviews (21): Last reviewed commit: "Merge remote-tracking branch 'upstream/m..." | 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