Standalone dns server

This commit is contained in:
Owen
2026-10-28 15:41:31 -04:00
parent 0be847ce9e
commit 3dd46e48ec
5 changed files with 193 additions and 10 deletions
+46
View File
@@ -333,6 +333,52 @@ export async function listExitNodes(
return exitNodesList;
}
// Like listExitNodes, but gerbil nodes are not restricted to this server's
// region, so a caller that prefers same-region nodes (e.g. the DNS server)
// can still fall back to another region when this one has none online.
export async function listExitNodesAcrossRegions(
orgId: string,
filterOnline = false
) {
const allExitNodes = await db
.select({
exitNodeId: exitNodes.exitNodeId,
endpoint: exitNodes.endpoint,
online: exitNodes.online,
type: exitNodes.type,
region: exitNodes.region
})
.from(exitNodes)
.leftJoin(
exitNodeOrgs,
eq(exitNodes.exitNodeId, exitNodeOrgs.exitNodeId)
)
.where(
or(
eq(exitNodes.type, "gerbil"),
and(
eq(exitNodes.type, "remoteExitNode"),
eq(exitNodeOrgs.orgId, orgId)
)
)
);
const onlineNodes = allExitNodes.filter(
(node) => !filterOnline || node.online
);
const remoteExitNodesList = onlineNodes.filter(
(node) => node.type === "remoteExitNode"
);
const gerbilExitNodes = onlineNodes.filter(
(node) => node.type === "gerbil"
);
// An org's own remote exit nodes take precedence over the cloud ones
return remoteExitNodesList.length > 0
? remoteExitNodesList
: gerbilExitNodes;
}
export type ExitNodePingResult = {
exitNodeId: number;
latencyMs: number;