This caddy config seems to work perfectly:
example.com {
@websockets {
header Connection *Upgrade*
header Upgrade websocket
}
reverse_proxy /cable 127.0.0.1:3000
reverse_proxy @websockets 127.0.0.1:6042
reverse_proxy 127.0.0.1:3000
encode zstd gzip
}