npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

expire-unused-keys

v1.4.0

Published

Who wants to keep track of what's not being used? This guy!

Downloads

799

Readme

Build Status

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

    // Some levelUP db
	var db = level('wat')
	// Expire stuff after 15 seconds of inactivity
	var expirer = new Expirer(15000, db)

	// Things are only interesting if they were active in the last 15 seconds
	var areTheseThingsInteresting = {
		'thing1': false,
		'thing2': false
	}

	var activity = function(thingKey) {
		areTheseThingsInteresting[thingKey] = true

		// note that this thing was fiddled with
		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)

    // thing1 will expire after 25 seconds after the first time it was touched
    // thing2 will expire 15 seconds after the first time it was touched

Usage

The module returns a constructor function:

var expireUnusedKeys = require('expire-unused-keys')

expireUnusedKeys(timeoutMs, db, [checkIntervalMs]) - Backwards compatibility

expireUnusedKeys({ timeoutMs, db, [checkIntervalMs,] [repeatExpirations] })

  • 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.
  • repeatExpirations: set to true to emit 'expire' events for keys every timeoutMs milliseconds. By default, keys will be forgotten at the first 'expire' event.

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[, cb])

Forgets about a key. Won't fire any expire events for it (unless you touch that key again).

createIfNotExists(key)

Creates it if it doesn't exist yet. If you called touch on the key without calling forget since, this will not create the key. If you have never called touch, or have called forget since, this will update the timestamp just like calling touch.

Note: It is possible to create a race condition if you call touch and createIfNotExists around the same time on a key that doesn't exist yet. In that case, the key will be created, and the timestamp will be updated once or twice around the same time.

stop()

Shuts down any timeouts that are floating around, letting you shut down your server nicely and stuff.

License

WTFPL