11import { PersistKey } from '@logto/client' ;
22
3- import { unwrapSession , wrapSession } from './session.js' ;
3+ import { createKVSessionWrapper , unwrapSession , wrapSession } from './session.js' ;
44
55const secret = 'secret' ;
66
@@ -23,4 +23,73 @@ describe('session', () => {
2323 const session = await unwrapSession ( cookie , secret ) ;
2424 expect ( session [ PersistKey . IdToken ] ) . toEqual ( 'idToken' ) ;
2525 } ) ;
26+
27+ it ( 'should be able to wrap and unwrap with kv wrapper' , async ( ) => {
28+ const store = new Map < string , string > ( ) ;
29+ const sessionWrapper = createKVSessionWrapper ( {
30+ get : async ( key ) => store . get ( key ) ,
31+ set : async ( key , value ) => {
32+ store . set ( key , value ) ;
33+ } ,
34+ } ) ;
35+
36+ const cookieValue = await sessionWrapper . wrap ( { [ PersistKey . IdToken ] : 'idToken' } , '' ) ;
37+ const session = await sessionWrapper . unwrap ( cookieValue , '' ) ;
38+
39+ expect ( session [ PersistKey . IdToken ] ) . toEqual ( 'idToken' ) ;
40+ } ) ;
41+
42+ it ( 'should reuse the current kv session id and pass options to the adapter' , async ( ) => {
43+ const store = new Map < string , string > ( ) ;
44+ const set = vi . fn ( async ( key : string , value : string , ttl ?: number ) => {
45+ store . set ( key , value ) ;
46+ } ) ;
47+ const sessionWrapper = createKVSessionWrapper (
48+ {
49+ get : async ( key ) => store . get ( key ) ?? null ,
50+ set,
51+ } ,
52+ {
53+ keyPrefix : 'custom_prefix_' ,
54+ ttl : 123 ,
55+ }
56+ ) ;
57+ const existingSessionId = 'session-id' ;
58+ store . set (
59+ `custom_prefix_${ existingSessionId } ` ,
60+ JSON . stringify ( { [ PersistKey . IdToken ] : 'idToken' } )
61+ ) ;
62+
63+ const session = await sessionWrapper . unwrap ( existingSessionId , '' ) ;
64+ const cookieValue = await sessionWrapper . wrap (
65+ { ...session , [ PersistKey . AccessToken ] : 'accessToken' } ,
66+ '' ,
67+ existingSessionId
68+ ) ;
69+
70+ expect ( cookieValue ) . toBe ( existingSessionId ) ;
71+ expect ( set ) . toHaveBeenCalledWith (
72+ `custom_prefix_${ existingSessionId } ` ,
73+ JSON . stringify ( {
74+ [ PersistKey . IdToken ] : 'idToken' ,
75+ [ PersistKey . AccessToken ] : 'accessToken' ,
76+ } ) ,
77+ 123
78+ ) ;
79+ expect ( JSON . parse ( store . get ( `custom_prefix_${ existingSessionId } ` ) ?? '' ) ) . toEqual ( {
80+ [ PersistKey . IdToken ] : 'idToken' ,
81+ [ PersistKey . AccessToken ] : 'accessToken' ,
82+ } ) ;
83+ } ) ;
84+
85+ it . each ( [ 'null' , '1' , '[]' ] ) ( 'should ignore invalid kv session data: %s' , async ( value ) => {
86+ const sessionWrapper = createKVSessionWrapper ( {
87+ get : async ( ) => value ,
88+ set : async ( ) => {
89+ await Promise . resolve ( ) ;
90+ } ,
91+ } ) ;
92+
93+ await expect ( sessionWrapper . unwrap ( 'session-id' , '' ) ) . resolves . toEqual ( { } ) ;
94+ } ) ;
2695} ) ;
0 commit comments