Redis adapter for Socket.IO that enables broadcasting packets between multiple Socket.IO servers through Redis pub/sub functionality
npx @tessl/cli install tessl/npm-socket-io--redis-adapter@8.3.0The Socket.IO Redis adapter enables broadcasting packets between multiple Socket.IO servers through Redis pub/sub functionality. It provides comprehensive Redis integration with support for both regular Redis and Redis clusters, using either the 'redis' or 'ioredis' client libraries.
npm install @socket.io/redis-adapterimport { createAdapter, createShardedAdapter } from "@socket.io/redis-adapter";Default import (equivalent to createAdapter):
import createAdapter from "@socket.io/redis-adapter";For CommonJS:
const { createAdapter, createShardedAdapter } = require("@socket.io/redis-adapter");
// or
const createAdapter = require("@socket.io/redis-adapter");import { createClient } from "redis";
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter";
// Create Redis clients
const pubClient = createClient({ url: "redis://localhost:6379" });
const subClient = pubClient.duplicate();
await Promise.all([
pubClient.connect(),
subClient.connect()
]);
// Create Socket.IO server with Redis adapter
const io = new Server({
adapter: createAdapter(pubClient, subClient)
});
io.listen(3000);The Redis adapter is built around several key components:
RedisAdapter class for standard Redis pub/sub operationsShardedRedisAdapter class utilizing Redis 7.0+ sharded pub/sub featuresredis and ioredis client librariesStandard Redis adapter implementation using traditional pub/sub channels. Supports broadcasting, socket management, and inter-server communication.
function createAdapter(
pubClient: any,
subClient: any,
opts?: Partial<RedisAdapterOptions>
): (nsp: any) => RedisAdapter;
interface RedisAdapterOptions {
key: string;
requestsTimeout: number;
publishOnSpecificResponseChannel: boolean;
parser: Parser;
}Advanced adapter implementation using Redis 7.0+ sharded pub/sub features for improved scalability.
function createShardedAdapter(
pubClient: any,
subClient: any,
opts?: ShardedRedisAdapterOptions
): (nsp: any) => ShardedRedisAdapter;
interface ShardedRedisAdapterOptions {
channelPrefix?: string;
subscriptionMode?: "static" | "dynamic" | "dynamic-private";
}Cross-client compatibility utilities for Redis operations and binary data handling.
function hasBinary(obj: any, toJSON?: boolean): boolean;
function SSUBSCRIBE(
redisClient: any,
channel: string,
handler: (rawMessage: Buffer, channel: Buffer) => void
): void;
function SUNSUBSCRIBE(redisClient: any, channel: string | string[]): void;
function SPUBLISH(
redisClient: any,
channel: string,
payload: string | Uint8Array
): Promise<any>;
function PUBSUB(redisClient: any, arg: string, channel: string): Promise<number>;
function parseNumSubResponse(res: any[]): number;
function sumValues(values: number[]): number;interface Parser {
decode(msg: any): any;
encode(msg: any): any;
}