The Socket.IO MongoDB adapter, allowing to broadcast events between several Socket.IO servers
https://github.com/socketio/socket.io-mongo-adapter.git
The @socket.io/mongo-adapter package allows broadcasting packets between multiple Socket.IO servers.
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
| Feature | socket.io version | Support |
|---|---|---|
| Socket management | 4.0.0 | :whitecheckmark: YES (since version 0.1.0) |
| Inter-server communication | 4.1.0 | :whitecheckmark: YES (since version 0.1.0) |
| Broadcast with acknowledgements | 4.5.0 | :whitecheckmark: YES (since version 0.2.0) |
| Connection state recovery | 4.6.0 | :whitecheckmark: YES (since version 0.3.0) |
npm install @socket.io/mongo-adapter mongodb
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:
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);
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);
MongoError: The $changeStream stage is only supported on replica setsMore 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.
TypeError: this.mongoCollection.insertOne is not a functioncreateAdapter method.