Communicating sequential processes for Javascript (like Clojurescript core.async, or Go).
var csp = require("js-csp");Pingpong (ported from Go).
function* player(name, table) {
while (true) {
var ball = yield csp.take(table);
if (ball === csp.CLOSED) {
console.log(name + ": table's gone");
return;
}
ball.hits += 1;
console.log(name + " " + ball.hits);
yield csp.sleep(100);
yield csp.put(table, ball);
}
}
csp.go(function* () {
var table = csp.chan();
csp.go(player, ["ping", table]);
csp.go(player, ["pong", table]);
yield csp.put(table, {hits: 0});
yield csp.sleep(1000);
table.close();
});There are more under examples directory.
This is a very close port of Clojurescript's core.async. The most significant difference is that the IOC logic is encapsulated using generators (yield) instead of macros. Therefore resources on core.async or Go channels are also helpful.
js-csp requires ES6 generators.
Earlier versions of Firefox either had ES6 generators turned off, or supported only old style generators.
Run with --harmony or --harmony-generators flag. Check support using
node --v8-options | grep harmonyTurn on an experimental flag. Look for "Enable Experimental JavaScript" at chrome://flags.
Use one of the js-to-js compilers:
- Facebook Regenerator.
- Google Closure Compiler with
--language_in ECMASCRIPT6 --language_out ECMASCRIPT3flags. - Google Traceur.
Or, if you use Python's Twisted: https://github.com/ubolonton/twisted-csp
Or, if you want a better language: https://github.com/clojure/core.async
It's available for both npm and bower. For browsers, use browserify+npm or browserify+bower+debowerify.
npm install js-cspbower install js-cspPre-built files for (old) browsers may be coming.
- Test operations (map, filter, reduce, pipe...) more thoroughly.
- Use better name for functions.
- Better code style?
- Multiplexing, mixing, publishing/subscribing.
- Add more documentation and examples.
- Add browser builds and tests.
- Add conversion functions that "de-IOC" promises and callback-based APIs (e.g. Web Workers).
- Investigate error handling in goroutines:
- Special
yield waitForthat either returns a value or throws an error from the result channel. - Exception propagation & stack capturing.
- Special
- Explore how deep
yields (yield*) affect composability. - Deadlock detector.
- Hands-on examples.
- http://swannodette.github.io/2013/08/24/es6-generators-and-csp
- https://github.com/clojure/core.async
- https://github.com/olahol/node-csp
Distributed under Eclipse Public License.