import "server-only"; import { BrevoEmailProvider, loadBrevoEmailProviderConfigFromEnv } from "./brevo-email-provider"; import { ConsoleEmailProvider } from "./console-email-provider"; import { ConsolePushProvider } from "./console-push-provider"; import type { EmailProvider } from "./email-provider"; import type { PushProvider } from "./push-provider"; import { WebPushProvider, loadWebPushProviderConfigFromEnv } from "./web-push-provider"; export type { EmailAddress, EmailProvider, EmailSendResult, SendEmailParams } from "./email-provider"; export type { PushProvider, PushSendResult, PushSubscriptionKeys, SendPushParams } from "./push-provider"; export { BrevoEmailProvider } from "./brevo-email-provider"; export { ConsoleEmailProvider } from "./console-email-provider"; export { MockEmailProvider } from "./mock-email-provider"; export { ConsolePushProvider } from "./console-push-provider"; export { MockPushProvider } from "./mock-push-provider"; export { WebPushProvider } from "./web-push-provider"; let cachedEmailProvider: EmailProvider | undefined; let cachedPushProvider: PushProvider | undefined; /** * Selected once via `EMAIL_PROVIDER` and cached — never chosen per-call, so * a single deployment always sends through exactly one path. Defaults to * "console" whenever real SMTP credentials aren't present (e.g. local dev * with no .env values filled in), so the app never accidentally tries a * real send with empty credentials; this must never be the default in a * deployed environment (see docs/phase-7-summary.md, "Environment * variables required" — EMAIL_PROVIDER=brevo is required for production). */ export function getEmailProvider(): EmailProvider { if (cachedEmailProvider) return cachedEmailProvider; const selected = process.env.EMAIL_PROVIDER ?? "console"; if (selected === "brevo") { cachedEmailProvider = new BrevoEmailProvider(loadBrevoEmailProviderConfigFromEnv()); } else { cachedEmailProvider = new ConsoleEmailProvider(); } return cachedEmailProvider; } /** Same selection pattern as getEmailProvider() — set PUSH_PROVIDER="web-push" once real VAPID keys are configured for a deployment; defaults to logging instead of sending. */ export function getPushProvider(): PushProvider { if (cachedPushProvider) return cachedPushProvider; const selected = process.env.PUSH_PROVIDER ?? "console"; if (selected === "web-push") { cachedPushProvider = new WebPushProvider(loadWebPushProviderConfigFromEnv()); } else { cachedPushProvider = new ConsolePushProvider(); } return cachedPushProvider; }