So I'm writing this other library that needs to do some basic caching, right? You know - the first hard thing. (For an idea of my work on the second hard thing, see the examples below.)
It's not so much that I need flotsam deleted right away when it expires as I want the value to be refreshed every so often, and if that value goes a long enough time with out being accessed, theeeeen I'll drop it.
To lessen the pain in this task, I need a library that will keep track of what the last time was when I accessed something, and alert me if a certain amount of time passes without that thing being touched. So, making the assumption that those "somethings" can be identified by a string, and the assertion that I will need these last-access-times to persist even after reopening the screen or re-launching the process, I wrote this-here code.
It stores last-access times in a LevelUP db - if you don't need persistence, throw level-mem at it.
Example
var db = level('wat')
var expirer = new Expirer(15000, db)
var areTheseThingsInteresting = {
'thing1': false,
'thing2': false
}
var activity = function(thingKey) {
areTheseThingsInteresting[thingKey] = true
expirer.touch(thingKey)
}
expirer.on('expire', function(thingKey) {
console.log(thingKey + " expired!")
areTheseThingsInteresting[thingKey] = false
})
activity('thing1')
activity('thing2')
setTimeout(function() {
activity('thing1')
}, 10 * 1000)
Usage
The module returns a constructor function:
(timeoutMs, db[, checkIntervalMs])
- timeoutMs: how many milliseconds the object will wait before it emits an 'expire' event for a touched key
- db: a LevelUP data store of some kind
- checkIntervalMs: right now, this library works by iterating over all keys and emitting expire events for any items that were last touched timeoutMs ago. This value prescribes how often the keys should be iterated over. Defaults to 1000.
The resulting object is an EventEmitter with the following functions as properties:
touch(key)
Updates the "last touched" timestamp. Expire events will not fire for a key until at least timeoutMs after the last time the key was touched.
forget(key)
Forgets about a key. Won't fire any expire events for it (unless you touch that key again).
stop()
Shuts down any timeouts that are floating around, letting you shut down your server nicely and stuff.
License
WTFPL