Skip to content
Communicating Sequential Processes in JavaScript
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
__tests__
assets
docs
src
.eslintrc.js
.gitignore
.travis.yml add API documentation Mar 22, 2019
LICENSE
README.md
jest.config.js
package-lock.json
package.json
tsconfig.build.json
tsconfig.json

README.md

@jfet97/csp

A library for Communicating Sequential Processes, built on top of async/await and the asynchronous iterable interface.

npm version

Installation

This library requires async/await and for-await-of support.

$ npm install --save @jfet97/csp

Docs

You can find the documentation here.

Example Usage

Below is a trivial example of usage, that plays on the standard ping-pong example.

const { Channel } = require('@jfet97/csp');

const timeout = ms => new Promise(resolve => setTimeout(resolve, ms));

const wiff = new Channel();
const waff = new Channel();

const createBall = () => ({ hits: 0, status: '' });

const createBat = async (inbound, outbound) => {
  while (true) {
    const ball = await inbound.take(); // wait for an incoming ball
    ball.hits++;
    ball.status = ball.status === 'wiff!' ? 'waff!' : 'wiff!';
    console.log(`🎾  Ball hit ${ball.hits} time(s), ${ball.status}`);
    await timeout(500); // assume it's going to take a bit to hit the ball
    await outbound.put(ball); // smash the ball back
  }
};

createBat(waff, wiff); // create a bat that will wiff waffs
createBat(wiff, waff); // create a bat that will waff wiffs

waff.put(createBall());

ping pong

Async Iteration Protocol

Channels implement the async iterable interface, so you can transform the following illustrative code:

async function process (inbound, outbound) {
  while (true) {
    const msg = await inbound.take();
    // do stuff with msg
    await outbound.put(res);
  }
};

into a cleaner version, thanks to the powerful for-await-of:

async function process (inbound, outbound) {
  for await(const msg of inbound) {
    // do stuff with msg
    await outbound.put(res);
  }
};

Credits

Thanks to Joe Harlow for his work on this topic. If you are unfamiliar with CSP, I encourage you to see his talk where he describe a simpler version of this library as well.

Contributions

Contributions are welcomed and appreciated!

  1. Fork this repository.
  2. Make your changes, documenting your new code with comments.
  3. Submit a pull request with a sane commit message.

Feel free to get in touch if you have any questions.

License

Please see the LICENSE file for more information.

You can’t perform that action at this time.