xtablo-source/api/src/middleware.ts
Arthur Belleville 4476a76180
Fix email
2025-10-05 10:45:39 +02:00

65 lines
1.8 KiB
TypeScript

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();
};