Took a deep breath and switched completely to nats. This gave me:
ditched webrtc (that was a huge chunk)
no more signaling server for webrtc
ros2 is gone (lots of code)
weird build scripts for running ros2 in docker and locally are gone
now the client uses websocket and nats
access to all topics on the client
no custom message building
video is sent as frames in separate messages
everything works great in docker and gets monitored with standard tools like prometheus and influxdb
robot nodes can be in any language including typescript
codebase is much smaller now, no weird autogenerated files, everything is clean and tidy
dropping ros2 was the best decision
almost all libraries for image processing, slam and navigation are available as libraries and not tied to ros2 so it won't block using them
downside — had to drop foxglove, but I think I'll try to write a bridge for it