1
/* eslint-disable @typescript-eslint/no-unused-vars */
2
import { getAuth } from '@clerk/nextjs/server';
3
import { User } from 'next-auth';
4
import { NextRequest } from 'next/server';
6
import { JWTPayload, LOBE_CHAT_AUTH_HEADER, enableClerk, enableNextAuth } from '@/const/auth';
8
type ClerkAuth = ReturnType<typeof getAuth>;
10
export interface AuthContext {
11
authorizationHeader?: string | null;
12
clerkAuth?: ClerkAuth;
13
jwtPayload?: JWTPayload | null;
15
userId?: string | null;
19
* Inner function for `createContext` where we create the context.
20
* This is useful for testing when we don't want to mock Next.js' request/response
22
export const createContextInner = async (params?: {
23
authorizationHeader?: string | null;
24
clerkAuth?: ClerkAuth;
26
userId?: string | null;
27
}): Promise<AuthContext> => ({
28
authorizationHeader: params?.authorizationHeader,
29
clerkAuth: params?.clerkAuth,
30
nextAuth: params?.nextAuth,
31
userId: params?.userId,
34
export type Context = Awaited<ReturnType<typeof createContextInner>>;
37
* Creates context for an incoming request
38
* @link https://trpc.io/docs/v11/context
40
export const createContext = async (request: NextRequest): Promise<Context> => {
41
// for API-response caching see https://trpc.io/docs/v11/caching
43
const authorization = request.headers.get(LOBE_CHAT_AUTH_HEADER);
49
auth = getAuth(request);
52
return createContextInner({ authorizationHeader: authorization, clerkAuth: auth, userId });
57
const { default: NextAuthEdge } = await import('@/libs/next-auth/edge');
59
const session = await NextAuthEdge.auth();
60
if (session && session?.user?.id) {
62
userId = session.user.id;
64
return createContextInner({ authorizationHeader: authorization, nextAuth: auth, userId });
66
console.error('next auth err', e);
70
return createContextInner({ authorizationHeader: authorization, userId });