refactor(peer): drop --no-mdns toggle, mDNS is always on
The peer runtime previously accepted an `enable_mdns: bool` flag, plumbed
through `PeerStartOptions`, `spawn_peer_runtime`, `run_peer`, `Ctx`, and
`PeerCtx`. The lanspread-peer-cli harness exposed the toggle as
`--no-mdns` so test scenarios could fall back to explicit `connect`
commands when mDNS could not be relied on, in particular when multiple
peers ran inside `--network host` containers and could not advertise
independently.
That host-networking workaround no longer exists: the previous commit
moves harness containers onto a macvlan network, where each peer is a
real LAN device and mDNS just works between them. There is no scenario
left in the codebase where disabling mDNS is desirable. Per the project's
protocol policy in CLAUDE.md ("there is only one wire version, no
compatibility shims, no fallback paths"), an opt-out path with no current
caller is exactly the kind of dead code we should not carry.
Remove the flag and every plumbing point that exists only to support it:
- `PeerStartOptions::enable_mdns` and the custom `Default` impl that set
it to `true`; the struct now derives `Default` and just carries
`state_dir`.
- The `enable_mdns` parameter on `start_peer_with_options`,
`spawn_peer_runtime`, `run_peer`, and `Ctx::new`.
- The `enable_mdns` fields on `Ctx` and `PeerCtx` and the propagation
through `to_peer_ctx`.
- The `if ctx.enable_mdns` guard in `spawn_startup_services`;
`spawn_peer_discovery_service` is now always spawned.
- The `if ctx.enable_mdns { ... } else { ... }` branch in
`run_server_component`: the mDNS advertiser and event monitor are now
unconditionally started, and the no-mDNS-fallback log line that read
"mDNS disabled; direct peer address is ..." is gone. The
`direct_connect_addr` helper is kept because the mDNS-on branch still
uses it as a fallback when `local_peer_addr` has not yet been
populated.
- The internal test helpers in `handlers.rs`, `services/local_monitor.rs`,
and `services/stream.rs` that passed `true` as the trailing
`enable_mdns` arg to `Ctx::new`.
- In `lanspread-peer-cli`: the `--no-mdns` arg parsing, the
`Args::enable_mdns` field, the `mdns` key on the `cli-started` event
payload, and the `--no-mdns` mention in the help text and the crate
README.
The `Args::name` field is wired to the harness identity but is otherwise
untouched. The macvlan network created by `just peer-cli-net` is the
runtime prerequisite for this change to be observable across containers;
on a single workstation, two harness binaries on `127.0.0.1` discover
each other through mDNS on the loopback interface as before.
Test Plan:
- `just fmt`
- `just clippy`
- `just test`
- `just peer-cli-build`
- Two peers on macvlan: `just peer-cli-run alpha` and
`just peer-cli-run beta`; check that each emits `peer-discovered` and
`peer-connected` events without an explicit `connect` JSONL command.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -17,7 +17,6 @@ Useful flags:
|
||||
- `--games-dir PATH` stores local archives and installs.
|
||||
- `--state-dir PATH` stores the generated peer identity.
|
||||
- `--fixture GAME_ID` seeds a tiny archive that the fixture unpacker can install.
|
||||
- `--no-mdns` disables mDNS so tests can use explicit `connect` commands.
|
||||
|
||||
## Commands
|
||||
|
||||
|
||||
@@ -52,7 +52,6 @@ struct Args {
|
||||
catalog_db: Option<PathBuf>,
|
||||
fixtures: Vec<String>,
|
||||
unrar: Option<PathBuf>,
|
||||
enable_mdns: bool,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
@@ -134,7 +133,6 @@ async fn main() -> eyre::Result<()> {
|
||||
catalog,
|
||||
PeerStartOptions {
|
||||
state_dir: Some(args.state_dir.clone()),
|
||||
enable_mdns: args.enable_mdns,
|
||||
},
|
||||
)?;
|
||||
let sender = handle.sender();
|
||||
@@ -155,7 +153,6 @@ async fn main() -> eyre::Result<()> {
|
||||
"games_dir": args.games_dir,
|
||||
"state_dir": args.state_dir,
|
||||
"fixtures": fixture_seeds,
|
||||
"mdns": args.enable_mdns,
|
||||
}),
|
||||
));
|
||||
|
||||
@@ -488,7 +485,6 @@ fn parse_args() -> eyre::Result<Args> {
|
||||
catalog_db: default_catalog_db(),
|
||||
fixtures: Vec::new(),
|
||||
unrar: None,
|
||||
enable_mdns: true,
|
||||
};
|
||||
|
||||
while let Some(arg) = args.next() {
|
||||
@@ -503,7 +499,6 @@ fn parse_args() -> eyre::Result<Args> {
|
||||
Some("--catalog-db") => parsed.catalog_db = Some(next_path(&mut args, "--catalog-db")?),
|
||||
Some("--fixture") => parsed.fixtures.push(next_string(&mut args, "--fixture")?),
|
||||
Some("--unrar") => parsed.unrar = Some(next_path(&mut args, "--unrar")?),
|
||||
Some("--no-mdns") => parsed.enable_mdns = false,
|
||||
Some(other) => eyre::bail!("unknown argument: {other}"),
|
||||
None => eyre::bail!("argument is not valid UTF-8: {arg:?}"),
|
||||
}
|
||||
@@ -535,7 +530,7 @@ fn next_path(args: &mut impl Iterator<Item = OsString>, flag: &str) -> eyre::Res
|
||||
fn print_help() {
|
||||
eprintln!(
|
||||
"usage: lanspread-peer-cli [--name NAME] [--games-dir PATH] [--state-dir PATH] \\
|
||||
[--catalog-db PATH] [--fixture GAME_ID] [--unrar PATH] [--no-mdns]\n\
|
||||
[--catalog-db PATH] [--fixture GAME_ID] [--unrar PATH]\n\
|
||||
Reads JSONL commands on stdin and writes result/event/error JSONL on stdout."
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user