Every procedure on a wRPC server answers on every carrier below, with the same rooms and sessions behind it — a browser on a WebSocket or on HTTP/3, a page behind a proxy that only speaks HTTP, another browser over WebRTC, another service through Kafka. The handler never knows which; the client picks per connection, with a fallback list where it wants one, and an app can talk to several backends at once.
Compression and encryption are off until you turn them on; encryption here is the layer above TLS, never in place of it. The full matrix — how each transport is chosen, and which carry bytes inside a packet — is in Client › Transports.
wRPC's whole call path — router, validation, access check, correlation — against the frameworks that do the same job, one machine, over a WebSocket (gRPC over HTTP/2). Switch the metric: wRPC leads with calls in flight and at 10 KB, and is level with socket.io one small call at a time. Over plain HTTP, fastify answers about a tenth more requests than wRPC does, and express about a fifth fewer — Performance has that too, with raw sockets, every transport, and how to reproduce each number.
RPC frameworks, calls per secondcalls/s · higher is better
wRPC — batch: true201,075
wRPC — own WebSocket116,704
socket.io (emitWithAck)101,455
tRPC (wsLink)23,310
gRPC (grpc-js, HTTP/2)20,921
Node v24.14.1 · Apple M3 Max · loopback · one run (3 October 2026) · bench/rpc-comparison.js