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

timestore

v1.2.0

Published

Multiple timers manager, especially good for games.

Downloads

4

Readme

timestore npm version downloads/month PayPal donate button

Manage multiple collections of timers: set, clear, pause and resume them. Use it with your game states.

Installation

$ npm install timestore

or, get a browserified and minified version.

Also, check out the example page.

Quick Guide

Let's create a timestore:

var gameTimers = new timestore.Timestore();

That's how simple timers work:

var timeout = gameTimers.setTimeout(someCallback, 1000),
    interval = gameTimers.setInterval(someRepeatingCallback, 100);

// After some time:
interval.clear();

That's how they work, too:

var bomb = gameTimers.setTimeout(bombExplosion, 5000);

someButton.on('click', function () {
    if (bomb.getTimeLeft() > 1000) {
        bomb.pause();
    } else {
        console.log('Too late!');
    }
});

Now, the coolness begins:

function Unit() {
    this.id = 'u' + getUniqueId();
    gameTimers.setInterval(this.id + 'shoot', this.shoot.bind(this), 500);
}

Unit.prototype.shoot = function () {
    // Makes a shot every 500 ms.
};

Unit.prototype.kill = function () {
    gameTimers.clearInterval(this.id + 'shoot');
};

More than that, if your game has levels, you don't have to clear all timers by hand:

gameTimers.clearAll(); // It will clear both timeouts and intervals.
currentLevel = new Level();

If there are, say, locations in your game, and you want to freeze their states, you're welcome:

gameTimers.pauseAll();
// Player is in different location.
gameTimers.resumeAll();

There are two ways to interact with a timer:

var interval = gameTimers.setInterval(callback, 50);

// Directly invoke its methods:
interval.pause();
interval.resume();

// Or, manipulate them by ID:
gameTimers.pauseInterval(interval.id);
gameTimers.clearInterval(interval.id);

The second way may seem a bit strange, but it is very useful, indeed:

var interval = gameTimers.setInterval('someId', ohThatCallbackAgain, 200);

// And you can reach your interval from the farthest corner of your code:
gameTimers.pauseInterval('someId');

In the standard, there is an opportunity to pass optional arguments in the native method: setTimeout(callback, delay, optArg1, optArg2). The syntax in timestore is different but powerful. There are two ways to pass optional arguments:

var timeout = gameTimers.setTimeout(callback, 50);
timeout.callWith(arg1, arg2, arg3); // You can choose between this...
timeout.applyWith([arg1, arg2, arg3]); // ...and this.

And there's the third one which allows to set this context for the callback:

var timeout = gameTimers.setTimeout(someObj.someMethod, 50);
timeout.setThis(someObj);

All three methods work for intervals, too.

You also can use chaining for more natural code:

var interval = gameTimers.setInterval(callback, 50).callWith('give', 'drain').setThis(someObject);
interval.applyWith(['drain', 'gain']); // You can always rewrite optional arguments.

Timeouts and intervals are stored aside from each other so the same IDs can be used for two of them. Though I don't recommend to do so due to the bad readability of the code with somehow doubling IDs.

NOTE: do not use numbers (and strings with just numbers in them, too) as IDs because numbers are used as the inner standard for IDs.

API

Class: Timeout

Syntax: new Timeout(callback, delay, [fireBeforeClear], [id], [onClear]). The last 2 arguments are used internally but will cause no harm if are passed.

  • function callback is just a callback, like in the native setTimeout
  • number delay is simply a number of milliseconds before the callback invocation
  • boolean fireBeforeClear forces the callback to be invoked if the timeout is explicitly cleared
  • string id is used by Timestore class to know all timeouts by "name"
  • function onClear is called when a timeout ends or is explicitly cleared (it is used to remove timeouts from the store)

All methods return this and therefore can be chained (except for .clear() and those which return exact values, like .getTimeLeft()).

Timeout.setThis(thisArg)

Sets this context for callback.

Timeout.callWith(arg1, arg2, ...)

Saves arguments to pass them into callback while it's invoked. Rewrites old arguments if they exist.

Timeout.applyWith(args)

Saves args as arguments to pass them into callback while it's invoked. Rewrites old arguments if they exist.

Timeout.clear()

Simply clears the timeout. If Timeout.fireBeforeClear is set to true its callback will be invoked.

Timeout.pause()

Pauses the timeout, causes no side effects.

Timeout.resume()

Resumes the timeout. If Timeout.delay has been changed so to match a point in the past, the callback will be invoked immediately.

Timeout.toggle()

Pauses or resumes the timeout depending on its current state.

Timeout.changeDelay(newDelay)

Changes Timeout.delay. If it's changed so to match a point in the past, the callback will be invoked immediately.

Timeout.getTimeLeft()

Returns the time left to the callback invocation.

Class: Interval

Syntax: new Interval(callback, delay, [fireBeforeClear], [id], [onClear]). The last 2 arguments are used internally but will cause no harm if are passed.

  • function callback is just a callback, like in the native setInterval; it will be called every delay milliseconds
  • number delay is simply a number of milliseconds before the next callback invocation
  • boolean fireBeforeClear forces the callback to be called if an interval is explicitly cleared
  • string id is used by Timestore class to know all intervals by "name"
  • function onClear is called when an interval is explicitly cleared (it is used to remove intervals from the store)

All methods return this and therefore can be chained (except for .clear() and those which return exact values, like .getTimeLeft()).

Interval.setThis(thisArg)

Sets this context for callback.

Interval.callWith(arg1, arg2, ...)

Saves arguments to pass them into callback while it's invoked (every time). Rewrites old arguments if they exist.

Interval.applyWith(args)

Saves args as arguments to pass them into callback while it's invoked (every time). Rewrites old arguments if they exist.

Interval.clear()

Clears the interval. If Interval.fireBeforeClear is set to true its callback will be invoked (for the last time).

Interval.pause()

Pauses the interval without side effects.

Interval.resume()

Resumes the interval. If Interval.delay has been changed so to match a point in the past, the callback will be invoked immediately.

Interval.toggle()

Pauses or resumes the interval depending on its current state.

Interval.changeDelay(newDelay)

Changes Interval.delay. If it's changed so to match a point in the past, the callback will be invoked immediately. That change affects all callback invocations, not only the current one.

Interval.getTimeLeft()

Returns the time left to the next callback invocation.

Class: Timestore

Syntax: new Timestore().

Timestore.setTimeout([id], callback, delay, fireBeforeClear)

Returns a Timeout object.

  • string id is optional; if there is already a timeout with the same ID, it will be cleared and overwritten

NOTE: don't use numbers as IDs.

Timestore.clearTimeout(id), Timestore.pauseTimeout(id), Timestore.resumeTimeout(id), Timestore.resumeTimeout(id), Timestore.changeTimeoutDelay(id, newDelay), Timestore.getTimeoutTimeLeft(id)

If there is a timeout with a given id, calls the corresponding method of that timeout. Passes the arguments, if any. Returns the return value of that method, if any.

Timestore.clearTimeouts(idArray), Timestore.pauseTimeouts(idArray), Timestore.resumeTimeouts(idArray), Timestore.resumeTimeouts(idArray)

Calls the corresponding method of all the timeouts which IDs are listed in idArray.

Timestore.setInterval([id], callback, delay, fireBeforeClear)

Returns a Interval object.

  • string id is optional; if there is already an interval with the same ID, it will be cleared and overwritten

NOTE: don't use numbers as IDs.

Timestore.clearInterval(id), Timestore.pauseInterval(id), Timestore.resumeInterval(id), Timestore.resumeInterval(id), Timestore.changeIntervalDelay(id, newDelay), Timestore.getIntervalTimeLeft(id)

If there is an interval with a given id, calls the corresponding method of that interval. Passes the arguments, if any. Returns the return value of that method, if any.

Timestore.clearIntervals(idArray), Timestore.pauseIntervals(idArray), Timestore.resumeIntervals(idArray), Timestore.resumeIntervals(idArray)

Calls the corresponding method of all the intervals which IDs are listed in idArray.

Timestore.clearAll()

Clears all timeouts and intervals. Resets inner ID counters to zero. Empties the current timestore. All timeouts and intervals with fireBeforeClear invoke their callbacks.

Timestore.pauseAll()

Pauses all timeouts and intervals without side effects.

Timestore.resumeAll()

Resumes all timeouts and intervals. For those which Interval.delay has been changed so to match a point in the past, the callbacks will be invoked immediately.

Timestore.getTimeouts()

Returns an array of timeout IDs.

Timestore.hasTimeout(id)

Returns true if there is a timeout with a given id. Otherwise, returns false.

Timestore.getIntervals()

Returns an array of interval IDs.

Timestore.hasInterval(id)

Returns true if there is an interval with a given id. Otherwise, returns false.