refactor: extract isNoExpiry utility for zero-time handling

Go's time.Time{} serialises to '0001-01-01T00:00:00Z' which headscale
may return instead of null for tagged nodes (juanfont/headscale#3170).

Commit extracts the the existing inline check into a shared function for reuse.

No behavior change — mapNodes() already handled both variants.
This commit is contained in:
eccgecko
2026-04-10 22:42:05 +01:00
parent 272233ae62
commit d5f76637f5
2 changed files with 35 additions and 6 deletions
+6 -6
View File
@@ -12,6 +12,11 @@ export interface PopulatedNode extends Machine {
};
}
const GO_ZERO_TIMES = new Set(["0001-01-01 00:00:00", "0001-01-01T00:00:00Z"]);
export function isNoExpiry(expiry: string | null | undefined): boolean {
return expiry == null || GO_ZERO_TIMES.has(expiry);
}
export function mapNodes(
nodes: Machine[],
stats?: Record<string, HostInfo> | undefined,
@@ -35,12 +40,7 @@ export function mapNodes(
routes: Array.from(new Set(node.availableRoutes)),
hostInfo: stats?.[node.nodeKey],
customRouting,
expired:
node.expiry === "0001-01-01 00:00:00" ||
node.expiry === "0001-01-01T00:00:00Z" ||
node.expiry === null
? false
: new Date(node.expiry).getTime() < Date.now(),
expired: isNoExpiry(node.expiry) ? false : new Date(node.expiry!).getTime() < Date.now(),
};
});
}
+29
View File
@@ -0,0 +1,29 @@
import { describe, expect, test } from "vitest";
import { isNoExpiry } from "~/utils/node-info";
describe("isNoExpiry", () => {
test("returns true for null", () => {
expect(isNoExpiry(null)).toBe(true);
});
test("returns true for undefined", () => {
expect(isNoExpiry(undefined)).toBe(true);
});
test("returns true for Go zero-time ISO format", () => {
expect(isNoExpiry("0001-01-01T00:00:00Z")).toBe(true);
});
test("returns true for Go zero-time space format", () => {
expect(isNoExpiry("0001-01-01 00:00:00")).toBe(true);
});
test("returns false for a real future expiry", () => {
expect(isNoExpiry("2030-01-01T00:00:00Z")).toBe(false);
});
test("returns false for a real past expiry", () => {
expect(isNoExpiry("2020-01-01T00:00:00Z")).toBe(false);
});
});