@@ -3,6 +3,7 @@ import { headers } from "next/headers";
33import { cookies } from "next/headers" ;
44import { redirect } from "next/navigation" ;
55import { type Session , getGlobalConfig } from "./index" ;
6+ import { RefreshAccessToken } from "./lib/oauth" ;
67import jwt from "jsonwebtoken" ;
78
89export const getSession = async ( ) : Promise < Session | null > => {
@@ -12,7 +13,28 @@ export const getSession = async (): Promise<Session | null> => {
1213 if ( ! token ) return null ;
1314
1415 try {
15- return jwt . verify ( token , config . jwtSecret ) as Session ;
16+ const session = jwt . verify ( token , config . jwtSecret ) as Session ;
17+ if ( session . expires ) {
18+ const expiresAt = new Date ( session . expires ) ;
19+ if ( expiresAt < new Date ( ) ) {
20+ cookieStore . delete ( "AUTH_SESSION" ) ;
21+ return null ;
22+ } else {
23+ const timeUntilExpiration = expiresAt . getTime ( ) - Date . now ( ) ;
24+ if ( timeUntilExpiration < 5 * 60 * 1000 ) { // less than 5 minutes
25+ const refreshedSession = await RefreshAccessToken ( config , session . refreshToken || "" ) ;
26+ if ( refreshedSession ) {
27+ session . accessToken = refreshedSession . accessToken ;
28+ session . refreshToken = refreshedSession . refreshToken ;
29+ session . expires = new Date ( Date . now ( ) + refreshedSession . expiresIn * 1000 ) . toISOString ( ) ;
30+ const newToken = jwt . sign ( session , config . jwtSecret ) ;
31+ cookieStore . set ( "AUTH_SESSION" , newToken , { sameSite : "lax" , httpOnly : true , secure : true } ) ;
32+ }
33+ }
34+ return session ;
35+ }
36+ }
37+ return null ;
1638 } catch ( error ) {
1739 console . error ( "Invalid token:" , error ) ;
1840 return null ;
0 commit comments