107 lines · 4.0 KB
import { verifyKey } from "discord-interactions";
import { createDiscordAdapter } from "./adapters/discord/index.ts";
import { buildCommandConfig } from "./adapters/discord/config.ts";
import { handleInteraction, type DiscordInteraction } from "./adapters/discord/interactions.ts";
import { createAddress, deleteExpiredAndRevoked, deleteStaleRateLimits, getCounters } from "./core/db.ts";
import { createDispatcher } from "./core/dispatch.ts";
import { handleInboundEmail } from "./core/email.ts";
import type { MailAdapter, OwnerRef } from "./core/types.ts";
import { renderCounterPage } from "./counter-page.ts";
import { createD1Executor } from "./storage/d1.ts";
import pkg from "../package.json";

export interface Env {
  DB: D1Database;
  DISPOSABLE_DOMAIN: string;
  ADAPTERS: string;
  DISCORD_TOKEN: string;
  DISCORD_PUBLIC_KEY: string;
  DISCORD_APPLICATION_ID: string;
  // Optional overrides for adapters/discord/config.ts defaults, see
  // docs/configuration.md for the full list of accepted vars.
  [key: string]: unknown;
}

const CLEANUP_GRACE_SECONDS = 24 * 60 * 60;
const STALE_RATE_LIMIT_SECONDS = 30 * 24 * 60 * 60;

function buildAdapters(env: Env): MailAdapter[] {
  const enabled = env.ADAPTERS.split(",").map((s) => s.trim());
  const adapters: MailAdapter[] = [];
  if (enabled.includes("discord")) {
    adapters.push(createDiscordAdapter(env.DISCORD_TOKEN));
  }
  return adapters;
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const url = new URL(request.url);