Files
socket.io/packages/socket.io-redis-streams-emitter
Damien Arrachequesne 594841617d test(redis-streams-emitter): migrate to Node.js test runner
We should eventually be able to replace:

- mocha and nyc with Node.js built-in test runner (`node:test`)
- expect.js with Node.js built-in assertion library (`node:assert`)
2025-12-22 14:48:29 +01:00
..

Socket.IO Redis Streams emitter

The @socket.io/redis-streams-emitter package allows you to easily communicate with a group of Socket.IO servers from another Node.js process (server-side).

It must be used in conjunction with @socket.io/redis-streams-adapter.

Table of contents

Installation

npm install @socket.io/redis-streams-emitter redis

Usage

With the redis package

import { createClient } from "redis";
import { Emitter } from "@socket.io/redis-streams-emitter";

const redisClient = createClient({
  url: "redis://localhost:6379"
});

await redisClient.connect();

const io = new Emitter(redisClient);

setInterval(() => {
  io.emit("ping", new Date());
}, 1000);

With the redis package and a Redis cluster

import { createCluster } from "redis";
import { Emitter } from "@socket.io/redis-streams-emitter";

const redisClient = createCluster({
  rootNodes: [
    {
      url: "redis://localhost:7000",
    },
    {
      url: "redis://localhost:7001",
    },
    {
      url: "redis://localhost:7002",
    },
  ],
});

await redisClient.connect();

const io = new Emitter(redisClient);

setInterval(() => {
  io.emit("ping", new Date());
}, 1000);

With the ioredis package

import { Redis } from "ioredis";
import { Emitter } from "@socket.io/redis-streams-emitter";

const redisClient = new Redis();

const io = new Emitter(redisClient);

setInterval(() => {
  io.emit("ping", new Date());
}, 1000);

With the ioredis package and a Redis cluster

import { Cluster } from "ioredis";
import { Emitter } from "@socket.io/redis-streams-emitter";

const redisClient = new Cluster([
  {
    host: "localhost",
    port: 7000,
  },
  {
    host: "localhost",
    port: 7001,
  },
  {
    host: "localhost",
    port: 7002,
  },
]);

const io = new Emitter(redisClient);

setInterval(() => {
  io.emit("ping", new Date());
}, 1000);

Options

Name Description Default value
streamName The name of the Redis stream. socket.io
maxLen The maximum size of the stream. Almost exact trimming (~) is used. 10_000

API

Emitter(redisClient[, nsp][, opts])

const io = new Emitter(redisClient);

Emitter#to(room:string):BroadcastOperator

Emitter#in(room:string):BroadcastOperator

Specifies a specific room that you want to emit to.

io.to("room1").emit("hello");

Emitter#except(room:string):BroadcastOperator

Specifies a specific room that you want to exclude from broadcasting.

io.except("room2").emit("hello");

Emitter#of(namespace:string):Emitter

Specifies a specific namespace that you want to emit to.

const customNamespace = io.of("/custom");

customNamespace.emit("hello");

Emitter#socketsJoin(rooms:string|string[])

Makes the matching socket instances join the specified rooms:

// make all Socket instances join the "room1" room
io.socketsJoin("room1");

// make all Socket instances of the "admin" namespace in the "room1" room join the "room2" room
io.of("/admin").in("room1").socketsJoin("room2");

Emitter#socketsLeave(rooms:string|string[])

Makes the matching socket instances leave the specified rooms:

// make all Socket instances leave the "room1" room
io.socketsLeave("room1");

// make all Socket instances of the "admin" namespace in the "room1" room leave the "room2" room
io.of("/admin").in("room1").socketsLeave("room2");

Emitter#disconnectSockets(close:boolean)

Makes the matching socket instances disconnect:

// make all Socket instances disconnect
io.disconnectSockets();

// make all Socket instances of the "admin" namespace in the "room1" room disconnect
io.of("/admin").in("room1").disconnectSockets();

// this also works with a single socket ID
io.of("/admin").in(theSocketId).disconnectSockets();

Emitter#serverSideEmit(ev:string[,...args:any[]])

Emits an event that will be received by each Socket.IO server of the cluster.

io.serverSideEmit("ping");

License

MIT