1
+ import type { RecursiveRecord } from '~/utils/typescript.utils' ;
2
+
1
3
/**
2
4
* @see [chrome.storage.sync](https://developer.chrome.com/docs/extensions/reference/storage/#type-SyncStorageArea)
3
5
*/
@@ -21,23 +23,38 @@ const filterObject = (object: Record<string, unknown>, regex: string) =>
21
23
* @param area The storage area to wrap.
22
24
* @param name The name of the storage area.
23
25
*/
24
- export const storageWrapper = ( area : chrome . storage . StorageArea , name = crypto . randomUUID ( ) ) => {
26
+ export const storageWrapper = ( area : chrome . storage . StorageArea , name : string ) => {
25
27
if ( ! chrome ?. storage ) {
26
- console . warn ( 'Storage API is not available, using in-memory storage instead.' ) ;
27
- const storage : Record < string , unknown > = { } ;
28
- window . trakt = { ...window . trakt , [ name ] : storage } ;
29
- return {
30
- getAll : async < T > ( regex ?: string ) : Promise < T > => ( regex ? filterObject ( storage , regex ) : storage ) as T ,
31
- get : async < T > ( key : string ) : Promise < T > => storage [ key ] as T ,
32
- set : async < T > ( key : string , value : T ) : Promise < void > => {
33
- storage [ key ] = value ;
28
+ console . warn ( 'Storage API is not available, using local storage instead.' ) ;
29
+
30
+ const storage = {
31
+ id : `trakt-${ name } -storage` ,
32
+ get values ( ) : RecursiveRecord {
33
+ const _value = window . localStorage . getItem ( this . id ) ;
34
+ if ( ! _value ) return { } ;
35
+ return JSON . parse ( _value ) ;
36
+ } ,
37
+ set values ( value : unknown ) {
38
+ window . localStorage . setItem ( this . id , JSON . stringify ( value ) ) ;
34
39
} ,
35
- remove : async ( key : string ) : Promise < void > => {
36
- delete storage [ key ] ;
40
+ setItem ( key : string , value : unknown ) {
41
+ this . values = { ... this . values , [ key ] : value } ;
37
42
} ,
38
- clear : async ( ) : Promise < void > => {
39
- Object . keys ( storage ) . forEach ( key => delete storage [ key ] ) ;
43
+ removeItem ( key : string ) {
44
+ this . values = { ... this . values , [ key ] : undefined } ;
40
45
} ,
46
+ clear ( ) {
47
+ this . values = { } ;
48
+ } ,
49
+ } ;
50
+
51
+ window . trakt = { ...window . trakt , [ name ] : storage } ;
52
+ return {
53
+ getAll : async < T > ( regex ?: string ) : Promise < T > => ( regex ? filterObject ( storage . values , regex ) : storage . values ) as T ,
54
+ get : async < T > ( key : string ) : Promise < T > => storage . values [ key ] as T ,
55
+ set : async < T > ( key : string , value : T ) : Promise < void > => storage . setItem ( key , value ) ,
56
+ remove : async ( key : string ) : Promise < void > => storage . removeItem ( key ) ,
57
+ clear : async ( ) : Promise < void > => storage . clear ( ) ,
41
58
} ;
42
59
}
43
60
return {
@@ -55,7 +72,7 @@ export type StorageArea = ReturnType<typeof storageWrapper>;
55
72
* This object is used to access the storage areas.
56
73
*/
57
74
export const storage = {
58
- sync : storageWrapper ( syncStorage ) ,
59
- local : storageWrapper ( localStorage ) ,
60
- session : storageWrapper ( sessionStorage ) ,
75
+ sync : storageWrapper ( syncStorage , 'sync' ) ,
76
+ local : storageWrapper ( localStorage , 'local' ) ,
77
+ session : storageWrapper ( sessionStorage , 'session' ) ,
61
78
} ;
0 commit comments