feat(instances): beacon on connect and relay self-entry

This commit is contained in:
Peter Steinberger
2025-12-09 03:56:04 +01:00
parent 280c7c851f
commit 38c4f4f76c
4 changed files with 1798 additions and 1747 deletions

View File

@@ -1,3 +1,5 @@
import os from "node:os";
export type SystemPresence = {
host?: string;
ip?: string;
@@ -11,6 +13,45 @@ export type SystemPresence = {
const entries = new Map<string, SystemPresence>();
function resolvePrimaryIPv4(): string | undefined {
const nets = os.networkInterfaces();
const prefer = ["en0", "eth0"];
const pick = (names: string[]) => {
for (const name of names) {
const list = nets[name];
const entry = list?.find((n) => n.family === "IPv4" && !n.internal);
if (entry?.address) return entry.address;
}
for (const list of Object.values(nets)) {
const entry = list?.find((n) => n.family === "IPv4" && !n.internal);
if (entry?.address) return entry.address;
}
return undefined;
};
return pick(prefer) ?? os.hostname();
}
function initSelfPresence() {
const host = os.hostname();
const ip = resolvePrimaryIPv4() ?? undefined;
const version =
process.env.CLAWDIS_VERSION ?? process.env.npm_package_version ?? "unknown";
const text = `Relay: ${host}${ip ? ` (${ip})` : ""} · app ${version} · mode relay · reason self`;
const selfEntry: SystemPresence = {
host,
ip,
version,
mode: "relay",
reason: "self",
text,
ts: Date.now(),
};
const key = host.toLowerCase();
entries.set(key, selfEntry);
}
initSelfPresence();
function parsePresence(text: string): SystemPresence {
const trimmed = text.trim();
const pattern =