A minimalistic Actor Model library for nodeJS
npm install nactorino
function addToPlaylist(song, callback) {
// Get song playlist
player.getPlaylist(function (err, playlist) {
if (err) {
return callback(err);
}
// Check if song is already in the playlist
if(playlist.getSongs().indexOf(song) > -1) {
return callback('Song already in playlist');
}
// Add song to the playlist
playlist.addSong(song, function (err) {
if (err) {
return callback(err);
}
return callback(null, true);
});
});
}
`
The code above contains calls to several asynchronous methods, and this doesn't guarantee atomicity in the execution of the whole function addToPlaylist().
This library aims to help developers implementing a very basic Actor Model in node (nothing more than a command queue system).
> Note: For more advanced features, please have a look at libraries such as drama and NActor.
How to use
-------------
$3
`
npm install --save nactorino
`
$3
`js
var Actor = require('nactorino');
var playlistActor = new Actor({
// This method returns a Promise
addToPlaylist: function(song) {
return new Promise(function (resolve, reject) {
// Get song playlist
player.getPlaylist(function (err, playlist) {
if (err) {
return reject(err);
}
// Check if song is already in the playlist
if(playlist.getSongs().indexOf(song) > -1) {
return reject('Song already in playlist');
}
// Add song to the playlist
playlist.addSong(song, function (err) {
if (err) {
return reject(err);
}
return resolve(true);
});
});
});
},
removeFromPlaylist: function (song) {
// [...]
},
// This method returns a materialized result
ping: function (pingData) {
return pingData;
}
});
playlistActor.ask('addToPlaylist', song)
.then(function (result) {
console.info('Song ' + song.title + ' added to the playlist');
})
.catch(function (error) {
console.error('Unable to add song ' + song.title + ' to the playlist', error);
});
playlistActor.ask('removeFromPlaylist', song)
.then(function (result) {
console.info('Song ' + song.title + ' removed from the playlist');
})
.catch(function (error) {
console.error('Unable to remove song ' + song.title + ' to the playlist', error);
});
`
> Note: All the methods declared into the same actor are executed sequentially. This is extremely useful when accessing a shared object (in that case a playlist).
Caveats
-------------
Currently there is no support for asynchronous calls using the classic node callback structure.
In the meantime those calls can be wrapped in a Promise using Promise.denodeify()`.