Skip to content

Latest commit

 

History

History
138 lines (93 loc) · 4.45 KB

README.md

File metadata and controls

138 lines (93 loc) · 4.45 KB

Gynzy Notes

Reason for fork: updated the connection recovery query to exclude broadcasts without a room specified. this was not indexable and caused the query to be inefficient

Deployment

Every PR build will upload a PR package build. To release the specified version as a production build, simply merge the PR into master.

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.

Supported features:

Related packages:

Table of contents

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

  • 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.

License

MIT