mirror of
https://github.com/spacebarchat/server.git
synced 2024-11-11 13:14:06 +01:00
75 lines
2.7 KiB
JavaScript
75 lines
2.7 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.MongooseCache = void 0;
|
|
require("./MongoBigInt");
|
|
const mongoose_1 = __importDefault(require("mongoose"));
|
|
const mongodb_1 = require("mongodb");
|
|
const events_1 = __importDefault(require("events"));
|
|
const uri = process.env.MONGO_URL || "mongodb://localhost:27017/fosscord?readPreference=secondaryPreferred";
|
|
const connection = mongoose_1.default.createConnection(uri, { autoIndex: true });
|
|
exports.default = connection;
|
|
class MongooseCache extends events_1.default {
|
|
constructor(collection, pipeline, opts) {
|
|
super();
|
|
this.collection = collection;
|
|
this.pipeline = pipeline;
|
|
this.opts = opts;
|
|
this.change = (doc) => {
|
|
// @ts-ignore
|
|
if (doc.fullDocument) {
|
|
// @ts-ignore
|
|
if (!this.opts.onlyEvents)
|
|
this.data = doc.fullDocument;
|
|
}
|
|
switch (doc.operationType) {
|
|
case "dropDatabase":
|
|
return this.destroy();
|
|
case "drop":
|
|
return this.destroy();
|
|
case "delete":
|
|
return this.emit("delete", doc.documentKey._id.toHexString());
|
|
case "insert":
|
|
return this.emit("insert", doc.fullDocument);
|
|
case "update":
|
|
case "replace":
|
|
return this.emit("change", doc.fullDocument);
|
|
case "invalidate":
|
|
return this.destroy();
|
|
default:
|
|
return;
|
|
}
|
|
};
|
|
}
|
|
async init() {
|
|
this.stream = this.collection.watch(this.pipeline, { fullDocument: "updateLookup" });
|
|
this.stream.on("change", this.change);
|
|
this.stream.on("close", this.destroy);
|
|
this.stream.on("error", console.error);
|
|
if (!this.opts.onlyEvents) {
|
|
const arr = await this.collection.aggregate(this.pipeline).toArray();
|
|
this.data = arr.length ? arr[0] : arr;
|
|
}
|
|
}
|
|
convertResult(obj) {
|
|
if (obj instanceof mongodb_1.Long)
|
|
return BigInt(obj.toString());
|
|
if (typeof obj === "object") {
|
|
Object.keys(obj).forEach((key) => {
|
|
obj[key] = this.convertResult(obj[key]);
|
|
});
|
|
}
|
|
return obj;
|
|
}
|
|
destroy() {
|
|
this.stream.off("change", this.change);
|
|
this.emit("close");
|
|
if (this.stream.isClosed())
|
|
return;
|
|
return this.stream.close();
|
|
}
|
|
}
|
|
exports.MongooseCache = MongooseCache;
|
|
//# sourceMappingURL=Database.js.map
|