-
-
Notifications
You must be signed in to change notification settings - Fork 236
/
supabase-server.ts
89 lines (84 loc) · 2.37 KB
/
supabase-server.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import { createClient, Session } from '@supabase/supabase-js';
import type { CookieSerializeOptions } from 'cookie';
import { CookieOptions, SupabaseClientOptionsWithoutAuth } from './types';
import {
isSecureEnvironment,
parseSupabaseCookie,
stringifySupabaseSession
} from './utils/cookies';
export function createServerSupabaseClient<
Database = any,
SchemaName extends string & keyof Database = 'public' extends keyof Database
? 'public'
: string & keyof Database
>({
supabaseUrl,
supabaseKey,
getCookie,
setCookie,
getRequestHeader,
options,
cookieOptions: {
name = 'supabase-auth-token',
domain,
path = '/',
sameSite = 'lax',
secure,
maxAge = 1000 * 60 * 60 * 24 * 365
} = {}
}: {
supabaseUrl: string;
supabaseKey: string;
getCookie: (name: string) => string | undefined;
setCookie: (
name: string,
value: string,
options: CookieSerializeOptions
) => void;
getRequestHeader: (name: string) => string | string[] | undefined;
options?: SupabaseClientOptionsWithoutAuth<SchemaName>;
cookieOptions?: CookieOptions;
}) {
let currentSession = parseSupabaseCookie(getCookie(name)) ?? null;
return createClient<Database, SchemaName>(supabaseUrl, supabaseKey, {
...options,
auth: {
detectSessionInUrl: false,
autoRefreshToken: false,
storageKey: name,
storage: {
getItem(key: string) {
return JSON.stringify(currentSession);
},
setItem(key: string, _value: string) {
let session: Session = JSON.parse(_value);
const value = stringifySupabaseSession(session);
currentSession = session;
setCookie(key, value, {
domain,
path,
maxAge,
// Allow supabase-js on the client to read the cookie as well
httpOnly: false,
sameSite,
secure: secure ?? isSecureEnvironment(getRequestHeader('host'))
});
},
removeItem(key: string) {
// don't remove the session if there isn't one
if (!currentSession) {
return;
}
setCookie(key, '', {
domain,
path,
expires: new Date(0),
httpOnly: false,
sameSite,
secure: secure ?? isSecureEnvironment(getRequestHeader('host'))
});
}
}
}
});
}