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

lockal

v2.0.1

Published

A fully-feature locking system on local storage.

Downloads

15

Readme

Lockal

Build Status Coverage Status

Lockal is a bespoke localStorage based locking system, allowing atomic* actions to be performed across tabs and browser windows.

Usage

var Lock = require('lockal').Lock;
var lock = new Lock('myAtomicAction');

lock.acquire(function (err, unlock) {
    if (err) {
        console.log('Unable to get lock!');
    } else{
        doSomethingAtomically();
        unlock();
    }
});

* This is not atomic in the true sense, of course, since Javascript doesn't provide the kind of concurrency necessary to ensure entirely thread-safe operations across multiple tabs. This is as close as we can get, though, and should be "good enough" for 99% of use cases.

lockal.isEnabled

A boolean to indicate whether localStorage is available on the current platform. Attempting to instantiate a Lock class if isEnabled is false will result in an error being thrown.

Class: lockal.Lock(key[, options])

Each Lock class is used to interact with a single lock "key". Options usually need not be given, but may be useful if you want to tweak some internals.

  • lockCheck - Time to wait after a lock to ensure it's not going to be written over by another tab.
  • retryInterval - Duration between retries on mustAcquire.
  • maintainInterval - How often the maintainer should touch the lock.

lock.acquire([ttl][, callback])

Attempts to lock on the key. The lock will remain in place for the TTL, given in milliseconds, or until explicitly unlocked.

Callback will be called with:

  • an Error as its first argument if a lock wasn't made,
  • otherwise, an unlock function as its second argument,
  • and a maintain function as its third argument.

lock.mustAcquire([ttl][, callback])

Similar to lock.acquire, but only runs the callback after a lock was successfully established.

lock.unlock([force])

Unlocks a key if it was locked by this Locker instance. If force is given to be true, the key is unlocked even if the original lock was not put in place by this locker instance.

Returns whether or not the unlock was executed.

lock.maintain()

Keep updating a lock's TTL so long as the instance in in existence, and the lock is maintained. Calling unlock or closing the tab will cause the maintenance to stop, and the lock to therefore be released.