Elixir-style actors in JavaScript. Spawn "processes", then send and receive messages between them – just like you would in Elixir.
You can think of it as co
, but with message passing.
NOTE: Don't use this library. Currently, it doesn't use Web Workers or Node's child_process
under the hood (and I lack the motivation to write a Web Workers / child_process
implementation), so your code isn't actually run in parallel. I mostly wrote this library as an experiment in Elixir-flavored API design.
You can probably find better Web Workers helper libs on npm.
const pid = spawn(async function() {
const msg = await this.receive(mail => {
if (mail === 'hello') return 'world'
})
console.log(msg)
})
pid.send('hello')
See the included examples for more use cases.
$ yarn add actorjs
Spawn a "process" that will execute the passed-in function.
const pid = spawn(async function(foo, bar) {
console.log("wee i'm in a process sorta")
}, 'foo', 'bar')
Send a message to a PID.
pid.send(['ok', 'this is a message'])
Block until a received message matches the passed-in pattern
function.
The pattern
function takes an arbitrary message
as input, and returns a result based on that message
. By default, the pattern
function is the identity function.
A result of undefined
is not considered to be a match, and thus this.receive()
will continue blocking.
const pid = spawn(async function() {
let v = await this.receive(msg => {
const [status, value] = msg
if (status === 'hello') return value
if (status === 'world') return "won't match"
})
v = await this.receive()
})
pid.send(['hello', 'yes this is dog'])
pid.send('anything')
The return value of spawn()
is a thenable.
spawn(async function() {
// ...
})
.then(value => { /* ... */ })
.catch(console.error)
MIT