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.timeout(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.timeout(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 harmony
Turn on an experimental flag. Look for "Enable Experimental JavaScript" at chrome://flags.
Use one of the js-to-js compilers:
- Babel
- Facebook Regenerator.
- Google Closure Compiler with
--language_in ECMASCRIPT6 --language_out ECMASCRIPT3
flags. - 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-csp
bower install js-csp
Feel free to open issues for questions/discussions, or create pull requests for improvement.
Some areas that need attention:
- More documentation, examples, and maybe some visualization. Porting RxJS/Bacon examples may help.
- Multiplexing, mixing, publishing/subscribing. These need to be tested more. The API could also be improved.
- Deadlock detection.
- 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 MIT License.