@paroicms/server
Version:
The ParoiCMS server
53 lines • 2.17 kB
JavaScript
import { createMediaStorage } from "@paroicms/server-database-media-storage";
import { join } from "node:path";
import { createOrOpenMainConnection } from "../../connector/db-init/db-init.js";
import { makeSiteBackup } from "../../connector/site-backup/backup.js";
import { cmsVersion } from "../../context.js";
import { processQueuedRequests, setRequestTrackerState, waitForPendingRequests, } from "../../request-tracking/request-state.js";
export async function executeHardenedBackup(siteContext) {
const { logger } = siteContext;
logger.info("Starting hardened backup");
setRequestTrackerState(siteContext, "backupMode");
try {
await waitForPendingRequests(siteContext, 30_000);
const mediaDbPath = join(siteContext.dataDir, "medias.sqlite");
logger.debug("Closing database connections for backup");
await siteContext.cn.destroy();
await siteContext.mediaStorage.close();
let backupResult;
try {
backupResult = await makeSiteBackup(siteContext, {
serverVersion: cmsVersion,
});
logger.debug("Backup completed, reopening database connections");
}
catch (backupError) {
await reopenDatabaseConnections(siteContext, mediaDbPath, logger);
throw backupError;
}
await reopenDatabaseConnections(siteContext, mediaDbPath, logger);
return backupResult;
}
finally {
setRequestTrackerState(siteContext, "normal");
processQueuedRequests(siteContext);
logger.debug("Backup operation completed, normal operations resumed");
}
}
async function reopenDatabaseConnections(siteContext, mediaDbPath, logger) {
const { cn: newCn } = await createOrOpenMainConnection(siteContext.dataDir, {
canCreate: false,
logger,
});
const newMediaStorage = await createMediaStorage({
canCreate: false,
storage: {
type: "sqlite",
file: mediaDbPath,
},
logger,
});
siteContext.cn = newCn;
siteContext.mediaStorage = newMediaStorage;
}
//# sourceMappingURL=hardened-backup.service.js.map