import { S3Client } from "@aws-sdk/client-s3"; import { createClient, type User } from "@supabase/supabase-js"; import type { Context, Next } from "hono"; import { StreamChat } from "stream-chat"; import { config } from "./config.js"; // Create authentication middleware export const authMiddleware = async (c: Context, next: Next) => { const supabase = c.get("supabase"); // Extract Bearer token from Authorization header const authHeader = c.req.header("Authorization"); if (!authHeader || !authHeader.startsWith("Bearer ")) { return c.json({ error: "Missing or invalid authorization header" }, 401); } const token = authHeader.substring(7); // Remove "Bearer " prefix const { data: { user }, error, } = await supabase.auth.getUser(token); if (error || !user) { return c.json({ error: "Invalid or expired token" }, 401); } const userTyped = user as User; c.set("user", userTyped); await next(); }; export const supabaseMiddleware = async (c: Context, next: Next) => { const supabase = createClient( process.env.SUPABASE_URL as string, process.env.SUPABASE_SERVICE_ROLE_KEY as string ); c.set("supabase", supabase); await next(); }; export const streamChatMiddleware = async (c: Context, next: Next) => { const serverClient = StreamChat.getInstance( process.env.STREAM_CHAT_API_KEY as string, process.env.STREAM_CHAT_API_SECRET as string, { disableCache: true, } ); c.set("streamServerClient", serverClient); await next(); }; export const r2Middleware = async (c: Context, next: Next) => { const s3 = new S3Client({ region: "auto", endpoint: `https://${config.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, credentials: { accessKeyId: config.R2_ACCESS_KEY_ID, secretAccessKey: config.R2_SECRET_ACCESS_KEY, }, }); c.set("s3_client", s3); await next(); };