-
Notifications
You must be signed in to change notification settings - Fork 7
/
CookieStore.ts
57 lines (43 loc) · 1.99 KB
/
CookieStore.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
import { encryptCryptoJSAES, decryptCryptoJSAES } from '../crypto.ts';
import type { Context, CookiesGetOptions, CookiesSetDeleteOptions } from '../../deps.ts'
import type { SessionData } from '../Session.ts'
interface CookieStoreOptions {
cookieGetOptions?: CookiesGetOptions;
cookieSetDeleteOptions?: CookiesSetDeleteOptions;
sessionDataCookieName?: string
}
export default class CookieStore {
encryptionKey: string
cookieGetOptions: CookiesGetOptions;
cookieSetDeleteOptions: CookiesSetDeleteOptions;
sessionDataCookieName: string;
constructor(encryptionKey : string, options? : CookieStoreOptions) {
this.encryptionKey = encryptionKey
this.cookieGetOptions = options?.cookieGetOptions ?? {}
this.cookieSetDeleteOptions = options?.cookieSetDeleteOptions ?? {}
this.sessionDataCookieName = options?.sessionDataCookieName ?? 'session_data'
}
async getSessionByCtx(ctx : Context) : Promise<SessionData | null> {
const sessionDataString : string | undefined = await ctx.cookies.get(this.sessionDataCookieName, this.cookieGetOptions)
if (!sessionDataString) return null;
try {
const decryptedCookie = await decryptCryptoJSAES(sessionDataString, this.encryptionKey)
return JSON.parse(decryptedCookie)
} catch {
return null
}
}
async createSession(ctx : Context, initialData : SessionData) {
const dataString = JSON.stringify(initialData)
const encryptedCookie = await encryptCryptoJSAES(dataString, this.encryptionKey)
await ctx.cookies.set(this.sessionDataCookieName, encryptedCookie, this.cookieSetDeleteOptions)
}
deleteSession(ctx : Context) {
ctx.cookies.delete(this.sessionDataCookieName, this.cookieSetDeleteOptions)
}
async persistSessionData(ctx : Context, data : SessionData) {
const dataString = JSON.stringify(data)
const encryptedCookie = await encryptCryptoJSAES(dataString, this.encryptionKey)
await ctx.cookies.set(this.sessionDataCookieName, encryptedCookie, this.cookieSetDeleteOptions)
}
}