WebRTC data channels are basically “UDP on the web” but they have lots of controls to change how reliable they are, so they can be used as TCP style connections as well.
I still don’t fully understand why more people don’t use them over something like QUIC. (I think I’ve asked this question before here, but I wasn’t really satisfied with the answers)
I sadly switched off of using them, but mostly because the ecosystem around there is super underdeveloped compared to the ecosystem around QUIC/quinn. There is a LOT of boilerplate involved that feels unnecessary.
But, if you’re making a multiplayer game in the web, it’s basically the best technology to use cuz it already works. And if you use a library like libdatachannel or pion, you could make the game in Go or C++ and compile it for both Steam and the web!
Here’s a project I did with them that shows off compiled for both web and desktop: https://github.com/ValorZard/gopher-combat
* https://github.com/shinyoshiaki/werift-webrtc (Typescript)
* https://github.com/pion/webrtc (Golang)
* https://github.com/webrtc-rs/webrtc (Rust)
* https://github.com/algesten/str0m (Rust)
* hhttps://github.com/sepfy/libpeer (C/Embedded)
* https://webrtc.googlesource.com/src/ (C++)
* https://github.com/sipsorcery-org/sipsorcery (C#)
* https://github.com/paullouisageneau/libdatachannel (C++)
* https://github.com/elixir-webrtc (Elixir)
* https://github.com/aiortc/aiortc (Python)
* GStreamer’s webrtcbin (C)
See https://github.com/sipsorcery/webrtc-echoes for examples of some running against each other.
And everyone else has to play catch-up.
A big source of the drift is having a common library for SDP parsing, but also necessary features like BWE, different encodings, etc.
For example, aiortc, python's WebRTC implementation, isn't quite at the level most would want. It isn't necessarily easy to tell, without clear benchmarks, which implementation is at-par with Google's.
aiortc is good enough to empower lots of businesses/projects! If anything comes up that really is a show stopper it will get addressed.
But it is a great starting point for anyone working in C#.
Dealing with NAT traversal especially with full-cone NATs is difficult and expensive - you have to maintain dedicated infrastructure of TURN servers for NAT and you have to proxy all your traffic through that, it's quite the overhead, especially since IPv4 addresses and bandwidth on AWS don't come cheap.
P2P connections are also often blocked by ISPs for whatever reason, making it impossible to use without a fallback TURN server which defeats the entire purpose of the thing if you wanted to do scalable multiplayer without the server infrastructure. You're left sending over the whole stream with double the latency and have to eat all the bandwidth.
> the ecosystem around there is super underdeveloped compared to the ecosystem around QUIC/quinn
> There is a LOT of boilerplate involved that feels unnecessary
I think you just answered your own question and even gave the answers I would've given.
If you want unordered/non-sequential it could help.
If you don’t care about those things could be more work for no value.
WebRTC is absolutely magical. Having 'Web' in the name does it a disservice. I see it used to.
* Remotely control excavators
* Security Cameras
* Connect autonomous robots in factories
* Low latency streaming from sail boats and rocket ships
* And all the use cases you expect (Conferencing, Telehealth etc..)
I share the view that it should form the basis of real time communication, humans involved or not, and a/v media involved or not. There seems to be some progress on applying absolute timestamps to frames, for example, however, at some point if we want to have rocket ships using it (and I do too) we will eventually need to have some way to reconcile divergent clocks used at different sources!
Sean is modestly not mentioning Pion here, which is the lower level library many golang people reach to for webrtc components, and deservedly so.
My experience of it in Java/C++/Golang is in every case you have to deal with all the problems far more upfront before any of it works at all. And JS doesn't have the multithreaded aspect to handle, which is also the major weakness as it eliminates the extensability in that environment.
I have a sort of proof of concept level SFU in golang, with a simple TypeScript/React client, and the whole client is this: https://github.com/atomirex/umbrella/blob/master/frontend/sr... and most of the complexity there is because I can never remember if track ID or transceiver MID should be used in different situations!
I have done native mobile libwebrtc work, and that's several other levels of complexity from all this, but with that you can do things like hardware accelerated neural net integration quite easily because of how it's all structured.
I seem to recall one browser always prefixes the buffers with sequence numbers, for example. Really fun stuff like that, but I would hope that is history by now.
My preference would be to use the standard webrtc api, and then use a polyfill style library for uniform behaviour if you don't want to worry about it (which it sounds like simple-peer might be).
In the event you want a much higher level API and pre-rolled signalling server etc. my go to recommendation on that would be https://livekit.io/ which I am not affiliated with, but I tend to think people starting out should try that and then be able to explain why they're not using it, much in the same way I would expect a game dev to try using Unreal and have a good reason if they aren't planning on using it.
WebRTC's complexity can be frustrating. I believe it is inherent to how many things it is trying to solve. If an alternative arrives that solves everything WebRTC does, it will end up being just as complex.
Or maybe not! Time will tell.
I think the 'What, Why and How' captures the purpose and joy of learning. Nothing is better then getting lost in a fun problem. I don't want to just understand how it is solved, but the story about how it got solved.
If you have any feedback on how the book could be better would love to hear!
I ended up adopting code from the High Performance Browser Networking book and some code examples by Google that were written like 8 years ago. It was painful to replace the outdated APIs with new ones and rewrite in TypeScript, but I eventually did it.
https://github.com/adhamsalama/webrtc/
Then I used it with WebAssembly to run a distributed SQLite database in the browser for peer-to-peer collaboration.
https://github.com/adhamsalama/sqlite-wasm-webrtc
Probably the coolest projects I have ever done, and they contain almost no backend code at all (I am a backend dev).
If you are ever back in WebRTC land would loved to help https://pion.ly/discord
The book is vendor agnostic. I wanted it to be timeless and vendor agnostic.
The lack of code made all publishers I approached reject it :( I would love to see a hard copy someday.
I had hoped if I put no code in it the WebRTC community would feel more comfortable with it. If I made it Pion specific, would greatly reduce its reach.
Don't the WebRTC APIs exist in all browsers?
I was afraid if I pushed any software in particular it would dissuade other groups from using it
https://www.reddit.com/r/WebRTC/comments/1jwwfj5/quanta_chat...
It mentions Nostr, and makes me realize both Nostr and WebRTC can work well together. I haven't checked, but I'd guess there are Nostr apps using WebRTC to send Nostr messages around. I mean Nostr is basically just a crypto-signed JSON object.
So you can have a remote peer and try to contact it via UDP/TCP/TLS. You can even attempt via multiple interfaces (Wifi and 5G).
You can then measure the packet loss/latency across these different paths and figure out which one is best.
Dependent on the firewall, but most I have seen allow NAT mapping with different behaviors.