The Divine Synchronization Library

Downloads in past


511.2.13 years ago4 years agoMinified + gzip package size for @divine/synchronization in KB


The Divine Synchronization Library
npm version Build Status Coverage Status


Many JavaScript or TypeScript developers don't think much about synchronization, even if they should. While it's true that JavaScript in Node.js or on the web is single-threaded, anytime an asynchronous function call is invoked, something else might be executed before control is handed back to your callback.
This library contains a classical set of high-quality synchronization primitives that can be used to protect critical sections in such code.
It's written in TypeScript (which means it provides excellent IDE/editor support out of the box) and down-compiled to ES5, so it works equally well in Node.js or in any web browser (a Promise polyfill might be required, though).

About fairness

Most synchronization primitives in this library has a "fair" counterpart, that requires the waiter to provide an ID token. The waiters are then woken up not in FIFO order but in such a way that each ID is processed before a waiter with a duplicate ID.

Provided primitives

This section lists the synchronization primitives provided by this library.


Although not really a classical primitive, it's a fair queue based on the paper Efficient Fair Queuing Using Deficit Round-Robin. It's more or less just a TypeScript rewrite of Matt Lavin's drr-fair-queue.
This queue is the foundation of all the "fair" variants of the synchronization primitives.

Queue and FairQueue

A blocking queue (strict FIFO, or fair).

Condition and FairCondition

A condition variable implementation with notify(), notifyAll and wait() methods.

Signal and FairSignal

A trivial extension to the condition variable that allows a value to be passed to the waiter.
NOTE: Don't mistake this for a Pub/Sub primitive! While possible, it's very difficult to use these two primitives as event emitters without losing messages. See below instead.

PubSub and FairPubSub

Pub/Sub primitive, with configurable capacity, blocking publishing and generator-based subscription, suitable to be used in a for await-loop.

Semaphore and FairSemaphore

A classical semaphore that can be signaled and waited for. There is also a non-blocking take() method available.

Mutex and FairMutex

Just a semaphore initialized to 1 and with more appropriate method names.

Barrier, Lightswitch and ReadWriteLock

A few extra primitives taken more or less verbatim from the The Little Book of Semaphores
by Allen B. Downey. There are no fair variants of these.