Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/nucleartide/actor.js
Elixir-style actors in JavaScript
https://github.com/nucleartide/actor.js
actor concurrency elixir event-loop flow receive send spawn
Last synced: about 2 months ago
JSON representation
Elixir-style actors in JavaScript
- Host: GitHub
- URL: https://github.com/nucleartide/actor.js
- Owner: nucleartide
- Archived: true
- Created: 2017-07-02T02:13:22.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2017-09-17T21:49:12.000Z (about 7 years ago)
- Last Synced: 2024-09-25T19:32:10.304Z (about 2 months ago)
- Topics: actor, concurrency, elixir, event-loop, flow, receive, send, spawn
- Language: JavaScript
- Homepage:
- Size: 22.5 KB
- Stars: 51
- Watchers: 2
- Forks: 2
- Open Issues: 4
-
Metadata Files:
- Readme: Readme.md
Awesome Lists containing this project
README
# actor.js
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`](https://github.com/tj/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](https://www.google.com/search?q=npm+web+workers).
---
## Example
```js
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](examples/) for more use cases.
## Install
```
$ yarn add actorjs
```## API
#### `spawn(fn | asyncFn, ...args) => PID`
Spawn a "process" that will execute the passed-in function.
```js
const pid = spawn(async function(foo, bar) {
console.log("wee i'm in a process sorta")
}, 'foo', 'bar')
```#### `PID#send(msg)`
Send a message to a PID.
```js
pid.send(['ok', 'this is a message'])
```#### `this.receive(pattern) => Promise`
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](https://github.com/nucleartide/actor.js/blob/a6ca73c9acf1c5e5ae431ba0f4f3e70bfb6a425e/lib/actor.js#L37).
A result of `undefined` is not considered to be a match, and thus `this.receive()` will continue blocking.
```js
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')
```#### `PID#then(value =>)`, `PID#catch(err =>)`
The return value of `spawn()` is a thenable.
```js
spawn(async function() {
// ...
})
.then(value => { /* ... */ })
.catch(console.error)
```# License
MIT