-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.js
62 lines (55 loc) · 1.52 KB
/
utils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
const backup = require("mongodb-backup-4x");
const restore = require("mongodb-restore");
const xtend = require("xtend");
const zipDir = require("zip-dir");
const DecompressZip = require("decompress-zip");
const os = require("os");
const path = require("path");
const uuid = require("uuid");
const fs = require("fs-extra");
function backupToZip(options) {
return new Promise((resolve, reject) => {
let rootDir = os.tmpdir();
let dbStr = options.uri.split("/");
let [database] = dbStr[dbStr.length - 1].split("?");
let dirToZip = `${rootDir}/${database}`;
backup(
xtend(options, {
root: rootDir,
callback: function () {
zipDir(
dirToZip,
xtend(options.saveTo ? { saveTo: options.saveTo } : {}),
function (err, buffer) {
if (err) return reject(err);
fs.removeSync(dirToZip);
resolve(buffer);
}
);
},
})
);
});
}
function restoreFromZip(zipFile, options) {
return new Promise((resolve, reject) => {
const unzipper = new DecompressZip(zipFile);
let tmpDir = path.join(os.tmpdir(), uuid.v4());
unzipper.on("error", reject);
unzipper.on("extract", function () {
restore(
xtend(options, {
root: tmpDir,
callback: () => {
fs.removeSync(tmpDir);
resolve();
},
})
);
});
return unzipper.extract({
path: tmpDir,
});
});
}
module.exports = { restoreFromZip, backupToZip };