TypeScript icon, indicating that this package has built-in type declarations

2.0.0 • Public • Published


signals, in JavaScript, fast

NPM License


Custom event/messaging system for TypeScript/JavaScript inspired by js-signals originally based on EventEmitter3 code base.

There are several advantages to signals over event-emitters (see Comparison between different Observer Pattern implementations). However, the current implementation of js-signals is (arguably) slow compared to other implementations (see EventsSpeedTests). mini-signals is a fast, minimal emitter, with an API similar to js-signals.

Note: Signals here are the type defined by Miller Medeiros in js-signals inspired by AS3-Signals. They should not to be confused with SolidJS or Angular signals.

mini-signals 2.0.0

MiniSignals v2.0.0 has been rewritten in TypeScript and had it's API changed to improve performance and add type safety.

New features:

  • .add now returns a weak node reference which can be used to remove the listener directly from the signal. Reduces memory leaks.
  • .add is now type safe. The type of the listener is checked against the type variable in the constructor as well as an optional "flavor".

Breaking changes:

  • .add now returns a node reference instead of a object. The returned node cannot be removed directly; it must be from the signal using MiniSignal#detach.
  • .once has been removed. Use .add instead with a call to .detach in the callback.
  • The thisArg parameter has been removed from .add. Use .add with a call to .bind or (preferred) use an arrow function with a closure.
  • .dispatch now throws an error if the signal is already dispatching.



npm install mini-signals

Example Usage

import { MiniSignal } from 'mini-signals';

const mySignal = new MiniSignal<[string, string]>();  // the type variable is optional and defines the parameters to be dispatched

const binding = mySignal.add((foo: string, bar: string) => { // add listener, note the parameter types match the type variable in the constructor
  console.log('signal dispatched');
  assert(foo === 'foo');
  assert(bar === 'bar');

mySignal.dispatch('foo', 'bar'); // dispatch signal passing custom parameters
binding.detach(); // remove a single listener

Another Example

const myObject = {
  foo: "bar",
  updated: new MiniSignal<never>() // in this case the type variable is never, since we are not passing any parameters

myObject.updated.add(() => {
  console.log('signal dispatched');
  assert( === 'baz');
}); = 'baz';
myObject.updated.dispatch(); // dispatch signal




Copyright (c) 2015-2023 Jayson Harshbarger

MIT License



Package Sidebar


npm i mini-signals

Weekly Downloads






Unpacked Size

51.2 kB

Total Files


Last publish


  • hypercubed