@@ -63,14 +63,15 @@ type CookieSettings = {
63
63
expiresIn : number | "session" ;
64
64
} ;
65
65
66
- export type BaseCookieSourceOptions = {
66
+ export type BaseCookieSourceOptions < TRequest > = {
67
67
secure : boolean ;
68
68
sameSite : "strict" | "lax" | "none" | boolean ;
69
- refreshTokenPath : string ;
69
+ refreshTokenPath : string | ( ( request : TRequest ) => string | undefined ) ;
70
70
cookieNames ?: Partial < CookieNames > ;
71
71
guestToken ?: CookieSettings ;
72
72
userToken ?: CookieSettings ;
73
73
refreshToken ?: CookieSettings ;
74
+ cookiePathFn ?: ( request : TRequest ) => string | undefined ;
74
75
} ;
75
76
76
77
export abstract class BaseCookieTokenSource < TRequest , TResponse >
@@ -79,7 +80,7 @@ export abstract class BaseCookieTokenSource<TRequest, TResponse>
79
80
protected cookieNames : CookieNames ;
80
81
protected abstract adapter : CookieAdapter < TRequest , TResponse > ;
81
82
82
- constructor ( protected options : BaseCookieSourceOptions ) {
83
+ constructor ( protected options : BaseCookieSourceOptions < TRequest > ) {
83
84
this . cookieNames = {
84
85
...DEFAULT_COOKIE_NAMES ,
85
86
...( options . cookieNames ?? { } ) ,
@@ -96,7 +97,7 @@ export abstract class BaseCookieTokenSource<TRequest, TResponse>
96
97
97
98
deleteRefreshToken ( request : TRequest , response : TResponse ) : void {
98
99
this . adapter . clearCookie ( request , response , this . cookieNames . refreshToken , {
99
- path : this . options . refreshTokenPath ,
100
+ path : this . _getRefreshTokenPath ( request ) ,
100
101
domain : this . adapter . getPrivateDomain ( request ) ,
101
102
} ) ;
102
103
@@ -128,6 +129,7 @@ export abstract class BaseCookieTokenSource<TRequest, TResponse>
128
129
if ( this . adapter . getCookie ( request , name ) ) {
129
130
this . adapter . clearCookie ( request , response , name , {
130
131
domain : this . adapter . getPublicDomain ( request ) ,
132
+ path : this . options . cookiePathFn ?.( request ) ?? "/" ,
131
133
} ) ;
132
134
}
133
135
}
@@ -140,6 +142,7 @@ export abstract class BaseCookieTokenSource<TRequest, TResponse>
140
142
if ( this . adapter . getCookie ( request , name ) ) {
141
143
this . adapter . clearCookie ( request , response , name , {
142
144
domain : this . adapter . getPublicDomain ( request ) ,
145
+ path : this . options . cookiePathFn ?.( request ) ?? "/" ,
143
146
} ) ;
144
147
}
145
148
}
@@ -180,7 +183,7 @@ export abstract class BaseCookieTokenSource<TRequest, TResponse>
180
183
opts . expiresIn === "session"
181
184
? undefined
182
185
: new Date ( Date . now ( ) + opts . expiresIn * 1000 ) ,
183
- path : "/" ,
186
+ path : this . options . cookiePathFn ?. ( request ) ?? "/" ,
184
187
} ;
185
188
186
189
if ( isAuthenticated ) {
@@ -189,7 +192,7 @@ export abstract class BaseCookieTokenSource<TRequest, TResponse>
189
192
response ,
190
193
this . cookieNames . userData ,
191
194
token ,
192
- cookieOptions ,
195
+ cookieOptions
193
196
) ;
194
197
this . deleteAccessTokenByName (
195
198
request ,
@@ -244,7 +247,7 @@ export abstract class BaseCookieTokenSource<TRequest, TResponse>
244
247
opts . expiresIn === "session"
245
248
? undefined
246
249
: new Date ( Date . now ( ) + opts . expiresIn * 1000 ) ,
247
- path : "/" ,
250
+ path : this . options . cookiePathFn ?. ( request ) ?? "/" ,
248
251
} ;
249
252
250
253
if ( isAuthenticated ) {
@@ -299,7 +302,7 @@ export abstract class BaseCookieTokenSource<TRequest, TResponse>
299
302
{
300
303
...cookieOptions ,
301
304
httpOnly : true ,
302
- path : this . options . refreshTokenPath ,
305
+ path : this . _getRefreshTokenPath ( request ) ,
303
306
} ,
304
307
) ;
305
308
@@ -331,4 +334,9 @@ export abstract class BaseCookieTokenSource<TRequest, TResponse>
331
334
) ;
332
335
}
333
336
}
337
+
338
+ private _getRefreshTokenPath ( req : TRequest ) : string | undefined {
339
+ const path = this . options . refreshTokenPath ;
340
+ return typeof path === "function" ? path ( req ) : path ;
341
+ }
334
342
}
0 commit comments