import { mkdirSync, readFileSync } from "node:fs"; import { resolve } from "node:path"; import "dotenv/config"; function required(name: string): string { const v = process.env[name]; if (!v) { console.error(`missing env var: ${name}`); process.exit(1); } return v; } export const config = { port: Number(process.env.NIGHTSHADE_PORT ?? 8787), dataDir: resolve(process.env.NIGHTSHADE_DATA_DIR ?? "./data"), publicUrl: process.env.NIGHTSHADE_PUBLIC_URL?.replace(/\/$/, "") ?? null, miniflux: { url: required("MINIFLUX_URL"), token: process.env.MINIFLUX_TOKEN ?? (process.env.MINIFLUX_TOKEN_FILE ? readTokenFile(process.env.MINIFLUX_TOKEN_FILE) : ""), }, allowedDids: new Set( (process.env.NIGHTSHADE_ALLOWED_DIDS ?? "") .split(",") .map((s) => s.trim()) .filter(Boolean), ), }; if (!config.miniflux.token) { console.error("missing MINIFLUX_TOKEN or MINIFLUX_TOKEN_FILE"); process.exit(1); } mkdirSync(config.dataDir, { recursive: true }); function readTokenFile(path: string): string { return readFileSync(path, "utf8").trim(); } export function isLoopback(): boolean { return config.publicUrl === null; } export function publicBase(): string { return config.publicUrl ?? `http://127.0.0.1:${config.port}`; } export function minifluxAllowed(did: string): boolean { return config.allowedDids.size === 0 || config.allowedDids.has(did); }