@socket.io/mongo-adapter
v0.4.0
Published
The Socket.IO MongoDB adapter, allowing to broadcast events between several Socket.IO servers
Downloads
49,866
Maintainers
Readme
Socket.IO MongoDB adapter
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
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 mongodbUsage
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
MongoError: The $changeStream stage is only supported on replica sets
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.
TypeError: this.mongoCollection.insertOne is not a function
You probably passed a MongoDB client instead of a MongoDB collection to the createAdapter method.
