You just have to pass the ICE candidates somehow. It doesn't have to be through a signaling server, the possibilities are endless.
But have you seen https://quiet.github.io/quiet-js/? It is the only of these libraries that I could make work here (although I had to move the transmitter and the receiver very closer to each other).