2 Commits
Author SHA1 Message Date
swaits e47e378769 release 3.0.1: pull rendezvous 0.2.1 (fast PublishFailing recovery)
CI / check (push) Canceled after 0s
2026-05-11 16:18:40 -06:00
swaits fcf2f5826c release 3.0.0: iroh 1.0-rc.0, gossip 0.99, rendezvous 0.2 2026-05-11 16:02:23 -06:00
5 changed files with 417 additions and 489 deletions

No files matched your search

+57
View File
@@ -1,5 +1,62 @@
# Changelog # Changelog
## [3.0.1] - 2026-05-11
### Fixed
- **DHT `PublishFailing` no longer wedges the swarm for minutes at a
time.** Pulls in `iroh-gossip-rendezvous` 0.2.1, which retries
failed publishes on a 15 s cadence (default) and bypasses the
`1/(n+1)` write-probability gate while the DHT is unhealthy. Prior
to this, a single failed publish parked the bridge in
`PublishFailing` for at least `write_period` (5 min) and on
average `(n + 1) × write_period` — half an hour with a populated
active view — before the next retry attempt. Recovery is now
bounded by `failure_retry_period × consecutive_failures` and
flips back to `Ready` the instant a write lands.
## [3.0.0] - 2026-05-11
### Breaking
- **`iroh` bumped 0.98 → `=1.0.0-rc.0`** and **`iroh-gossip` bumped
0.98 → 0.99**. The bridge is now built on iroh's first 1.0 release
candidate. iroh-gossip 0.99 hard-pins `iroh = "=1.0.0-rc.0"`, so the
bridge does too until iroh ships a final 1.0 — once it does, this
pin will relax to plain `"1"`. Any downstream consumer that pulls
iroh transitively must move in lockstep.
- **`iroh-gossip-rendezvous` bumped 0.1 → 0.2** (now consumed from
crates.io; the local path-dep is gone). The 0.2 release of the
rendezvous crate carries the same iroh 1.0-rc.0 bump and pins
`ed25519-dalek = "=3.0.0-pre.7"` to match iroh-base's pre-release.
### Changed
- `donglora-client` resolves to 1.1.1 (was 1.0.x). Adds the
`connect()`-time auto-clamp of `tx_power_dbm` against
`GET_INFO.tx_power_min/max` and pre-flight rejection of
out-of-range `freq_hz` / `sf` / `bw` with
`ClientError::ConfigNotSupported` — both surface as ordinary
bridge connection errors today.
- `Cargo.lock` refreshed end-to-end: `mainline` 6.0 → 6.1.2, plus
the usual tokio/rustls/hyper patch sweep.
### Notes
- **Pre-v2 config files were silently mis-loaded.** A stale
`~/.config/donglora-bridge/config.toml` from v0.x / v1.x — with
`sync_word = 13380` (`0x3444`, the old LoRaWAN-public default),
`tx_power = "22"` (old string field), or `cad = true` (removed in
v2) — would deserialize without error: serde silently ignored the
unknown `tx_power` / `cad` fields and the bridge fell back to its
per-field defaults, producing a "requested config" that didn't
match what the user had ever entered. On a shared mux the TUI
flagged this as a `!` against the active config. Re-run
`donglora-bridge config` (or update the file by hand) if your
config still has any of `tx_power`, `cad`, or
`sync_word = 13380`. A future minor will tighten the loader so
this fails loudly instead.
## [2.0.1] - 2026-04-25 ## [2.0.1] - 2026-04-25
### Fixed ### Fixed
Generated
+354 -480
View File
File diff suppressed because it is too large. Load diff
+4 -4
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "donglora-bridge" name = "donglora-bridge"
version = "2.0.1" version = "3.0.1"
edition = "2024" edition = "2024"
authors = ["Stephen Waits <steve@waits.net>"] authors = ["Stephen Waits <steve@waits.net>"]
license = "MIT" license = "MIT"
@@ -15,9 +15,9 @@ exclude = [".jj/", ".github/"]
[dependencies] [dependencies]
donglora-client = "1" donglora-client = "1"
iroh = "0.98" iroh = "=1.0.0-rc.0"
iroh-gossip = "0.98" iroh-gossip = "0.99"
iroh-gossip-rendezvous = { version = "0.1", path = "../../iroh-gossip-rendezvous" } iroh-gossip-rendezvous = "0.2.1"
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }
clap = { version = "4", features = ["derive"] } clap = { version = "4", features = ["derive"] }
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
+1 -3
View File
@@ -142,9 +142,7 @@ fn spawn_receiver(
if exit_reason == "cancelled" { if exit_reason == "cancelled" {
debug!("gossip receiver stopped ({exit_reason})"); debug!("gossip receiver stopped ({exit_reason})");
} else { } else {
error!( error!("gossip receiver STOPPED ({exit_reason}) — this bridge will no longer receive from the swarm",);
"gossip receiver STOPPED ({exit_reason}) — this bridge will no longer receive from the swarm",
);
} }
}); });
} }
+1 -2
View File
@@ -90,8 +90,7 @@ async fn main() -> Result<()> {
info!("rate limiter: {:.1} pps", rate_limiter.rate_pps()); info!("rate limiter: {:.1} pps", rate_limiter.rate_pps());
// Create gossip network + DHT rendezvous. // Create gossip network + DHT rendezvous.
let (swarm, gossip_event_rx, gossip_frame_tx) = let (swarm, gossip_event_rx, gossip_frame_tx) = gossip::Gossip::new(secret_key, &cfg.bridge.passphrase).await?;
gossip::Gossip::new(secret_key, &cfg.bridge.passphrase).await?;
let swarm = Arc::new(swarm); let swarm = Arc::new(swarm);
// Start radio. // Start radio.