Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/shakyshane/actor-js

Exploring the potential benefits of implementing APIs in the style of the Actor Model, even in single-threaded programming environments such as Javascript.
https://github.com/shakyshane/actor-js

Last synced: about 1 month ago
JSON representation

Exploring the potential benefits of implementing APIs in the style of the Actor Model, even in single-threaded programming environments such as Javascript.

Awesome Lists containing this project

README

        

# Actor Model in JS

> Exploring the potential benefits of implementing APIs in the *style* of the Actor Model,
even in single-threaded programming environments such as Javascript.

## TODO

### Actor system `ActorSystem`

- [x] `createSystem()`
- [x] `system.actorOf(IActorFactory) -> ActorRef`

### Actors `Actor`

- [x] `actor.tell()` - fire & forget message
- [x] `actor.ask()` - ask & await async response from an actor
- [x] `actor.stop()` - send a message instructing an actor to terminate

### Actor context `ActorContext`
- [x] `context.stop(IActorRef)` - allow an actor to be stopped via a ref
- [x] `context.gracefulStop(IActorRef)` - allow an actor to be stopped via a ref with confirmation (for sequencing etc)
- [x] `context.actorOf(IActorFactory)` - allow an actor to create more actors
- [x] `context.parent` - allow an actor to access it's parent (in order to send it messages)
- [x] `context.self` - allow an actor to access it's own ref (in order to send it's self messages)
- [ ] `context.become(newHandler)` - designate a new handler for future messages [http://doc.akka.io/docs/akka/current/scala/actors.html#Graceful_Stop](http://doc.akka.io/docs/akka/current/scala/actors.html#Graceful_Stop)
- [x] `context.actorSelection(lookup: string)` - allow actor lookups via paths, such as `/system` `/deadletter` etc

### Actor receive method
- [x] `receive(payload, message, sender)`
- [x] `sender.reply()` for replying directly to a message
- [x] `mappedMethods` define 1 function per message name
- [x] handle cancellation of pending message should a new one override it
- [x] pass state into mapped methods for encapsulated state management
- [x] `sender` - allow every message access to an ActorRef that allow communication with the sender

```js
receive (payload message sender)
switch payload
case 'ping' sender.reply 'pong'
default sender.reply 'missing'

// callsite
actor.ask 'ping'
|> resp console.log 'resp:' + resp
```

### Actor Lifecycle

- `actorOf(...)`
- [x] path is reserved
- [ ] uuid is assigned
- [x] actor instance is created
- [x] preStart is called on instance

- Incarnation (restarting)
- [x] preRestart called on old instance
- [x] new instance replaces old
- [x] postRestart called on new instance

- `Stop`, `context.stop()` or `PoisonPill`
- [x] postStop is called on instance
- [x] actor is removed from the internal system register
- [ ] `Terminated` is sent to watchers
- [x] path is free to be used again

- graceful stop [http://doc.akka.io/docs/akka/current/scala/actors.html#Graceful_Stop](http://doc.akka.io/docs/akka/current/scala/actors.html#Graceful_Stop)
- [ ] `become()` - designate a new handler for future messages

### Actor References, Paths and Addresses

- [x] `actorOf()` only ever creates a new actor, and it creates it as a direct child of the context
on which this method is invoked (which may be any actor or actor system).
- [ ] `/deadletters` all messages sent to stopped or non-existing actors are re-routed here
- [x] `/system` is the guardian actor for all system-created top-level actors, e.g. logging
listeners or actors automatically deployed by configuration at the start of the actor system.