import { fromHono } from "chanfana"; import { cors } from "hono/cors"; import { Hono } from "hono"; import { CondenseTextEndpoint } from "./endpoints/condense_text"; import { GenerateEndpoint } from "./endpoints/generate"; import { geminiMiddleware } from "./middleware/gemini"; import { authMiddleware } from "./middleware/auth"; import { Env, Variables } from "./types"; const app = new Hono<{ Bindings: Env; Variables: Variables }>(); // The path which all routes are served from, for easy use with Worker Routes on custom domains. const rootPath = "/api/altText/"; app.use( "*", cors({ origin: (origin) => { const allowedOrigins = [ "https://indexx.dev", "chrome-extension://", "safari-web-extension://", "moz-extension://", ]; if ( origin && allowedOrigins.some((allowed) => origin.startsWith(allowed)) ) { return origin; } return null; }, allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"], allowHeaders: ["*"], maxAge: 600, credentials: true, }), ); const openapi = fromHono(app, { schema: { info: { title: "Bluesky Alt Text", description: "Endpoints for https://github.com/indexxing/Bluesky-Alt-Text", version: "1.0", }, }, docs_url: rootPath, openapi_url: rootPath + "openapi.json", }); openapi.registry.registerComponent("securitySchemes", "bearerAuth", { type: "http", scheme: "bearer", bearerFormat: "API key", }); // Define Middlewares app.use("*", geminiMiddleware); app.use(rootPath + "generate", authMiddleware); app.use(rootPath + "condense_text", authMiddleware); // Define Routes openapi.post(rootPath + "generate", GenerateEndpoint); openapi.post(rootPath + "condense_text", CondenseTextEndpoint); export default app;