simple list of pds servers with open registration
1import { Hono } from "https://esm.sh/hono@4.4.0";
2import {
3 getAllServers,
4 getMetadata,
5 getServerCount,
6} from "../database/queries.ts";
7import { getTrackedSoftware } from "../../shared/constants.ts";
8import type { LatestVersionMap } from "../../shared/types.ts";
9
10const api = new Hono();
11
12api.get("/servers", async (c) => {
13 // Fetch per-software latest versions
14 const tracked = getTrackedSoftware();
15 const latestVersions: LatestVersionMap = {};
16 const versionPromises = tracked.map(async (sw) => {
17 const v = await getMetadata(`latest_version:${sw.id}`);
18 if (v) latestVersions[sw.id] = v;
19 });
20
21 const [servers, , counts] = await Promise.all([
22 getAllServers(),
23 Promise.all(versionPromises),
24 getServerCount(),
25 ]);
26
27 // Backward compat: fall back to legacy key until cron populates new keys
28 if (!latestVersions["bluesky-pds"]) {
29 const legacy = await getMetadata("latest_pds_version");
30 if (legacy) latestVersions["bluesky-pds"] = legacy;
31 }
32
33 c.header(
34 "Cache-Control",
35 "public, max-age=3600, stale-while-revalidate=3600",
36 );
37 return c.json({
38 meta: {
39 latest_pds_version: latestVersions["bluesky-pds"] ?? null,
40 latest_versions: latestVersions,
41 total_known: counts.total,
42 total_open: counts.open,
43 updated_at: new Date().toISOString(),
44 },
45 servers,
46 });
47});
48
49export { api };