@@ -7,44 +7,58 @@ function isTillKey(key: string) {
77 return key . endsWith ( '.till' ) ;
88}
99
10- export function storageAdapter ( log : ILogger , prefix : string , wrapper : SplitIO . StorageWrapper ) : StorageAdapter {
10+ export function storageAdapter ( log : ILogger , prefix : string , wrapper : SplitIO . SyncStorageWrapper | SplitIO . AsyncStorageWrapper ) : Required < StorageAdapter > {
11+ let keys : string [ ] = [ ] ;
1112 let cache : Record < string , string > = { } ;
1213
13- let connectPromise : Promise < void > | undefined ;
14- let disconnectPromise = Promise . resolve ( ) ;
14+ let loadPromise : Promise < void > | undefined ;
15+ let savePromise = Promise . resolve ( ) ;
16+
17+ function _save ( ) {
18+ return savePromise = savePromise . then ( ( ) => {
19+ return Promise . resolve ( wrapper . setItem ( prefix , JSON . stringify ( cache ) ) ) ;
20+ } ) . catch ( ( e ) => {
21+ log . error ( LOG_PREFIX + 'Rejected promise calling wrapper `setItem` method, with error: ' + e ) ;
22+ } ) ;
23+ }
1524
1625 return {
1726 load ( ) {
18- return connectPromise || ( connectPromise = Promise . resolve ( wrapper . getItem ( prefix ) ) . then ( ( storedCache ) => {
27+ return loadPromise || ( loadPromise = Promise . resolve ( ) . then ( ( ) => {
28+ return wrapper . getItem ( prefix ) ;
29+ } ) . then ( ( storedCache ) => {
1930 cache = JSON . parse ( storedCache || '{}' ) ;
31+ keys = Object . keys ( cache ) ;
2032 } ) . catch ( ( e ) => {
21- log . error ( LOG_PREFIX + 'Rejected promise calling storage getItem, with error: ' + e ) ;
33+ log . error ( LOG_PREFIX + 'Rejected promise calling wrapper ` getItem` method , with error: ' + e ) ;
2234 } ) ) ;
2335 } ,
24- save ( ) {
25- return disconnectPromise = disconnectPromise . then ( ( ) => {
26- return Promise . resolve ( wrapper . setItem ( prefix , JSON . stringify ( cache ) ) ) . catch ( ( e ) => {
27- log . error ( LOG_PREFIX + 'Rejected promise calling storage setItem, with error: ' + e ) ;
28- } ) ;
29- } ) ;
36+ whenSaved ( ) {
37+ return savePromise ;
3038 } ,
3139
3240 get length ( ) {
33- return Object . keys ( cache ) . length ;
41+ return keys . length ;
3442 } ,
3543 getItem ( key : string ) {
3644 return cache [ key ] || null ;
3745 } ,
3846 key ( index : number ) {
39- return Object . keys ( cache ) [ index ] || null ;
47+ return keys [ index ] || null ;
4048 } ,
4149 removeItem ( key : string ) {
50+ const index = keys . indexOf ( key ) ;
51+ if ( index === - 1 ) return ;
52+ keys . splice ( index , 1 ) ;
4253 delete cache [ key ] ;
43- if ( isTillKey ( key ) ) this . save ! ( ) ;
54+
55+ if ( isTillKey ( key ) ) _save ( ) ;
4456 } ,
4557 setItem ( key : string , value : string ) {
58+ if ( keys . indexOf ( key ) === - 1 ) keys . push ( key ) ;
4659 cache [ key ] = value ;
47- if ( isTillKey ( key ) ) this . save ! ( ) ;
60+
61+ if ( isTillKey ( key ) ) _save ( ) ;
4862 }
4963 } ;
5064}
0 commit comments