[Javascript] Create an Actor model in Javascript
Refer to: https://stately.ai/docs/actor-model
What defines an “actor”?
Actors are independent “live” objects that can communicate with each other via asynchronous message passing. In XState, we refer to these messages as events.
- An actor has its own internal, encapsulated state that can only be updated by the actor itself. An actor may choose to update its internal state in response to a message it receives, but it cannot be updated by any other entity.
- Actors communicate with other actors by sending and receiving events asynchronously.
- Actors process one message at a time. They have an internal “mailbox” that acts like an event queue, processing events sequentially.
- Internal actor state is not shared between actors. The only way for an actor to share any part of its internal state is by:
- Sending events to other actors
- Or emitting snapshots, which can be considered implicit events sent to subscribers.
- Actors can create (spawn/invoke) new actors.
function counterBehavior(state, event) {
if (event.type === "INCREMENT") {
return {
...state,
count: state.count + 1,
};
}
return state;
}
function createActor(behavior, initialState) {
let currentState = initialState;
const listeners = new Set();
function notifyListeners() {
for (const listener of listeners) {
listener(currentState);
}
}
return {
send: (event) => {
currentState = behavior(currentState, event);
notifyListeners();
},
subscribe: (listener) => {
listeners.add(listener);
listener(currentState);
},
getSnapshot: () => {
return currentState;
},
};
}
const actor = createActor(counterBehavior, { count: 0 });
actor.subscribe((state) => {
console.log("State is now", state);
});
actor.send({ type: "INCREMENT" });