Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@yonkeltron
Created December 17, 2010 14:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save yonkeltron/745059 to your computer and use it in GitHub Desktop.
Save yonkeltron/745059 to your computer and use it in GitHub Desktop.
Actor-like lib for objects in node.js
var _ = require('underscore')._,
events = require('events');
var Actor = function Actor(object) {
var postman = new events.EventEmitter(),
mailbox = [],
that = this,
monitor = function monitor() {
var data = mailbox.shift();
if (data) {
_.defer(function () {
that.act(data);
});
}
_.defer(monitor);
};
this.send = function send() {
var args = _.toArray(arguments),
data_obj = {
message: args.shift(),
context: {
args: args
}
};
if (_.last(args) instanceof Actor) {
data_obj.context.sender = args.pop()
} else if (send.caller.actor && send.caller.actor instanceof Actor) {
data_obj.context.sender = send.caller.actor;
}
postman.emit('message', data_obj);
};
this.act = function act(data) {
this[data.message].apply(this, [data.context]);
};
this.spawn = function spawn() {
return _.clone(this);
};
_.extend(this, object);
_(this).map( function (val, key) {
if (_.isFunction(val)) {
val.actor = that;
}
});
postman.on('message', function (data) {
mailbox.push(data);
});
_.defer(monitor);
return this;
};
var pinger = new Actor({
ping: function ping(context) {
console.log('Got ping!');
context.sender.send('pong', context.args);
}
});
var plop = {
pong: function pong(context) {
console.log('Got %s', context.args.toString());
context.sender.send('ping', context.args);
}
};
_.range(0,100).map( function (i) {
var actor = new Actor(plop);
_.delay(function () {
actor.send('pong', i, pinger);
}, (i * 5));
return actor;
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment