Created
December 17, 2010 14:57
-
-
Save yonkeltron/745059 to your computer and use it in GitHub Desktop.
Actor-like lib for objects in node.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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