@@ -33,6 +33,7 @@ export const makePersistentCacheStorageFactory =
3333 resourceName : string ;
3434 quotaInBytes : number ;
3535 } ) : Cache < T > => {
36+ let metadataUpdateQueue = Promise . resolve ( ) ;
3637 const loaded = createVolatileCache < T > ( ) ;
3738 const metadataKey = makeMetadataKey ( resourceName ) ;
3839 const getItemKey = ( key : string ) => makeItemKey ( resourceName , key ) ;
@@ -42,15 +43,22 @@ export const makePersistentCacheStorageFactory =
4243 return result [ metadataKey ] as Metadata ;
4344 } ;
4445
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+
4555 const updateAccessTime = async ( key : string ) => {
46- const metadata = await getMetadata ( ) ;
47- const nextMetadata : Metadata = {
56+ await updateMetadata ( ( metadata ) => ( {
4857 ...metadata ,
4958 [ key ] : {
5059 accessTime : Date . now ( )
5160 }
52- } ;
53- await extensionLocalStorage . set ( { [ metadataKey ] : nextMetadata } ) ;
61+ } ) ) ;
5462 } ;
5563
5664 const isQuotaExceeded = async ( ) => {
@@ -67,7 +75,7 @@ export const makePersistentCacheStorageFactory =
6775 } ;
6876
6977 const evict = async ( ) => {
70- let metadata = await getMetadata ( ) ;
78+ const metadata = await getMetadata ( ) ;
7179 const mostDatedKeysToPurge = Object . entries ( metadata )
7280 . map ( ( [ key , { accessTime } ] ) => ( { accessTime, key } ) )
7381 . sort ( ( a , b ) => a . accessTime - b . accessTime )
@@ -78,11 +86,12 @@ export const makePersistentCacheStorageFactory =
7886 . map ( ( i ) => i . key ) ;
7987
8088 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+ } ) ;
8695 } ;
8796
8897 return {
0 commit comments