From 6cef79309bc4f22e06c9dabc42d291e6322e325b Mon Sep 17 00:00:00 2001 From: Randall Stillwell Date: Tue, 7 Apr 2026 13:14:41 -0500 Subject: [PATCH] Auto-resume email and folder watchers on server startup Added instrumentation.ts that reads persisted watcher state from the database and restarts active watchers when the Next.js server boots. Also added imapflow/mailparser to serverExternalPackages. Made-with: Cursor --- next.config.ts | 2 +- src/instrumentation.ts | 54 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/instrumentation.ts diff --git a/next.config.ts b/next.config.ts index 9cec5f5..aa8f345 100644 --- a/next.config.ts +++ b/next.config.ts @@ -14,7 +14,7 @@ const nextConfig: NextConfig = { }, ], }, - serverExternalPackages: ["sharp", "pdf2pic", "chokidar", "pg"], + serverExternalPackages: ["sharp", "pdf2pic", "chokidar", "pg", "imapflow", "mailparser"], }; export default nextConfig; diff --git a/src/instrumentation.ts b/src/instrumentation.ts new file mode 100644 index 0000000..f6b7f4c --- /dev/null +++ b/src/instrumentation.ts @@ -0,0 +1,54 @@ +export async function register() { + // Only run on the Node.js server runtime, not during build or in the edge runtime + if (process.env.NEXT_RUNTIME !== "nodejs") return; + + const { prisma } = await import("@/lib/db"); + + let settings; + try { + settings = await prisma.appSettings.findUnique({ + where: { id: "singleton" }, + }); + } catch (err) { + console.error("[instrumentation] Could not read settings:", err); + return; + } + + if (!settings) return; + + // Resume email monitoring + if ( + settings.emailWatching && + settings.emailImapHost && + settings.emailImapUser && + settings.emailImapPass + ) { + try { + const { startEmailWatching } = await import("@/lib/email-watcher"); + await startEmailWatching({ + host: settings.emailImapHost, + port: settings.emailImapPort, + user: settings.emailImapUser, + pass: settings.emailImapPass, + tls: settings.emailImapTls, + folder: settings.emailFolder, + processedAction: settings.emailProcessed, + processedFolder: settings.emailProcessedFolder, + }); + console.log("[instrumentation] Email monitoring resumed"); + } catch (err) { + console.error("[instrumentation] Failed to resume email monitoring:", err); + } + } + + // Resume folder watching + if (settings.watching && settings.watchDir) { + try { + const { startWatching } = await import("@/lib/watcher"); + await startWatching(settings.watchDir); + console.log("[instrumentation] Folder watching resumed"); + } catch (err) { + console.error("[instrumentation] Failed to resume folder watching:", err); + } + } +}