@paroicms/site-generator-plugin
Version:
ParoiCMS Site Generator Plugin
42 lines (41 loc) • 1.48 kB
JavaScript
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();
}
}
}