@@ -22,42 +22,79 @@ export function getLocal() {
2222 return browser . storage . local ;
2323}
2424
25- export function getSession ( ) {
26- if ( 'session' in browser . storage ) {
27- return browser . storage . session ;
28- }
29-
25+ function createFakeSession ( ) {
3026 const mapKey = ( key : string ) => `sess_${ key } ` ;
3127
32- const session = new Proxy ( getLocal ( ) , {
28+ const local = getLocal ( ) ;
29+
30+ const fakeSessionOnChange = new Map < CallableFunction , any > ( ) ;
31+
32+ const mapKeys = ( keys : string | string [ ] ) =>
33+ Array . isArray ( keys ) ? keys . map ( mapKey ) : mapKey ( keys ) ;
34+
35+ const onChange = {
36+ addListener ( callback : CallableFunction ) {
37+ const wrappedCallback = ( changes : Record < string , any > ) => {
38+ const newChanges = Object . fromEntries (
39+ Object . entries ( changes )
40+ . filter ( ( [ key ] ) => key . startsWith ( 'sess_' ) )
41+ . map ( ( [ key , value ] ) => [ key . replace ( / ^ s e s s _ / , '' ) , value ] ) ,
42+ ) ;
43+ if ( Object . keys ( newChanges ) . length > 0 ) {
44+ callback ( newChanges ) ;
45+ }
46+ } ;
47+ fakeSessionOnChange . set ( callback , wrappedCallback ) ;
48+ local . onChanged . addListener ( wrappedCallback ) ;
49+ } ,
50+ removeEventListener ( callback : CallableFunction ) {
51+ const wrappedCallback = fakeSessionOnChange . get ( callback ) ;
52+ if ( wrappedCallback ) {
53+ local . onChanged . removeListener ( wrappedCallback ) ;
54+ fakeSessionOnChange . delete ( callback ) ;
55+ }
56+ } ,
57+ hasEventListener ( callback : CallableFunction ) {
58+ return fakeSessionOnChange . has ( callback ) ;
59+ } ,
60+ } ;
61+
62+ const session = new Proxy ( local , {
3363 get ( target , prop ) {
3464 if ( prop === 'set' ) {
3565 return ( items : Record < string , any > ) => {
3666 target . set (
3767 Object . fromEntries (
38- Object . entries ( items ) . map ( ( [ key , value ] ) => [
39- mapKey ( key ) ,
40- { value } ,
41- ] ) ,
68+ Object . entries ( items ) . map ( ( [ key , value ] ) => [ mapKey ( key ) , value ] ) ,
4269 ) ,
4370 ) ;
4471 } ;
4572 }
4673 if ( prop === 'get' ) {
47- return ( keys : string | string [ ] ) => {
48- return target . get (
49- Array . isArray ( keys ) ? keys . map ( mapKey ) : mapKey ( keys ) ,
50- ) ;
51- } ;
74+ return ( keys : string | string [ ] ) => target . get ( mapKeys ( keys ) ) ;
5275 }
5376 if ( prop === 'remove' ) {
54- return ( keys : string | string [ ] ) => {
55- target . remove ( Array . isArray ( keys ) ? keys . map ( mapKey ) : mapKey ( keys ) ) ;
56- } ;
77+ return ( keys : string | string [ ] ) => target . remove ( mapKeys ( keys ) ) ;
78+ }
79+ if ( prop === 'onChanged' ) {
80+ return onChange ;
5781 }
5882 return Reflect . get ( target , prop ) ;
5983 } ,
6084 } ) ;
6185
6286 return session ;
6387}
88+
89+ let fakeSessionStorage : ReturnType < typeof createFakeSession > | undefined ;
90+ export function getSession ( ) {
91+ if ( 'session' in browser . storage ) {
92+ return browser . storage . session ;
93+ }
94+
95+ if ( ! fakeSessionStorage ) {
96+ fakeSessionStorage = createFakeSession ( ) ;
97+ }
98+
99+ return fakeSessionStorage ;
100+ }
0 commit comments