npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

node-rtm-socket

v0.0.1

Published

A think abstraction over socket.io redis for easy message passing between nodes and the client

Downloads

4

Readme

node-rtm-socket

Node RTM Socket is a thin abstraction over Socket io and redis to use Sockets with multiple servers, processes and docker containers where Redis acts as a relay between them for message passing utilizing socket.io-redis. This client expose a simple API to subscribe event handlers without worrying too much about the implementation details. Look at example

Installation

npm install @node-rtm-socket

Quick Setup

Since we use socket.io-redis, to support the message passing you need have Redis server up and running either locally or in the production setting

const { NodeRTMSocket } = require('node-rtm-socket')
const server = http
  .createServer(routeHandler)
  .listen(8080, () => {
  })

const rtmSocket = new NodeRTMSocket(server, { host: 'localhost', port: 6379 }, { path: '/' })

rtmSocket.onEvent('connection', (instance) => {
  console.log('user connection ', instance.socketId)
})

rtmSocket.onEvent('authenticate', (instance, data) => {
  instance.userPresence(data.userId)
    .then(() => {
      instance.joinRoom('random-room-id')
      instance.notifySelf('conversation', 'random-room-id')
    })
})

rtmSocket.onEvent('newMessage', (instance) => {
  console.log('new message received ', instance.socketId)
})

rtmSocket.init()

For more detailed example and intergration with the UI look at example folder. By running

node example/server.js

Open the index.html in browser. Have multiple instances of browser windows and try plugging in unique different user names for conversation.

API

Instance Creation

export interface INodeRtmSocketConstructor {
  new (server: http.Server, redisConf: redis.SocketIORedisOptions, socketOpts?: socketIo.ServerOptions): INodeRTMSocket
}

interface SocketIORedisOptions {
  key?: string
  host?: string
  port?: number
  auth_pass?: number | string
  pubClient?: any
  subClient?: any
}

interface ServerOptions extends engine.ServerAttachOptions {
  path?: string
  serveClient?: boolean
  adapter?: Adapter
  origins?: string | string[]
}

Methods

export interface INodeRTMSocket {
  io: socketIo.Server


  onEvent(eventName: string, cb: IOnEventCallback): void
  init(): void
}

Methods for received callbacks

This instance is based on per socket connection. On every successful socket connection an instance per user connection is created in the memory. On every callback received per event this class instance is returned

export interface IOnEventCallback {
  (socketInstance: IChatEventHandler<any>, data: any): void
}

export interface IChatEventHandler<T> {
  userIsPresent: boolean
  userInfo: T
  userId: string
  socketId: string

  // authenticate and upsert user presence
  userPresence(userId: string): void
  setUserInfo(userInfo: T): void

  // join conversation room methods
  joinRoom(roomId: string): void
  joinMultipleRooms(roomIds: string[]): void

  // emit events methods
  notifySelf(eventName: string, data: string): void
  notifyAllInRoom(conversationId: string, eventName: string, data: string): void
  notifyAllExceptSelfInRoom(conversationId: string, eventName: string, data: string): void
}