spb/maclustr-console
Public
TypeScript 96.1%
CSS 3.1%
JavaScript 0.8%
1export interface TailscaleDevice {2 id: string;3 name: string;4 hostname: string;5 addresses: string[];6 os: string;7 online: boolean;8 lastSeen: string;9 clientVersion: string;10}1112export async function getTailscaleDevices(): Promise<TailscaleDevice[]> {13 const apiKey = process.env.TAILSCALE_API_KEY;14 const tailnet = process.env.TAILSCALE_TAILNET;1516 if (!apiKey || apiKey.startsWith("tskey-api-XXXX")) {17 return [];18 }1920 const res = await fetch(`https://api.tailscale.com/api/v2/tailnet/${tailnet}/devices`, {21 headers: {22 Authorization: `Bearer ${apiKey}`,23 },24 next: { revalidate: 30 },25 });2627 if (!res.ok) {28 console.error("Tailscale API error:", res.status, await res.text());29 return [];30 }3132 const data = await res.json();33 return (data.devices || []).map((d: Record<string, unknown>) => ({34 id: d.id,35 name: d.name,36 hostname: d.hostname,37 addresses: d.addresses || [],38 os: d.os,39 online: d.connectedToControl ?? d.online ?? false,40 lastSeen: d.lastSeen,41 clientVersion: d.clientVersion || "",42 }));43}44