import fs from "node:fs"; import { homedir } from "node:os"; import { join } from "node:path"; import type { NamespaceRecord } from "@olenbetong/appframe-updater"; const baseDir = join(homedir(), ".af"); function sanitizeHostname(hostname: string) { return hostname.replace(/[^a-z0-9]+/gi, "_"); } function getNamespaceDirectory(hostname: string) { return join(baseDir, sanitizeHostname(hostname)); } function getNamespaceCachePath(hostname: string) { return join(getNamespaceDirectory(hostname), "namespaces.json"); } export function readNamespacesCache(hostname: string): NamespaceRecord[] | undefined { try { let path = getNamespaceCachePath(hostname); if (!fs.existsSync(path)) { return undefined; } let data = fs.readFileSync(path, "utf-8"); return JSON.parse(data); } catch { return undefined; } } export function writeNamespacesCache(hostname: string, namespaces: NamespaceRecord[]) { try { let directory = getNamespaceDirectory(hostname); if (!fs.existsSync(directory)) { fs.mkdirSync(directory, { recursive: true }); } let path = join(directory, "namespaces.json"); fs.writeFileSync(path, JSON.stringify(namespaces, null, 2)); } catch { /* ignore */ } } export function upsertNamespaceCacheRecord(hostname: string, record: NamespaceRecord) { try { let directory = getNamespaceDirectory(hostname); if (!fs.existsSync(directory)) { fs.mkdirSync(directory, { recursive: true }); } let path = join(directory, "namespaces.json"); let namespaces: NamespaceRecord[] = []; if (fs.existsSync(path)) { try { namespaces = JSON.parse(fs.readFileSync(path, "utf-8")); } catch { namespaces = []; } } let index = namespaces.findIndex((namespace) => { if (typeof record.ID === "number" && typeof namespace.ID === "number") { if (namespace.ID === record.ID) { return true; } } return namespace.Name === record.Name; }); if (index >= 0) { namespaces[index] = record; } else { namespaces.push(record); } fs.writeFileSync(path, JSON.stringify(namespaces, null, 2)); } catch { /* ignore */ } }