Communication Sequential Processes in Javascript
Bring Golang-like CSP channel to JS land.
It's based on Promise and works well with generator or async-await function.
Installation
$ npm install gocsp
Usage
Very similar to how channel works in Golang. You can take, put or select values from channels.
var co = require('co')
var csp = require('gocsp')
var player = co.wrap(function* (name, ch) {
for (;;) {
var ball = (yield csp.take(ch)).value
ball += 1
console.log(name, ball)
yield csp.timeout(100)
yield csp.put(ch, ball)
}
})
co(function* () {
var ch = csp.chan()
player('ping', ch)
player('pong', ch)
yield csp.put(ch, 0)
yield csp.timeout(1000)
yield csp.take(ch)
})
API
csp.chan(size)
Create a channel. You can optional support a queue size, default is 0.
csp.chan()
csp.chan(2)
csp.take(ch)
Take a value from channel, returns a promise
csp.take(ch).then(function (result) {
var { done, value } = result
if (done) {
} else {
console.log(value)
}
})
csp.put(ch, value)
Put a value into channel, return a promise
csp.put(ch, value).then(function (ok) {
})
csp.close(ch)
Close a channel. When channel is closed, you cannot put values into it anymore. You may still be able to take remaining queued values from channel.
csp.close(ch)
csp.select(fn)
Choose one of a set of take or put, timeout operations. At most one will success and rest will be cancelled.
csp.select(function (s) {
s.take(ch, function (result) {
var { done, value } = result
})
||
s.put(ch2, value, function (ok) {
})
||
s.timeout(1000, function () {
})
||
s.default(function () {
})
})
License
MIT