JavaScript 56.7%
TypeScript 42.6%
1import { createServer } from "http";2import next from "next";3import { handleWebDAV } from "./lib/webdav";4import { createDailySnapshotIfNeeded } from "./lib/snapshot";5import { purgeExpiredTrash, cleanupOrphanChunks } from "./lib/trash";67const dev = process.env.NODE_ENV !== "production";8const port = parseInt(process.env.PORT || "5001", 10);910const app = next({ dev });11const handle = app.getRequestHandler();1213app.prepare().then(() => {14 createServer(async (req, res) => {15 const parsedUrl = new URL(req.url!, `http://${req.headers.host || "localhost"}`);1617 if (parsedUrl.pathname?.startsWith("/dav")) {18 await handleWebDAV(req, res);19 } else {20 await handle(req, res);21 }22 }).listen(port, () => {23 console.log(`> SPB Cloud ready on http://localhost:${port}`);24 console.log(`> WebDAV endpoint: http://localhost:${port}/dav`);25 console.log(`> WebDAV public: https://cloud.spboucher.ai/dav`);2627 // Daily snapshot: attempt immediately on startup, then check every hour28 const runSnapshot = () => {29 createDailySnapshotIfNeeded()30 .then((created) => { if (created) console.log("> [Snapshot] Snapshot quotidien créé"); })31 .catch((err) => console.error("> [Snapshot] Erreur:", err));32 };33 // Entretien horaire : purge de la corbeille (> 30 jours) + chunks d'upload orphelins34 const runMaintenance = () => {35 purgeExpiredTrash().then((n) => { if (n) console.log(`> [Corbeille] ${n} fichier(s) purgé(s) (> 30 j)`); }).catch((err) => console.error("> [Corbeille] Erreur:", err));36 cleanupOrphanChunks().catch((err) => console.error("> [Upload] Nettoyage chunks:", err));37 };38 setTimeout(runMaintenance, 60 * 1000);39 setInterval(runMaintenance, 60 * 60 * 1000);4041 if (process.env.SNAPSHOT_DISABLED === "1") {42 console.log("> [Snapshot] désactivé (SNAPSHOT_DISABLED=1)");43 } else {44 runSnapshot();45 setInterval(runSnapshot, 60 * 60 * 1000); // re-check every hour46 }47 });48}).catch((err) => {49 console.error("Failed to start server:", err);50 process.exit(1);51});52