wwebjs-mongo
Version:
A MongoDB plugin for whatsapp-web.js library
65 lines (57 loc) • 2.33 kB
JavaScript
const fs = require('fs');
class MongoStore {
constructor({ mongoose } = {}) {
if(!mongoose) throw new Error('A valid Mongoose instance is required for MongoStore.');
this.mongoose = mongoose;
}
async sessionExists(options) {
let multiDeviceCollection = this.mongoose.connection.db.collection(`whatsapp-${options.session}.files`);
let hasExistingSession = await multiDeviceCollection.countDocuments();
return !!hasExistingSession;
}
async save(options) {
var bucket = new this.mongoose.mongo.GridFSBucket(this.mongoose.connection.db, {
bucketName: `whatsapp-${options.session}`
});
await new Promise((resolve, reject) => {
fs.createReadStream(`${options.session}.zip`)
.pipe(bucket.openUploadStream(`${options.session}.zip`))
.on('error', err => reject(err))
.on('close', () => resolve());
});
options.bucket = bucket;
await this.#deletePrevious(options);
}
async extract(options) {
var bucket = new this.mongoose.mongo.GridFSBucket(this.mongoose.connection.db, {
bucketName: `whatsapp-${options.session}`
});
return new Promise((resolve, reject) => {
bucket.openDownloadStreamByName(`${options.session}.zip`)
.pipe(fs.createWriteStream(options.path))
.on('error', err => reject(err))
.on('close', () => resolve());
});
}
async delete(options) {
var bucket = new this.mongoose.mongo.GridFSBucket(this.mongoose.connection.db, {
bucketName: `whatsapp-${options.session}`
});
const documents = await bucket.find({
filename: `${options.session}.zip`
}).toArray();
documents.map(async doc => {
return bucket.delete(doc._id);
});
}
async #deletePrevious(options) {
const documents = await options.bucket.find({
filename: `${options.session}.zip`
}).toArray();
if (documents.length > 1) {
const oldSession = documents.reduce((a, b) => a.uploadDate < b.uploadDate ? a : b);
return options.bucket.delete(oldSession._id);
}
}
}
module.exports = MongoStore;