redis-pubsub-hook
v1.0.1
Published
Redis pubsub for communicating other nodes
Downloads
341
Maintainers
Readme
redis-pubsub-hook
Redis pubsub for communicating other nodes
Usingnode-redis
and redis-cluster client connection driver by default.
Installation
npm install redis-pubsub-hook
# or use yarn
yarn add redis-pubsub-hook
Usage
Basic Usage
const { RedisPubSub } = require('redis-pubsub-hook')
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })
// Create redis connection on every server
const pubsub = new RedisPubSub({
redis: 'redis://localhost:6379' // or `redis://localhost:6379,redis://localhost:6380` cluster
})
// Create self hook
pubsub.setHook('sessions', () => wss.clients.map((socket) => socket.session))
wss.on('connection', async function connection(socket, req) {
socket.session = req.session
// Collect all server nodes' responses
const sessionsList = await pubsub.request('sessions')
})
process.on('SIGINT', () => pubsub.quit())
Namespace Usage
const { NamespacePubSub } = require('redis-pubsub-hook')
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })
// Create redis connection on every server
const namespacePubSub = new NamespacePubSub({
redis: 'redis://localhost:6379' // or `redis://localhost:6379,redis://localhost:6380` cluster
})
wss.on('connection', async function connection(socket, req) {
const { namespace } = req.query
socket.session = req.session
const pubsub = namespacePubSub.register(namespace)
pubsub.setHook('sessions', () => wss.clients.map((socket) => socket.session))
socket.on('close', async () => {
// Collect matching namespace sockets' sessions
const sessionsList = await pubsub.request('sessions')
const sessionCount = sessionsList.reduce((aSessions, bSessions) => aSessions.length + bSessions.length)
if (!sessionCount) {
// Detect all sockets in namespace had been closed
namespacePubSub.remove(namespace)
}
})
})
process.on('SIGINT', () => namespacePubSub.quit())
RedisPubSub
Options
pub
Redis Client instance
sub
Redis Client instance
redis
The config for creating Redis Client
uid
The uid of this pubsub
- Type:
string
- Default:
uuid()
hooks
- Type:
{[name: string]: Function}
createClient
- Type:
(config: any) => RedisClient | RedisCluster
- Default:
RedisPubSub.defaultCreateClient
getNumSub
- Type:
(channel: string, pub: RedisClient | RedisCluster) => Promise<number>
- Default:
RedisPubSub.defaultGetNumSub
timeout
- Type:
number
- Default:
3000
responseChannel
- Type:
string
- Default:
RequestChannel
requestChannel
- Type:
string
- Default:
ResponseChannel
Contributing
- Fork it!
- Create your new branch:
git checkout -b feature-new
orgit checkout -b fix-which-bug
- Start your magic work now
- Make sure npm test passes
- Commit your changes:
git commit -am 'feat: some description (close #123)'
orgit commit -am 'fix: some description (fix #123)'
- Push to the branch:
git push
- Submit a pull request :)
Authors
This library is written and maintained by imcuttle, [email protected].
License
MIT - imcuttle 🐟