XGW is a media gateway: it sits between a browser (or other WebRTC client) and your application so you do not have to implement ICE, DTLS, and SRTP yourself.
What problem this solves
Real-time audio/video on the public internet is not a plain TCP socket. Clients must:
- Find a working UDP (or TCP) path through NATs and firewalls (ICE).
- Authenticate each other and encrypt the path (DTLS).
- Protect media packets with short-lived keys (SRTP / SRTCP).
XGW terminates that stack per remote peer and delivers plaintext RTP/RTCP (and optional data-channel bytes) to a handler you register. Your app owns rooms, signaling (SIP/WebSocket/HTTP), and SDP answers -- the same split as an SFU such as Janus or mediasoup, or a SIP path with xsip and xsdp.
Main pieces
UDP/TCP Listener -- demux STUN / DTLS / media --> Peer GenServer
|
v
ICE then DTLS
|
v
SRTP decrypt/encrypt
|
v
your handler (RTP callbacks)XGW.Listener-- shared socket(s) and packet demux.XGW.Peer-- one remote endpoint's ICE/DTLS/SRTP lifecycle.XGW.ICE.*-- connectivity checks and candidate gathering.XGW.DTLS.*-- handshake transport and SRTP key export.XGW.SRTPSession-- encrypt/decrypt media after DTLS.
See ARCHITECTURE.md in this package for ICE-lite vs full, demux, and the
module map.
RFCs
Primary stack: RFC 8445 (ICE), RFC 8489 (STUN), RFC 8656 (TURN), RFC 9147 / RFC 6347 (DTLS), RFC 5764 (DTLS-SRTP), RFC 3711 (SRTP), RFC 7983 (demux), RFC 8866 (SDP). See child modules for narrower citations.