Skip to main content
Deno 2 is finally here 🎉️
Learn more

Async Channels

Test

Inspired by Go & Clojure Channels, async_channels provides channels as an asynchronous communication method between asynchronous functions.

Installation

Vanilla JS (CDN)

Import the module from one of the CDNs that mirror npmjs.com:

import { Channel } from "https://cdn.skypack.dev/@eyalsh/async_channels";
const ch = new Channel();
// ...

Vanilla JS (Download)

A compiled version exists for every major dependency management system in the releases section.
Download one of them and import it

import { Channel } from "/path/to/async_channels.esm.js";
const ch = new Channel();
// ...

NPM (ESM)

Released under both npmjs & github packages:

import { Channel } from "@eyalsh/async_channels"; // or "@eyal-shalev/async_channels" for github packages.
const ch = new Channel();
// ...

NPM (CommonJS)

Released under both npmjs & github packages:

const { Channel } = require("@eyalsh/async_channels"); // or "@eyal-shalev/async_channels" for github packages.
const ch = new Channel();
// ...

Deno

import { Channel } from "https://deno.land/x/async_channels/mod.ts";
const ch = new Channel<unknown>();

Example

import { Channel } from "https://deno.land/x/async_channels/mod.ts";

const sleep = (duration: number) =>
  new Promise<void>((res) => {
    setTimeout(() => res(), duration);
  });

function produce(num: number) {
  const ch = new Channel(0);
  (async () => {
    for (let i = 0; i < num; i++) {
      await sleep(500); // Do some work...
      await ch.add(i++);
    }
    ch.close();
  })();

  return ch;
}

sleep(200).then(() => console.log("boo"));

for await (let product of produce(5)) {
  console.log({ product });
}