Socket
Socket
Sign inDemoInstall

redis-pubsub-hook

Package Overview
Dependencies
1
Maintainers
1
Versions
2
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    redis-pubsub-hook

Redis pubsub for communicating other nodes


Version published
Weekly downloads
158
decreased by-15.96%
Maintainers
1
Install size
133 kB
Created
Weekly downloads
 

Readme

Source

redis-pubsub-hook

NPM version NPM Downloads Prettier Conventional Commits

Redis pubsub for communicating other nodes
Using node-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 or git 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)' or git 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, moyuyc95@gmail.com.

License

MIT - imcuttle 🐟

Keywords

FAQs

Last updated on 30 Aug 2020

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.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc