Isn't it possible to use the relay to initiate a direct connection between the two clients, instead of transferring the data itself?
The challenges with Croc here are largely the same, but with data as the media instead of voice or video. (Although, “VoIP” can also handle data in this way. See WebRTC data channels.)
I suppose you could try that, and fall back on full data relaying when it doesn't work. Should save a lot of bandwidth.
Of course, that might be a lot of work to implement, not saying it's easy!
1. Try various techniques that might trick the firewalls on both ends to let the connection through. This requires a relay for the initial negotiation only.
2. If (1) fails, then use a relay for everything.
When connection is possible, is my understanding that croc connects directly