diff options
| author | Christophe Besson <cbesson@gmail.com> | 2026-09-04 14:51:08 +0200 |
|---|---|---|
| committer | Christophe Besson <cbesson@gmail.com> | 2026-09-04 14:51:08 +0200 |
| commit | 08b0f8d7c457e5e58a31bea2b2e43c9f398a6923 (patch) | |
| tree | 4096c193b4f3fb181d5862e906ead8867a4b92a0 | |
| parent | 598158757a436eb6ea554f7ce34182dc96f8d851 (diff) | |
| download | meshbay-08b0f8d7c457e5e58a31bea2b2e43c9f398a6923.tar.gz | |
fix: drop the retired Mozilla STUN server from the defaults
stun.services.mozilla.com no longer resolves — Mozilla shut the service
down — so every ICE gather waited out a DNS timeout on it. Removed from the
node defaults (config.py), the browser defaults (transport.js) and the Node
page's "reset to defaults" (node-page.js). Google (two endpoints) plus
Cloudflare still give two-provider coverage against a single outage, which
is the §2.12 resilience claim. draft-v6 §2.12 updated.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
| -rw-r--r-- | docs/meshbay-draft-v6.md | 12 | ||||
| -rw-r--r-- | packages/meshbay-hub/src/meshbay_hub/static/node-page.js | 2 | ||||
| -rw-r--r-- | packages/meshbay-hub/src/meshbay_hub/static/transport.js | 3 | ||||
| -rw-r--r-- | packages/meshbay-node/src/meshbay_node/config.py | 4 |
4 files changed, 14 insertions, 7 deletions
diff --git a/docs/meshbay-draft-v6.md b/docs/meshbay-draft-v6.md index 2f2d5c7..180050c 100644 --- a/docs/meshbay-draft-v6.md +++ b/docs/meshbay-draft-v6.md @@ -63,7 +63,7 @@ | 12 | Group registry | A group name is **unique per owner account**, not globally; the group's identity is still its UUID. Listed everywhere as `name@owner` | §2.9 | | 13 | Enrichment | **Chat link previews** — the node unfurls a pasted URL into an OpenGraph card. A new instance of the §2.7 "node on demand, asking device caches, nothing durable" rule; new SSRF surface, gated. MNP 0.12 | §2.10 | | 14 | Node page | The Node page (D5) **exposes five `[node]` settings** — TTLs for invitations, pairing and device requests, the concurrent stream cap, and the transcode toggle. Editable from the panel, persisted in both `roster.db` and `node.toml` | §2.11 | -| 15 | Transport | WebRTC ICE gathering uses **four public STUN servers** instead of one, configurable on the node side. ICE interface filtering is exposed on the Node page. Both follow the §2.11 persistence pattern | reliability — single-server STUN was a silent SPOF, §2.12 | +| 15 | Transport | WebRTC ICE gathering uses **several public STUN servers** (three as of 2026-09-04) instead of one, configurable on the node side. ICE interface filtering is exposed on the Node page. Both follow the §2.11 persistence pattern | reliability — single-server STUN was a silent SPOF, §2.12 | --- @@ -418,20 +418,24 @@ The WebRTC transport relied on a single hardcoded Google STUN server ICE gathering waited the full 4-second timeout before completing — a silent single point of failure that added seconds to every connection. -**Four default servers, two providers deep.** +**Three default servers, two providers deep.** ``` stun:stun.l.google.com:19302 stun:stun1.l.google.com:19302 stun:stun.cloudflare.com:3478 -stun:stun.services.mozilla.com:3478 ``` -Both browser (`transport.js`) and node (`webrtc_server.py`) carry the same four defaults. +Both browser (`transport.js`) and node (`config.py`) carry the same three defaults. The two sides gather ICE candidates independently and exchange them via SDP through the hub — they do not need to use the same STUN server, and neither learns which server the other used. +> **Amended 2026-09-04:** a fourth default, `stun:stun.services.mozilla.com:3478`, +> was dropped — Mozilla retired the service and the name no longer resolves, so +> every gather waited out its DNS timeout. Google and Cloudflare still give +> two-provider coverage. + **Node-side configuration.** The node's STUN list is editable three ways: the Node page (a dedicated section with add, remove, reorder, save and reset-to-defaults), the CLI (`meshbay-node stun list|add|remove|reset`), and `node.toml` (`stun_servers` under diff --git a/packages/meshbay-hub/src/meshbay_hub/static/node-page.js b/packages/meshbay-hub/src/meshbay_hub/static/node-page.js index 8df4c9d..a2d3e49 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/node-page.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/node-page.js @@ -383,11 +383,11 @@ export function NodePage({ groups }) { }, []); const resetStunDefaults = useCallback(() => { + // Keep in step with meshbay_node.config.DEFAULT_STUN_SERVERS. setEditStun([ 'stun:stun.l.google.com:19302', 'stun:stun1.l.google.com:19302', 'stun:stun.cloudflare.com:3478', - 'stun:stun.services.mozilla.com:3478', ]); setActionMsg(''); }, []); diff --git a/packages/meshbay-hub/src/meshbay_hub/static/transport.js b/packages/meshbay-hub/src/meshbay_hub/static/transport.js index 809bb83..ea1e70a 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/transport.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/transport.js @@ -147,7 +147,8 @@ const STUN_URLS = [ 'stun:stun.l.google.com:19302', 'stun:stun1.l.google.com:19302', 'stun:stun.cloudflare.com:3478', - 'stun:stun.services.mozilla.com:3478', + // Mozilla retired stun.services.mozilla.com; the name no longer resolves. + // Google + Cloudflare still cover a single-provider outage. ]; let _iceServersPromise = null; function iceServers() { diff --git a/packages/meshbay-node/src/meshbay_node/config.py b/packages/meshbay-node/src/meshbay_node/config.py index a5220cd..0e5a7de 100644 --- a/packages/meshbay-node/src/meshbay_node/config.py +++ b/packages/meshbay-node/src/meshbay_node/config.py @@ -24,7 +24,9 @@ DEFAULT_STUN_SERVERS: list[str] = [ "stun:stun.l.google.com:19302", "stun:stun1.l.google.com:19302", "stun:stun.cloudflare.com:3478", - "stun:stun.services.mozilla.com:3478", + # stun.services.mozilla.com was here — Mozilla retired it, the name no + # longer resolves, and each gather waited out its DNS timeout. Two + # providers (Google, Cloudflare) still cover a single-provider outage. ] DEFAULT_CONFIG_PATH = config_dir() / "node.toml" |