socket-redis v3.3.0
socket-redis
socket-redis is a WebSocket pub/sub server and client, exposing an API over Redis (allowing you to use WebSocket functionality in your application using a Redis client).
About
socket-redis starts a WebSocket server (SockJS) where clients can connect to, and subscribe to multiple channels.
The server will let you consume client-related events like message, subscribe and unsubscribe on a Redis pub/sub channel socket-redis-up.
Additionally it will subscribe to another pub/sub channel socket-redis-down where you can send messages to all clients in a channel.
When specifying multiple --socket-ports the script will spawn a child process for each port. This is provided as a simple way to make use of all your CPU cores.
Server
Installation & Configuration
Package is available through npm registry:
npm install socket-redis [-g]
socket-redis.js --redis-host=my-redisOr as a Docker image:
docker run cargomedia/socket-redis ./bin/socket-redis.js --redis-host=my-redisSee also the provided docker-compose.yml for reference.
Available options:
--redis-hostSpecify host of redis server. Defaults tolocalhost.--redis-portSpecify port. Default 6379--redis-passSpecify password if needed--socket-portsComma separated public ports which SockJS workers will listen on. Defaults to8090.--log-dirDirectory where log is stored. Script will try to create directory if needed. Defaults tonullwhich means it will output to stdout.--sockjs-client-urlSpecify custom url for sockjs-client library.--status-portSpecify port for http status requests. It should not be publicly accesible. Defaults to8085--status-secretSpecify secret token to allow/deny http status requests (optional).--ssl-keySpecify ssl private key file. Combine withssl-certoption.--ssl-certSpecify ssl public certificate file. Combine withssl-keyoption. Append CA-chain within this file.--ssl-pfxSpecify ssl pfx file (key + cert). Overridesssl-keyandssl-certoptions.--ssl-passphraseSpecify file containing the ssl passphrase.
Redis API
Messages published to redis pub/sub channel socket-redis-up:
{type: "subscribe", data: {channel: <channel>, clientKey: <clientKey>, data: <subscribe-data>}}{type: "unsubscribe", data: {channel: <channel>, clientKey: <clientKey>}}{type: "message", data: {clientKey: <clientKey>, data: <data>}}
Messages consumed on redis pub/sub channel socket-redis-down:
{type: "publish", data: {channel: <channel>, event: <event>, data: <data>}}
For example you could publish messages using Redis CLI:
redis-cli 'publish' 'socket-redis-down' '{"type":"publish", "data": {"channel":"<channel>", "event":"<event>", "data":"<data>"}}'HTTP status API
Server also answers http status requests (on port 8085 by default).
A JSON representation of all current subscribers is returned on /:
$ curl 'http://localhost:8085/'
{<channel>: {
"subscribers": {
<clientKey>: {
"clientKey": <clientKey>,
"subscribeStamp": <subscribe-stamp>,
"data": {}
}
}
}A Prometheus scraping endpoint is responding on /metrics:
$ curl 'http://localhost:8085/metrics'
# HELP socketredis_channels_total Number of channels
# TYPE socketredis_channels_total gauge
socketredis_channels_total 30
# HELP socketredis_subscribers_total Number of subscribers
# TYPE socketredis_subscribers_total gauge
socketredis_subscribers_total 90Client
Building
Client is written as a node module. If you want to access it as a global variable in browser then you need to browserify client/index.js. It will be exposed under SocketRedis. Also it requires a global variable SockJS that contains sockjs client.
browserify --standalone SocketRedis ./client/index.js -o ./client/socket-redis.jsInstallation
Include the SockJS and socket-redis client libraries in your html file:
<script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
<script src="./client/socket-redis.js"></script>Example
To receive messages from the server create a new SocketRedis instance and subscribe to some channels:
var socketRedis = new SocketRedis('http://example.com:8090');
socketRedis.onopen = function() {
socketRedis.subscribe('channel-name', null, {foo: 'bar'}, function(event, data) {
console.log('New event `' + event + '` on channel `channel-name`:', data);
});
socketRedis.unsubscribe('channel-name');
};
socketRedis.open();To publish messages to a channel from the client:
socketRedis.publish('channel-name', 'event-name', {foo: 'bar'});(The event name will be prefixed with client- and thus become client-event-name.)
To send messages to the server:
socketRedis.send({foo: 'bar'});Development
Install dependencies:
npm installBuild the docker image:
docker-compose buildRunning Tests
docker-compose run --rm --volume $(pwd):/opt/socket-redis socket-redis ./script/test.shRunning the Server
docker-compose run --volume $(pwd):/opt/socket-redis --service-ports socket-redisReleasing new Versions
- Update package.json with a new version
- Push a new git tag with the updated package.json
- The Travis build should deploy to NPM automatically
If it doesn't work you could release it manually with:
npm publish https://github.com/cargomedia/socket-redis/archive/<GitTagWithUpdatedPackageJson>.tar.gz8 years ago
8 years ago
8 years ago
8 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
10 years ago
10 years ago
11 years ago
11 years ago
11 years ago
12 years ago
12 years ago
12 years ago
12 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago