Introduces a CF Queue binding (kk-email-queue) to decouple email delivery from request handlers, preventing slow responses and providing automatic retries. All send*Email calls now go through the queue when the binding is available, with direct-send fallbacks for local dev. Reminder fan-outs mark DB rows optimistically before enqueueing to prevent re-enqueue on subsequent cron ticks.
35 lines
699 B
TypeScript
35 lines
699 B
TypeScript
import { auth } from "@kk/auth";
|
|
import { env } from "@kk/env/server";
|
|
import type { EmailMessage } from "./email-queue";
|
|
|
|
// CF Workers runtime Queue type (not the alchemy resource type)
|
|
type Queue = {
|
|
send(
|
|
message: EmailMessage,
|
|
options?: { contentType?: string },
|
|
): Promise<void>;
|
|
sendBatch(
|
|
messages: Array<{ body: EmailMessage }>,
|
|
options?: { contentType?: string },
|
|
): Promise<void>;
|
|
};
|
|
|
|
export async function createContext({
|
|
req,
|
|
emailQueue,
|
|
}: {
|
|
req: Request;
|
|
emailQueue?: Queue;
|
|
}) {
|
|
const session = await auth.api.getSession({
|
|
headers: req.headers,
|
|
});
|
|
return {
|
|
session,
|
|
env,
|
|
emailQueue,
|
|
};
|
|
}
|
|
|
|
export type Context = Awaited<ReturnType<typeof createContext>>;
|