Addresses final-review findings: I1 render-generation guard prevents a double-mount /timer leak on rapid re-navigation; I2 adds anonymous-rejection tests for the owner-only POST /speedtest/run and /health/check; M1 CSS comment; M2 cron↔worker dedup note; M4 full 8-byte PNG signature check; M5 card-contract unit test for all 7 cards. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
33 lines
1.3 KiB
JavaScript
33 lines
1.3 KiB
JavaScript
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
import path from 'node:path';
|
|
|
|
let cacheDir = process.env.ICON_CACHE || '/var/lib/void/icons';
|
|
let fetcher = defaultFetcher;
|
|
export function _setCacheDir(d) { cacheDir = d; }
|
|
export function _setFetcher(fn) { fetcher = fn || defaultFetcher; }
|
|
|
|
const VALID = /^[a-z0-9-]+$/;
|
|
export function validSlug(slug) { return VALID.test(slug); }
|
|
|
|
async function defaultFetcher(slug) {
|
|
const url = `https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${slug}.png`;
|
|
const res = await fetch(url, { signal: AbortSignal.timeout(8000) });
|
|
if (!res.ok) return null;
|
|
return Buffer.from(await res.arrayBuffer());
|
|
}
|
|
|
|
const PNG_SIG = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
function isPng(buf) { return buf && buf.length > 8 && PNG_SIG.every((b, i) => buf[i] === b); }
|
|
|
|
// Returns a Buffer (cached or freshly fetched) or null if upstream has no icon.
|
|
export async function getIcon(slug) {
|
|
if (!validSlug(slug)) throw new Error('invalid slug');
|
|
const file = path.join(cacheDir, `${slug}.png`);
|
|
try { return await readFile(file); } catch { /* miss → fetch */ }
|
|
const buf = await fetcher(slug);
|
|
if (!isPng(buf)) return null;
|
|
await mkdir(cacheDir, { recursive: true });
|
|
await writeFile(file, buf);
|
|
return buf;
|
|
}
|