



















@@ -69,6 +69,7 @@ type BonjourAdvertiserDeps = {
6969const WATCHDOG_INTERVAL_MS = 5_000;
7070const REPAIR_DEBOUNCE_MS = 30_000;
7171const STUCK_ANNOUNCING_MS = 8_000;
72+const MAX_CONSECUTIVE_RESTARTS = 3;
7273const BONJOUR_ANNOUNCED_STATE = "announced";
7374const CIAO_SELF_PROBE_RETRY_FRAGMENT =
7475"failed probing with reason: Error: Can't probe for a service which is announced already.";
@@ -332,7 +333,9 @@ export async function startGatewayBonjourAdvertiser(
332333333334let stopped = false;
334335let recreatePromise: Promise<void> | null = null;
335-let cycle = createCycle();
336+let disabled = false;
337+let consecutiveRestarts = 0;
338+let cycle: BonjourCycle | null = createCycle();
336339const stateTracker = new Map<string, ServiceStateTracker>();
337340attachConflictListeners(cycle.services);
338341startAdvertising(cycle.services);
@@ -353,13 +356,26 @@ export async function startGatewayBonjourAdvertiser(
353356};
354357355358const recreateAdvertiser = async (reason: string) => {
356-if (stopped) {
359+if (stopped || disabled) {
357360return;
358361}
359362if (recreatePromise) {
360363return recreatePromise;
361364}
362365recreatePromise = (async () => {
366+consecutiveRestarts += 1;
367+if (consecutiveRestarts > MAX_CONSECUTIVE_RESTARTS) {
368+disabled = true;
369+logger.warn(
370+`bonjour: disabling advertiser after ${MAX_CONSECUTIVE_RESTARTS} failed restarts (${reason}); set discovery.mdns.mode="off" or OPENCLAW_DISABLE_BONJOUR=1 to disable mDNS discovery`,
371+);
372+const previous = cycle;
373+cycle = null;
374+stateTracker.clear();
375+await stopCycle(previous, { shutdownResponder: true });
376+restoreConsoleLog();
377+return;
378+}
363379logger.warn(`bonjour: restarting advertiser (${reason})`);
364380const previous = cycle;
365381await stopCycle(previous);
@@ -378,12 +394,18 @@ export async function startGatewayBonjourAdvertiser(
378394if (stopped || recreatePromise) {
379395return;
380396}
397+if (disabled || !cycle) {
398+return;
399+}
381400updateStateTrackers(cycle.services);
382401for (const { label, svc } of cycle.services) {
383402const stateUnknown = (svc as { serviceState?: unknown }).serviceState;
384403if (typeof stateUnknown !== "string") {
385404continue;
386405}
406+if (stateUnknown === "announced") {
407+consecutiveRestarts = 0;
408+}
387409const tracked = stateTracker.get(label);
388410if (
389411stateUnknown !== "announced" &&
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。