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 🙏

© 2025 – Pkg Stats / Ryan Hefner

signaller

v3.0.1

Published

Call a function when a value changes.

Downloads

16

Readme

Signaller

Call a function when a value changes.

Multiple changes are handled efficiently, making this library useful to propagate new application state to components.

390 bytes (minified + gzipped).

If you're viewing this on the web, Signaller, watch(), and use(), are available to try in your JavaScript console.

Installation

Either use src/signaller.js directly as a JavaScript module or install it via a package manager.

npm install signaller

Example

import {Signaller, use} from "signaller.js";

// Create some Signallers to hold state.
const name = new Signaller("Pickles");
const count = new Signaller(10);

// Call a function now and when a value changes.
use([name, count], () => {
    console.log(`${name.value}: ${count.value}`);
});

// Multiple synchronous updates will only call
// the function once with the latest value.
name.value = "Bananas";
name.value = "Cookies";
count.value++;

// Hmmm. More cookies, please.
setTimeout(() => count.value = 200, 1000);

Output:

Pickles: 10
Cookies: 11
Cookies: 200

Tests

deno test

Signaller(initial)

Represents a value that may change multiple times.

Properties

.value

The current value of the Signaller. Setting this property to a value that is not strictly equal to the old value will automatically call signal().

Methods

.signal()

Takes all callbacks from the waiting list (clearing it) and calls each callback synchronously in the order they were added.

You do not need to call this function directly unless you have mutated the underlying value and wish to signal the change to any watchers manually.

.wait(callback)

Appends a callback to the waiting list that will be called on the next signal. The callback function is called with this Signaller instance as its only argument. Its return value is ignored.

Normally, you would use use() or watch() instead of calling this method directly.

.unwait(callback)

Removes the first matching callback from the waiting list (if any). Does nothing if callback has not been registered and will not throw.

Normally, you would use the stop function returned by use() or watch() instead of calling this method directly.

watch(signallers, handler)

Watches an Array of Signallers for changes.

The handler will always be called asynchronously following a signal. Multiple signals before the next handler completes will not queue multiple handler calls. This means not every intermediate value of a Signaller will necessarily be seen by the handler.

The handler receives an Array of Signaller instances that have signalled since the last time the handler was called. If the handler returns a Promise, the handler will not be called again until the Promise completes.

Returns

A function to stop watching for signals. After calling this function, the handler is guaranteed to not be called by again even if a signal is queued.

use(signallers, handler)

Immediately calls the handler with an Array of Signallers, then watches the Signallers for changes.

Multiple signals before the next handler completes will not queue multiple handler calls. This means not every intermediate value of a Signaller will necessarily be seen by the handler.

The handler receives an Array of Signaller instances that have signalled since the last time the handler was called (or all signallers on the first call). If the handler returns a Promise, the handler will not be called again until the Promise completes.

Returns

A function to stop watching for signals. After calling this function, the handler is guaranteed to not be called by again even if a signal is queued.