socketio / socket.io-mongo-adapter

The Socket.IO MongoDB adapter, allowing to broadcast events between several Socket.IO servers
https://socket.io
MIT License
25 stars 8 forks source link
mongodb socket-io websocket

Socket.IO MongoDB adapter

The @socket.io/mongo-adapter package allows broadcasting packets between multiple Socket.IO servers.

Diagram of Socket.IO packets forwarded through MongoDB

Unlike the existing socket.io-adapter-mongo package which uses tailable cursors, this package relies on change streams and thus requires a replica set or a sharded cluster.

Table of contents

Supported features

Feature socket.io version Support
Socket management 4.0.0 :white_check_mark: YES (since version 0.1.0)
Inter-server communication 4.1.0 :white_check_mark: YES (since version 0.1.0)
Broadcast with acknowledgements 4.5.0 :white_check_mark: YES (since version 0.2.0)
Connection state recovery 4.6.0 :white_check_mark: YES (since version 0.3.0)

Installation

npm install @socket.io/mongo-adapter mongodb

Usage

Broadcasting packets within a Socket.IO cluster is achieved by creating MongoDB documents and using a change stream on each Socket.IO server.

There are two ways to clean up the documents in MongoDB:

Usage with a capped collection

import { Server } from "socket.io";
import { createAdapter } from "@socket.io/mongo-adapter";
import { MongoClient } from "mongodb";

const DB = "mydb";
const COLLECTION = "socket.io-adapter-events";

const io = new Server();

const mongoClient = new MongoClient("mongodb://localhost:27017/?replicaSet=rs0");

await mongoClient.connect();

try {
  await mongoClient.db(DB).createCollection(COLLECTION, {
    capped: true,
    size: 1e6
  });
} catch (e) {
  // collection already exists
}
const mongoCollection = mongoClient.db(DB).collection(COLLECTION);

io.adapter(createAdapter(mongoCollection));
io.listen(3000);

Usage with a TTL index

import { Server } from "socket.io";
import { createAdapter } from "@socket.io/mongo-adapter";
import { MongoClient } from "mongodb";

const DB = "mydb";
const COLLECTION = "socket.io-adapter-events";

const io = new Server();

const mongoClient = new MongoClient("mongodb://localhost:27017/?replicaSet=rs0");

await mongoClient.connect();

const mongoCollection = mongoClient.db(DB).collection(COLLECTION);

await mongoCollection.createIndex(
  { createdAt: 1 },
  { expireAfterSeconds: 3600, background: true }
);

io.adapter(createAdapter(mongoCollection, {
  addCreatedAtField: true
}));

io.listen(3000);

Known errors

Change streams are only available for replica sets and sharded clusters.

More information here.

Please note that, for development purposes, you can have a single MongoDB process acting as a replica set by running rs.initiate() on the node.

You probably passed a MongoDB client instead of a MongoDB collection to the createAdapter method.

License

MIT