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 harmony
Turn 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 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
Pre-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 waitFor
that either returns a value or throws an error from the result channel. - Exception propagation & stack capturing.
- Special
- Explore how deep
yield
s (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.