From 6e92e8153d293b747d7a55d7bc8c769ec45447a3 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 2 Apr 2026 03:08:17 +0000 Subject: [PATCH] feat: add default TURN servers for same-network call connectivity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add OpenRelay (metered.ca) free TURN servers to IceServerConfig as defaults alongside STUN. This fixes calls between devices on the same WiFi network where hairpin NAT isn't supported — the ~20% case where STUN-only fails. TURN servers on ports 80, 443, and 443/TCP to bypass corporate firewalls. Uses openrelayproject public credentials (20GB/month free tier). https://claude.ai/code/session_017hZm7yu7CzmcQgZGSaqSXS --- .../amethyst/service/call/IceServerConfig.kt | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/call/IceServerConfig.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/call/IceServerConfig.kt index b835989615..402a1bf7d5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/call/IceServerConfig.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/call/IceServerConfig.kt @@ -30,8 +30,27 @@ object IceServerConfig { PeerConnection.IceServer.builder("stun:stun.cloudflare.com:3478").createIceServer(), ) + val defaultTurnServers = + listOf( + PeerConnection.IceServer + .builder("turn:openrelay.metered.ca:80") + .setUsername("openrelayproject") + .setPassword("openrelayproject") + .createIceServer(), + PeerConnection.IceServer + .builder("turn:openrelay.metered.ca:443") + .setUsername("openrelayproject") + .setPassword("openrelayproject") + .createIceServer(), + PeerConnection.IceServer + .builder("turn:openrelay.metered.ca:443?transport=tcp") + .setUsername("openrelayproject") + .setPassword("openrelayproject") + .createIceServer(), + ) + fun buildIceServers(userTurnServers: List = emptyList()): List { - val servers = defaultStunServers.toMutableList() + val servers = (defaultStunServers + defaultTurnServers).toMutableList() userTurnServers.forEach { turn -> servers.add( PeerConnection.IceServer