@@ -33,6 +33,7 @@ export const makePersistentCacheStorageFactory =
33
33
resourceName : string ;
34
34
quotaInBytes : number ;
35
35
} ) : Cache < T > => {
36
+ let metadataUpdateQueue = Promise . resolve ( ) ;
36
37
const loaded = createVolatileCache < T > ( ) ;
37
38
const metadataKey = makeMetadataKey ( resourceName ) ;
38
39
const getItemKey = ( key : string ) => makeItemKey ( resourceName , key ) ;
@@ -42,15 +43,22 @@ export const makePersistentCacheStorageFactory =
42
43
return result [ metadataKey ] as Metadata ;
43
44
} ;
44
45
46
+ const updateMetadata = async ( mutate : ( metadata : Metadata ) => Metadata ) => {
47
+ metadataUpdateQueue = metadataUpdateQueue . then ( async ( ) => {
48
+ const currentMetadata = await getMetadata ( ) ;
49
+ const nextMetadata = mutate ( currentMetadata ) ;
50
+ await extensionLocalStorage . set ( { [ metadataKey ] : nextMetadata } ) ;
51
+ } ) ;
52
+ return metadataUpdateQueue ;
53
+ } ;
54
+
45
55
const updateAccessTime = async ( key : string ) => {
46
- const metadata = await getMetadata ( ) ;
47
- const nextMetadata : Metadata = {
56
+ await updateMetadata ( ( metadata ) => ( {
48
57
...metadata ,
49
58
[ key ] : {
50
59
accessTime : Date . now ( )
51
60
}
52
- } ;
53
- await extensionLocalStorage . set ( { [ metadataKey ] : nextMetadata } ) ;
61
+ } ) ) ;
54
62
} ;
55
63
56
64
const isQuotaExceeded = async ( ) => {
@@ -67,7 +75,7 @@ export const makePersistentCacheStorageFactory =
67
75
} ;
68
76
69
77
const evict = async ( ) => {
70
- let metadata = await getMetadata ( ) ;
78
+ const metadata = await getMetadata ( ) ;
71
79
const mostDatedKeysToPurge = Object . entries ( metadata )
72
80
. map ( ( [ key , { accessTime } ] ) => ( { accessTime, key } ) )
73
81
. sort ( ( a , b ) => a . accessTime - b . accessTime )
@@ -78,11 +86,12 @@ export const makePersistentCacheStorageFactory =
78
86
. map ( ( i ) => i . key ) ;
79
87
80
88
await extensionLocalStorage . remove ( mostDatedKeysToPurge ) ;
81
- metadata = await getMetadata ( ) ;
82
- for ( const key of mostDatedKeysToPurge ) {
83
- delete metadata [ key ] ;
84
- }
85
- await extensionLocalStorage . set ( { [ metadataKey ] : metadata } ) ;
89
+ await updateMetadata ( ( currentMetadata ) => {
90
+ for ( const key of mostDatedKeysToPurge ) {
91
+ delete currentMetadata [ key ] ;
92
+ }
93
+ return currentMetadata ;
94
+ } ) ;
86
95
} ;
87
96
88
97
return {
0 commit comments