69 lines
2.5 KiB
TypeScript
69 lines
2.5 KiB
TypeScript
import { startGatewayBonjourAdvertiser } from "../infra/bonjour.js";
|
|
import { pickPrimaryTailnetIPv4, pickPrimaryTailnetIPv6 } from "../infra/tailnet.js";
|
|
import { WIDE_AREA_DISCOVERY_DOMAIN, writeWideAreaBridgeZone } from "../infra/widearea-dns.js";
|
|
import {
|
|
formatBonjourInstanceName,
|
|
resolveBonjourCliPath,
|
|
resolveTailnetDnsHint,
|
|
} from "./server-discovery.js";
|
|
|
|
export async function startGatewayDiscovery(params: {
|
|
machineDisplayName: string;
|
|
port: number;
|
|
bridgePort?: number;
|
|
canvasPort?: number;
|
|
wideAreaDiscoveryEnabled: boolean;
|
|
logDiscovery: { info: (msg: string) => void; warn: (msg: string) => void };
|
|
}) {
|
|
let bonjourStop: (() => Promise<void>) | null = null;
|
|
const tailnetDns = await resolveTailnetDnsHint();
|
|
const sshPortEnv = process.env.CLAWDBOT_SSH_PORT?.trim();
|
|
const sshPortParsed = sshPortEnv ? Number.parseInt(sshPortEnv, 10) : NaN;
|
|
const sshPort = Number.isFinite(sshPortParsed) && sshPortParsed > 0 ? sshPortParsed : undefined;
|
|
|
|
try {
|
|
const bonjour = await startGatewayBonjourAdvertiser({
|
|
instanceName: formatBonjourInstanceName(params.machineDisplayName),
|
|
gatewayPort: params.port,
|
|
bridgePort: params.bridgePort,
|
|
canvasPort: params.canvasPort,
|
|
sshPort,
|
|
tailnetDns,
|
|
cliPath: resolveBonjourCliPath(),
|
|
});
|
|
bonjourStop = bonjour.stop;
|
|
} catch (err) {
|
|
params.logDiscovery.warn(`bonjour advertising failed: ${String(err)}`);
|
|
}
|
|
|
|
if (params.wideAreaDiscoveryEnabled && params.bridgePort) {
|
|
const tailnetIPv4 = pickPrimaryTailnetIPv4();
|
|
if (!tailnetIPv4) {
|
|
params.logDiscovery.warn(
|
|
"discovery.wideArea.enabled is true, but no Tailscale IPv4 address was found; skipping unicast DNS-SD zone update",
|
|
);
|
|
} else {
|
|
try {
|
|
const tailnetIPv6 = pickPrimaryTailnetIPv6();
|
|
const result = await writeWideAreaBridgeZone({
|
|
bridgePort: params.bridgePort,
|
|
gatewayPort: params.port,
|
|
displayName: formatBonjourInstanceName(params.machineDisplayName),
|
|
tailnetIPv4,
|
|
tailnetIPv6: tailnetIPv6 ?? undefined,
|
|
tailnetDns,
|
|
sshPort,
|
|
cliPath: resolveBonjourCliPath(),
|
|
});
|
|
params.logDiscovery.info(
|
|
`wide-area DNS-SD ${result.changed ? "updated" : "unchanged"} (${WIDE_AREA_DISCOVERY_DOMAIN} → ${result.zonePath})`,
|
|
);
|
|
} catch (err) {
|
|
params.logDiscovery.warn(`wide-area discovery update failed: ${String(err)}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
return { bonjourStop };
|
|
}
|