1amageek/swift-webrtc
WebRTC data channels in pure Swift
Requirements
- Swift 6.2+
- macOS 15+ / iOS 18+ / tvOS 18+ / watchOS 11+ / visionOS 2+
Installation
dependencies: [
.package(url: "https://github.com/1amageek/swift-webrtc.git", from: "0.0.1"),
]Architecture
The library is split into independent modules:
| Module | Description | RFC | |---|---|---| | STUNCore | STUN message encoding/decoding, MESSAGE-INTEGRITY, FINGERPRINT | RFC 5389 | | ICELite | ICE Lite agent for server-side connectivity checks | RFC 8445 | | SCTPCore | SCTP association, chunk encoding/decoding, stream management | RFC 4960 | | DataChannel | Data channel lifecycle, DCEP (open/ack) messages | RFC 8831 | | WebRTC | Top-level API integrating all layers | — |
DTLS is provided by swift-tls.
Usage
Creating an endpoint
import WebRTC
let endpoint = try WebRTCEndpoint.create()
print(endpoint.localFingerprint.sdpFormat)Client
let connection = try endpoint.connect(
remoteFingerprint: remoteFingerprint,
sendHandler: { data in
// Send raw bytes over UDP
}
)
connection.setRemoteICECredentials(ufrag: remoteUfrag, password: remotePassword)
try connection.start()
let channel = try connection.openDataChannel(label: "data")
try connection.send(payload, on: channel.id)Server
let listener = try endpoint.listen()
for await connection in listener.connections {
try connection.start()
for await channel in connection.incomingChannels {
print("Channel opened: \(channel.label)")
}
}Design
- Transport-agnostic — Callers provide a
SendHandlerclosure and feed incoming bytes viareceive(_:). This allows integration with any UDP transport. - Sendable — All public types conform to
Sendable. Thread safety is achieved usingMutex<T>. - Modular — Each protocol layer is a standalone library that can be used independently.
Benchmarks
Performance benchmarks are included under Tests/PerformanceTests/. Each module has a dedicated benchmark suite:
| Suite | Coverage | |---|---| | SCTPBenchmarks | CRC-32C, packet encode/decode, TSN tracking, fragment assembly | | STUNBenchmarks | Message encode/decode, FINGERPRINT, MESSAGE-INTEGRITY | | ICEBenchmarks | STUN request processing, credential generation, peer validation | | DataChannelBenchmarks | DCEP encode/decode, channel open/lookup |
Running benchmarks
# All benchmarks (debug)
swift test --filter PerformanceTests
# All benchmarks (release — recommended for accurate numbers)
swift test -c release --filter PerformanceTests
# Single suite
swift test -c release --filter SCTPBenchmarksRelease mode is strongly recommended. Debug builds include bounds checks and disable compiler optimizations, resulting in measurements that do not reflect production performance.
Key results (Apple Silicon, release build)
| Operation | Throughput | |---|---| | CRC-32C (1500 B) | 2.7 GB/s | | SCTP packet encode | 845K ops/s | | SCTP packet decode | 1.5M ops/s | | TSN gap block computation | 577K ops/s | | STUN FINGERPRINT compute | 2.9M ops/s | | Fragment assembly (multi-chunk) | 526K ops/s |
CRC-32C uses a slicing-by-8 lookup table algorithm. Checksum validation avoids packet-level copies by computing the CRC with the checksum field treated as zeros in-place.
License
MIT
Package Metadata
Repository: 1amageek/swift-webrtc
Stars: 2
Forks: 0
Open issues: 0
Default branch: main
Primary language: swift
README: README.md