Classes as contracts
The server exposes a live instance; the client gets a typed proxy of the same class. No code generation, no schema files required — and a schema when you want arguments checked.
A browser tab, a Node service, and a plant full of devices — over socket.io and MQTT 5. A class is the contract.