Product
Introducing License Enforcement in Socket
Ensure open-source compliance with Socket’s License Enforcement Beta. Set up your License Policy and secure your software!
socket-redis
Advanced tools
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).
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.
Package is available through npm registry:
npm install socket-redis [-g]
socket-redis.js --redis-host=my-redis
Or as a Docker image:
docker run cargomedia/socket-redis ./bin/socket-redis.js --redis-host=my-redis
See also the provided docker-compose.yml
for reference.
Available options:
--redis-host
Specify host of redis server. Defaults to localhost
.--redis-port
Specify port. Default 6379--redis-pass
Specify password if needed--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
--status-secret
Specify secret token to allow/deny http status requests (optional).--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.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>}}
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>"}}'
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 90
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.js
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>
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'});
Install dependencies:
npm install
Build the docker image:
docker-compose build
docker-compose run --rm --volume $(pwd):/opt/socket-redis socket-redis ./script/test.sh
docker-compose run --volume $(pwd):/opt/socket-redis --service-ports socket-redis
If it doesn't work you could release it manually with:
npm publish https://github.com/cargomedia/socket-redis/archive/<GitTagWithUpdatedPackageJson>.tar.gz
FAQs
Redis to SockJS relay
We found that socket-redis demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Ensure open-source compliance with Socket’s License Enforcement Beta. Set up your License Policy and secure your software!
Product
We're launching a new set of license analysis and compliance features for analyzing, managing, and complying with licenses across a range of supported languages and ecosystems.
Product
We're excited to introduce Socket Optimize, a powerful CLI command to secure open source dependencies with tested, optimized package overrides.