- From: Thomas Steiner <notifications@github.com>
- Date: Tue, 05 Dec 2017 14:26:14 +0000 (UTC)
- To: w3c/ServiceWorker <ServiceWorker@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/ServiceWorker/issues/863/349319261@github.com>
```Cache.keys()``` returns results [in insertion order](https://w3c.github.io/ServiceWorker/#cache-keys), so the cache replacement policies [FIFO](https://en.wikipedia.org/wiki/Cache_replacement_policies#First_In_First_Out_(FIFO)) and [LIFO](https://en.wikipedia.org/wiki/Cache_replacement_policies#Last_In_First_Out_(LIFO)) are straightforward.
It would, however, be convenient if there was a direct way to get the "last accessed time" (and maybe even the "added time") in a fictive ```Cache.has(request, option)``` method (that would *not* return a ```Response``` like ```Cache.match(request, option)```, but rather a likewise fictive ```CacheItem``` object with the ```timeAdded``` and ```timeLastAccessed``` timestamps and a ```matches``` boolean) for more straightforward [LRU](https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_Recently_Used_(LRU))/[MRU](https://en.wikipedia.org/wiki/Cache_replacement_policies#Most_Recently_Used_(MRU)).
Note that this is already possible now, but there is quite some overhead—via @wanderview's [comment](https://github.com/w3c/ServiceWorker/issues/587#issue-51615947):
```javascript
var cache;
cache.open('foo').then(function(foo) {
cache = foo;
return cache.match(request);
}).then(function(response) {
if (response) {
// update order of entries in keys()
cache.put(request, response.clone()); // <== overhead happens here
return response;
}
var maxItems = 100;
return addToLRU(cache, maxItems, request);
});
function addToLRU(cache, maxItems, request) {
return cache.keys().then(function(keys) {
if (keys.length < maxItems) {
return cache.add(request);
}
return cache.delete(keys[0]).then(function() {
return cache.add(request);
});
});
}
```
This would not take care of eviction ([why no eviction](https://wiki.whatwg.org/wiki/Storage#Why_no_eviction_event.3F)), but simplify common cache replacement policies, without having to [resort to ```IndexedDB```](https://github.com/GoogleChrome/workbox/blob/09f6340fc6f9bd511e1fc160a2e71bde65c549de/packages/workbox-cache-expiration/models/CacheTimestampsModel.mjs). What do you think?
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/ServiceWorker/issues/863#issuecomment-349319261
Received on Tuesday, 5 December 2017 14:26:38 UTC