0.0.4 • Published 7 years ago

shakespeare v0.0.4

Weekly downloads
7
License
MIT
Repository
github
Last release
7 years ago

shakespeare

Build Status

Shakespeare is a simplified Actor model based on event emitters.

Shakespeare receives an instantiated event emitter via its constuctor. It then exposes 'send' and 'spawn' methods...

Install

npm install shakespeare --save
var _ee  = require('events');
var ee   = new _ee;

var play = require('shakespeare')(ee);

play.spawn('channel', function actor (message, pid) {});

play.send('channel', { data: Math.random() });

Methods

send

play.send(channel_or_pid, { self: 123, ping: true });

spawn

play.spawn('channel', function actor (message, pid) {
	if (message.hasOwnProperty('self'))
		play.send(message.self, { self: pid, pong: true });
}); 

Actors

Everything looks like an event emitter except for the extra pid argument which is passed to the event handler or 'actor'. An actor in shakespeare is simply an augmented event emitter with a unique pid for each function handler.

Basic actor

function actor_with_state () {
        if (! (this instanceof actor_with_state)) {
                return new actor_with_state();
        }
        this.data = 0;
        var self = this;
        this.on_message = function (message, pid) {
                console.log('inside actor', message);
                self.data += message.data;
                console.log('updated internal data structure: data='+self.data);
        }
        this.complete = function () {
                return this.data;
        }
}

var actor = actor_with_state();
var actor_pid = play.spawn('demo_actor', actor.on_message);

Actors with behaviours

function actor_with_behaviour () {
        if (! (this instanceof actor_with_behaviour)) {
                return new actor_with_behaviour();
        }
        var self = this;
        this.behaviour1 = function (message, pid) {
                play.send('actor_behaviour_reciever', { test_result: true });
        }
        this.behaviour2 = function (message, pid) {
                play.send('actor_behaviour_reciever', { test_result: false });
        }
        this.on_message = function (message, pid) {
                if (message.important) {
                        self.behaviour1(message, pid);
                } else {
                        self.behaviour2(message, pid);
                }
        }
}

var actor = actor_with_behaviour();

var actor_pid = play.spawn('demo_actor_behaviour', actor.on_message, function () {
	play.send('demo_actor_behaviour', { demo: true }, function () {
	play.send('demo_actor_behaviour', { important: true });
});
0.0.4

7 years ago

0.0.3

7 years ago

0.0.2

7 years ago

0.0.1

7 years ago