Example plugins for xturn:
Xirsys.XTurn.Plugin.Guard— active relay-abuse guard: RFC 7983 first-byte demux plus an RTP payload-type allowlist. Drop-only; never rewrites frames, since any header rewrite would invalidate an SRTP auth tag.Xirsys.XTurn.Plugin.Metrics— passive per-allocation QoS and metering exporter: packet/byte counters, per-SSRC loss/duplicate/reorder counts via extended RTP sequence numbers (RFC 3550 A.1/A.3), RFC 3550 §6.4.1 interarrival jitter, and framing mix (ChannelData vs. Send/Data Indication).
Each plugin implements the Xirsys.XTurn.Plugin
behaviour from xturn_plugin_api — this package depends only on that contract, not on
xturn itself, so it builds and tests standalone. xturn can depend on it directly (as
a normal, non-circular dependency) to make these plugins available.
Usage
Add as a dependency, then configure in your xturn config:
defp deps do
[
{:xturn_plugins, "~> 0.1.0"}
]
endconfig :xturn,
plugins: [
{Xirsys.XTurn.Plugin.Guard, mode: :monitor, payload_types: [0, 8]},
{Xirsys.XTurn.Plugin.Metrics, flush_ms: 5_000}
]Guard defaults to :monitor (telemetry only, never drops) so it's safe to deploy
before switching to :enforce. Its default payload_types: [0, 8] covers PCMU/PCMA;
set it explicitly for WebRTC deployments using dynamic payload types (Opus, VP8, etc.).
Tests
cd xturn-plugins
mix test
Tests drive each plugin's callbacks directly (init/2, handle_frame/3,
handle_close/2, ...) against xturn_plugin_api's Allocation/Frame structs, the
same way xturn's plugin runtime would. No dependency on xturn itself is needed to
build or test this package.