import { perform } from "./email"; import { redactJob, type EmailJob } from "./job"; import { ConsoleLogger, type Logger } from "./logger"; export const main = (port: number) => { const server = Bun.serve({ port, async fetch(req) { ConsoleLogger.info(`Received request: ${req.url}`)(); const url = new URL(req.url); if (req.method === "POST" && url.pathname === "/api/email") { const job: EmailJob = await req.json(); const jobInsensitive = redactJob(job); const uuid = crypto.randomUUID(); const logger: Logger = { info: (message) => ConsoleLogger.info(`[${uuid}] ${message}`), warn: (message) => ConsoleLogger.warn(`[${uuid}] ${message}`), error: (message) => ConsoleLogger.error(`[${uuid}] ${message}`), } logger.info( `Received email job: ${JSON.stringify(jobInsensitive)}`, )(); const performEmailTest = perform(job, undefined, logger)(); return performEmailTest .then((result) => { if (result._tag === "Left") { const error = result.left; logger.warn( `job failure due to ${error.message}`, )(); return new Response(error.message, { status: 400, }); } logger.info('success')(); return Response.json({ success: true }); }) .catch((e) => { logger.error(`internal failure due to ${e}`)(); return new Response(e.message, { status: 500, }); }); } return new Response("404!", { status: 404 }); }, }); ConsoleLogger.info(`Listening on port ${port}`)(); return server; };