import type { NextRequest } from "next/server"; import { LEGACY_NEWAPIWG_API_KEY_HEADER, NEWAPIWG_API_KEY_HEADER, } from "@/utils/gatewayHeaders"; import { ApiError } from "./_errors"; export interface LoginContext { token: string; } export function getRequestToken(request: Request | NextRequest): string | null { const tokenHeader = request.headers.get("token"); if (tokenHeader?.trim()) return tokenHeader.trim(); const userTokenHeader = request.headers.get("X-User-Token"); if (userTokenHeader?.trim()) return userTokenHeader.trim(); const userAuthorization = request.headers.get("X-User-Authorization"); const userBearerToken = userAuthorization?.match(/^Bearer\s+(.+)$/i)?.[1]; if (userBearerToken?.trim()) return userBearerToken.trim(); const authorization = request.headers.get("authorization"); const bearerToken = authorization?.match(/^Bearer\s+(.+)$/i)?.[1]; return bearerToken?.trim() || null; } export function getRequestGatewayApiKey(request: Request | NextRequest): string | null { return ( request.headers.get(NEWAPIWG_API_KEY_HEADER)?.trim() || request.headers.get(LEGACY_NEWAPIWG_API_KEY_HEADER)?.trim() || null ); } export function requireLogin(request: Request | NextRequest): LoginContext { const token = getRequestToken(request); if (!token) { throw ApiError.unauthorized(); } return { token }; } export function buildUserForwardHeaders(token?: string | null): Record { if (!token?.trim()) return {}; const normalizedToken = token.trim(); return { "X-User-Authorization": `Bearer ${normalizedToken}`, "X-User-Token": normalizedToken, token: normalizedToken, }; } export function buildGatewayHeaders( apiKey: string, loginToken?: string | null, extraHeaders?: Record ): Record { return { ...(extraHeaders || {}), Authorization: `Bearer ${apiKey}`, ...buildUserForwardHeaders(loginToken), }; } export function requireConfiguredValue( value: string | null | undefined, message: string, status = 401 ): string { if (!value) { throw ApiError.config(message, status); } return value; }