Channels

Channels are the pipes that connect concurrent processes. You can send values into channels from one process and receive those values into another process.

Channel Constructor

This constructor constructs a new channel and returns it. A channel exposes some methods to interact with it.

const chan = new Channel();

Methods

put

channel.put(message) -> Promise

The put method takes a message and put it into the channel on which it was called. The put method returns a Promise which can be optionally awaited and will resolve when something is ready to take the message from the channel.

const chan = new Channel();
chan.put(42);

// ...or...

await chan.put(42);

take

channel.take() -> Promise

The take method requires no arguments. The take method returns a Promise which should always be awaited and will resolve with a message, when a message is available.

const chan = new Channel();
chan.put(42);

const msg = await chan.take(); // will receive 42

drain

channel.drain() -> Promise

The drain method requires no arguments. The drain method will drain all messages until the channel empties, returning a Promise that will resolve into an array of messages.

const chan = new Channel();
chan.put(42);
chan.put(41);
chan.put(40);
chan.put(39);

const msgs = await chan.drain(); // will receive [ 42, 41, 40, 39 ]

[Symbol.asyncIterator]

channel[Symbol.asyncIterator]() -> AsyncIterableIterator

Return an async iterator that will iterate over the channel. This enables the following syntax:

for await(const msg of chan) {
    // do stuff with each message 
}

that is a valid substitute of:

while(true) {
    const msg = await chan.take();
    // do stuff with each message 
}

Static Utilities

alts

Channel.alts(...channels) -> Promise

The alts static method will race taking values from multiple channels.

const chan1 = new Channel();
const chan2 = new Channel();

chan2.put(42);
const msg = await Channel.alts(chan1, chan2); // will receive 42

select

Channel.select(Map<*, channel>|Set<channel>|Array<channel>|Object<string, channel>) -> Promise

The select static method will race taking values from multiple channels, similar to alts, but will also return the key of the channel that was selected.

const chan1 = new Channel();
const chan2 = new Channel();

chan2.put(42);
const channels = [chan1, chan2];
const result = await Channel.select(channels); // will receive [1, 42]

Works with Map and Set as well as with plain-old javascript arrays and objects.

merge

Channel.merge(...channels) -> channel

The merge static method will merge together multiple channels, returning a new one that will receive each value inserted into one of its input channels. As soon as a value is available from one of the input channels, it will be putted into the resulting channel.

const chan1 = new Channel();
const chan2 = new Channel();

const resCh = Channel.merge(chan1, chan2);

chan1.put(1);
chan1.put(2);
chan1.put(3);
chan2.put(4);
chan2.put(5);
chan2.put(6);

// the 'merge' static method let all the values contained into the input channels to flow
const result = await resCh.drain(); // will receive [1, 4, 2, 5, 3, 6]

mergeDelayed

Channel.mergeDelayed(...channels) -> channel

The mergeDelayed static method will merge together multiple channels, returning a new one that will receive each value inserted into one of its input channels. Before taking the next value from one of the input channels, a corresponding take operation will be waited (implicitly contained into the drain method).

const chan1 = new Channel();
const chan2 = new Channel();

const resCh = Channel.mergeDelayed(chan1, chan2);

chan1.put(1);
chan1.put(2);
chan1.put(3);
chan2.put(4);
chan2.put(5);
chan2.put(6);

// the 'mergeDelayed' static method let only one value contained
// into each input channels (if present) to flow
const result = await resCh.drain(); // will receive [1, 4]