Redis to SockJS relay


"socket-redis" starts a WebSocket emulation 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.

Package is in nodejs and is available through npm registry:

npm install socket-redis [-g]

You can run socket-redis using default arguments or specify them on your own.

--redis-host Specify host of redis server. Defaults to localhost.

--socket-ports Comma separated public ports which SockJS workers will listen on. Defaults to 8090.

--log-dir Directory where log is stored. Script will try to create directory if needed. Defaults to null which means it will output to stdout.

--sockjs-client-url Specify custom url for sockjs-client library.

--status-port Specify port for http status requests. It should not be publicly accesible. Defaults to 8085

--ssl-key Specify ssl private key file. Combine with ssl-cert option.

--ssl-cert Specify ssl public certificate file. Combine with ssl-key option. Append CA-chain within this file.

--ssl-pfx Specify ssl pfx file (key + cert). Overrides ssl-key and ssl-cert options.

--ssl-passphrase Specify file containing the ssl passphrase.

  • {type: "subscribe", data: {channel: <channel>, clientKey: <clientKey>, data: <subscribe-data>}}
  • {type: "unsubscribe", data: {channel: <channel>, clientKey: <clientKey>}}
  • {type: "message", data: {clientKey: <clientKey>, data: <data>}}
  • {type: "publish", data: {channel: <channel>, event: <event>, data: <data>}}

Server also answers http requests (on port 8085 by default). You can request on-demand state of all subscribers grouped by channels.

Status response schema:

{<channel>: {
    "subscribers": {
        <clientKey>: {
            "clientKey": <clientKey>,
            "subscribeStamp": <subscribe-stamp>,
            "data": {}

Include the SockJS and socket-redis client libraries in your html file:

<script src=""></script>
<script src=""></script>

To receive messages from the server create a new SocketRedis instance and subsribe to some channels:

var socketRedis = new SocketRedis('');
socketRedis.onopen = function() {
    socketRedis.subscribe('channel-name', null, {foo: 'bar'}, function(event, data) {
        console.log('New event `' + event + '` on channel `channel-name`:', data);

To publish messages to a channel from the client:

socketRedis.publish('foo', {foo: 'bar'});

(The event name will be prefixed with client- and thus become client-foo.)

To send messages to the server:

socketRedis.send({foo: 'bar'});