/** * Shared DodoPayments Convex component SDK configuration. * * This file initializes the @dodopayments/convex component SDK, which handles * the checkout overlay lifecycle and webhook signature verification via the * Convex component system. It is the SDK used by checkout.ts and the HTTP * webhook action. * * DUAL SDK NOTE: billing.ts uses the direct dodopayments REST SDK * (npm: "dodopayments") for customer portal and plan-change API calls. * These are two separate packages with different responsibilities: * - @dodopayments/convex (this file): checkout + webhook component * - dodopayments (billing.ts): REST API for subscriptions/customers * * Config is read lazily (on first use) rather than at module scope, * so missing env vars fail at the action boundary with a clear error * instead of silently capturing empty values at import time. * * Canonical env var: DODO_API_KEY (set in Convex dashboard). */ import { DodoPayments } from "@dodopayments/convex"; import { components } from "../_generated/api"; let _instance: DodoPayments | null = null; function getDodoInstance(): DodoPayments { if (_instance) return _instance; const apiKey = process.env.DODO_API_KEY; if (!apiKey) { throw new Error( "[dodo] DODO_API_KEY is not set. " + "Set it in the Convex dashboard environment variables.", ); } _instance = new DodoPayments(components.dodopayments, { identify: async () => null, // Stub until real auth integration apiKey, environment: (process.env.DODO_PAYMENTS_ENVIRONMENT ?? "test_mode") as | "test_mode" | "live_mode", }); return _instance; } /** * Lazily-initialized Dodo API accessors. * Throws immediately if DODO_API_KEY is missing, so callers get a clear * error at the action boundary rather than a cryptic SDK failure later. */ export function getDodoApi() { return getDodoInstance().api(); } /** Shorthand for checkout API. */ export function checkout(...args: Parameters['checkout']>) { return getDodoApi().checkout(...args); }