UNPKG

@paroicms/site-generator-plugin

Version:

ParoiCMS Site Generator Plugin

42 lines (41 loc) 1.48 kB
import { readdir, stat } from "node:fs/promises"; import { join } from "node:path"; let runningId; export function startSiteRemover(ctx) { clearInterval(runningId); let sitesDir; runningId = setInterval(async () => { if (!sitesDir) return; try { await removeExpiredSites(ctx); } catch (error) { ctx.logger.error("[site-remover]", error); } }, 1000 * 60 * 60).unref(); return { stop() { clearInterval(runningId); }, }; } export async function removeExpiredSites(ctx) { const { sitesDir, packConf, service } = ctx; const now = new Date(); const expirationTime = new Date(now.getTime() - 1000 * 60 * 60 * 24 * 2); // 2 days // List entries in sitesDir, filter directories named as uuidv4, and remove them. const uuidv4Regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; const entries = await readdir(sitesDir, { withFileTypes: true }); for (const entry of entries) { if (!entry.isDirectory() || !uuidv4Regex.test(entry.name)) continue; const dirPath = join(sitesDir, entry.name); const st = await stat(dirPath); if (st.ctime < expirationTime) { const fqdn = `${entry.name}.${packConf.parentDomain}`; const siteConnector = service.getUnsafeSiteConnector({ fqdn }); await siteConnector.removeSite(); } } }