This hook is in development and has very limited functionnality please feel free to create issues and new features requests
Main idea of the hook is to give application written with Sails.js ability to communicate with each other using redis Pub/Sub.
Global event will receive all (your) servers that subscribed to given channel.
To send message you could use this method:
// Send message to all sails instances/servers/applications
sails.redispubsub.publish({
event: 'clearCache',
items: 'test'
});
or
// Send message to all sails instances/servers/applications
sails.redispubsub.publish('clearCache', {
items: 'test'
});
Local event will be received only by instance that sent event.
Sending local event:
sails.redispubsub.emit('event', { /*... something ... */ });
Note that message that you will send will be converted to string using JSON.stringify
please do not send streams, functions in it !
Subscribe on event into your code:
// Note that sails is a global variable
sails.redispubsub.on('event', function(data) {
// Event handled
sails.log.debug('event handled', data);
});
And send event from another server (all servers including current will receive event):
sails.redispubsub.publish('event', {
something: 'anything'
});
Or you could send message only to current instance using emit
method:
Only current server will receive this message !
sails.redispubsub.emit('event', {
something: 'anything'
});
Hook is based on default EventEmitter
class. So you could use any method from it.
List of methods
Note: emit()
method will send event only to current instance !
To send event to all instances use publish()
method.
You could handle all messages using config/redispubsub.js
configuration file and onMessage(channel, message)
method in it.
Example config/redispubsub.js
:
module.exports.redispubsub = {
onMessage: function(channel, message) {
console.log(message);
}
};
module.exports.redispubsub = {
onMessage: require('../api/services/RedisPubSubService').onMessage //Bind to service
};
This hook support redis connection options (full list of options you could find here):
module.exports.redispubsub = {
/**
* Redis connection settings
*/
connection: {
options: {
host: 'localhost',
port: 6370
}
},
/**
* Channel name of redis pub/sub
* By default hook use channel name: 'sails'
*
* @type {String}
*/
channel: 'sails-new'
/**
* On subscribe handler
*
* @type {function}
*/
onSubscribe: function(channel, count) {
console.log(channel, count);
},
/**
* Error handler
*
* @type {function}
*/
onError: function(err) {
console.log(err);
},
/**
* Global message handler
*
* @type {function}
*/
onMessage: function(channel, message) {
console.log(message);
}
};
You are able to pass existing pubClient
and subClient
to this hook.
So hook wouldn't create a new connections.
in config/redispubsub.js
file:
This hook support redis connection options (full list of options you could find here):
module.exports.redispubsub = {
/**
* Redis connection settings
*/
connection: {
pubClient: pubClient,
subClient: subClient
}
// ...
}
In this case you don't need to pass connection.options
MIT