Documents the new DDP_TRANSPORT environment variable with available
transports (sockjs, uws), usage examples, and tradeoffs.
Updates DISABLE_SOCKJS to note it is equivalent to DDP_TRANSPORT=uws
and recommends the new variable instead.
Adds a dedicated CI workflow that runs ddp-server tests on both
sockjs and uws transports via a matrix strategy.
This is a lightweight job (~10 min) separate from the main test suite
to avoid doubling CI time. It ensures both transport backends pass
the full ddp-server test suite on every PR.
- Use const/let instead of var
- Use WeakMap instead of Map for socket listeners to prevent memory leaks
- Write 502 Bad Gateway response before destroying socket on proxy error
- Wire up idleTimeout setting in uWS config
Minimal fix: only _callStopCallbacks becomes async, _deactivate uses
.then() to clear _session and _documents after callbacks complete.
No async propagation up the call stack.
Addresses review feedback: avoid async/await snowball, use this instead
of self, keep changes contained to the subscription cleanup level.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove faye and ws transports as agreed with maintainer.
DISABLE_SOCKJS=1 now resolves to uws instead of faye.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Refactor the DDP transport layer into a pluggable architecture where
transports are isolated modules behind a common interface. This allows
benchmarking and comparing different WebSocket implementations on the
same build, same Node version, same machine.
Available transports (selectable via DDP_TRANSPORT env var or settings):
- sockjs: SockJS (current default, backward compatible)
- faye: faye-websocket (direct WebSocket, no SockJS overhead)
- ws: ws npm package (most popular Node.js WebSocket library)
- uws: uWebSockets.js (C++ high-performance transport)
Client-side: when transport != sockjs, SockJS is never loaded (dynamic
import), saving ~57 KB from the client bundle. Native WebSocket is used
instead.
Configuration:
- DDP_TRANSPORT=ws (env var)
- settings.packages['ddp-server'].transport = 'ws'
- DISABLE_SOCKJS=1 still works (resolves to 'faye')
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add documentation page for dupontbertrand:cluster, a Meteor 3
compatible fork of meteorhacks:cluster
- Add entry to community packages index under new Scaling / Clustering
category
- Add sidebar navigation entry
The CSS Modules setup was missing from the rspack documentation,
causing confusion for users trying to use .module.css files with
TypeScript projects.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PR #14206 replaced the static SockJS import with a dynamic import()
inside _launchConnection(), adding ~110 ms latency to every DDP
connection for apps using the default SockJS transport. This restores
the static import while keeping all DISABLE_SOCKJS=1 functionality
(runtime WebSocket path selection) intact.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
AGENTS.md listed `./meteor test-packages` but not the headless
alternative. That command starts a web server and waits for a browser,
producing no terminal output, which causes LLM agents to hang.
Add `./packages/test-in-console/run.sh` alongside the existing
test-packages command in AGENTS.md with a note explaining the
difference. Also add package name examples and the PUPPETEER_DOWNLOAD_PATH
hint to the testing skill.
When puppeteer was bumped from 20.4.0 to 23.6.0 in d8c8c3db77,
the ConsoleMessage class switched from underscore-prefixed _text
property to ES2022 private #text field, accessible only via
msg.text(). The runner code was never updated, so msg._text is
always undefined and test output silently falls through to the
else branch, printing only "Test number: N" with no actual test
results.
The text variable from msg.text() is already computed on line 15
for the Permissions policy filter — reuse it instead of the
broken msg._text.