@neo-one/node-data-backup
Version:
NEO•ONE node data path backup and restore.
121 lines (119 loc) • 13.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const fs = tslib_1.__importStar(require("fs"));
const path = tslib_1.__importStar(require("path"));
const extract_1 = require("./extract");
const Provider_1 = require("./Provider");
const upload_1 = require("./upload");
class MegaProvider extends Provider_1.Provider {
constructor({ environment, options }) {
super();
this.environment = environment;
this.options = options;
}
async canRestore() {
const { download } = this.options;
if (download === undefined) {
return false;
}
const { id, key } = download;
const mega = await this.getMega();
const file = new mega.File({ downloadId: id, key });
return new Promise((resolve) => {
file.loadAttributes((err) => {
if (err) {
resolve(false);
}
else {
resolve(true);
}
});
});
}
async restore(monitorIn) {
const monitor = monitorIn.at('mega_provider');
const { download } = this.options;
if (download === undefined) {
return;
}
const { id, key } = download;
const { dataPath, tmpPath } = this.environment;
const downloadPath = path.resolve(tmpPath, 'storage.db.tar.gz');
await monitor.captureSpanLog(async () => {
const mega = await this.getMega();
return new Promise((resolve, reject) => {
const read = new mega.File({
downloadId: id,
key,
}).download();
const write = fs.createWriteStream(downloadPath);
let done = false;
const cleanup = () => {
done = true;
};
const onDone = () => {
if (!done) {
cleanup();
resolve();
}
};
const onError = (error) => {
if (!done) {
cleanup();
reject(error);
}
};
read.once('error', onError);
write.once('error', onError);
write.once('finish', onDone);
read.pipe(write);
});
}, {
name: 'neo_restore_download',
});
await monitor.captureSpanLog(async () => extract_1.extract({
downloadPath,
dataPath,
}), {
name: 'neo_restore_extract',
});
}
async backup(monitorIn) {
const monitor = monitorIn.at('mega_provider');
const { upload: uploadOptions } = this.options;
if (uploadOptions === undefined) {
return;
}
const { email, password, file } = uploadOptions;
const { dataPath } = this.environment;
await monitor.captureSpanLog(async () => {
const mega = await this.getMega();
const storage = new mega.Storage({
email,
password,
autologin: false,
});
await new Promise((resolve, reject) => storage.login((innerErr) => {
if (innerErr) {
reject(innerErr);
}
else {
resolve();
}
}));
await upload_1.upload({
dataPath,
write: storage.upload(file),
fileList: ['.'],
});
}, {
name: 'neo_backup_push',
});
}
async getMega() {
return Promise.resolve().then(() => tslib_1.__importStar(require('megajs')));
}
}
exports.MegaProvider = MegaProvider;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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TSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUMvQixLQUFLO2dCQUNMLFFBQVE7Z0JBQ1IsU0FBUyxFQUFFLEtBQUs7YUFDakIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUMxQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLFFBQVEsRUFBRTtvQkFDWixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ2xCO3FCQUFNO29CQUNMLE9BQU8sRUFBRSxDQUFDO2lCQUNYO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUVGLE1BQU0sZUFBTSxDQUFDO2dCQUNYLFFBQVE7Z0JBQ1IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUMzQixRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUM7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUNEO1lBQ0UsSUFBSSxFQUFFLGlCQUFpQjtTQUN4QixDQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLE9BQU87UUFDbkIsaUVBQWMsUUFBUSxJQUFFO0lBQzFCLENBQUM7Q0FDRjtBQTNJRCxvQ0EySUMiLCJmaWxlIjoibmVvLW9uZS1ub2RlLWRhdGEtYmFja3VwL3NyYy9wcm92aWRlci9NZWdhUHJvdmlkZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb25pdG9yIH0gZnJvbSAnQG5lby1vbmUvbW9uaXRvcic7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBleHRyYWN0IH0gZnJvbSAnLi9leHRyYWN0JztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnLi9Qcm92aWRlcic7XG5pbXBvcnQgeyB1cGxvYWQgfSBmcm9tICcuL3VwbG9hZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGRvd25sb2FkPzoge1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIH07XG5cbiAgcmVhZG9ubHkgdXBsb2FkPzoge1xuICAgIHJlYWRvbmx5IGVtYWlsOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcGFzc3dvcmQ6IHN0cmluZztcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBNZWdhUHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9wdGlvbnM7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHsgZW52aXJvbm1lbnQsIG9wdGlvbnMgfTogeyByZWFkb25seSBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7IHJlYWRvbmx5IG9wdGlvbnM6IE9wdGlvbnMgfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2FuUmVzdG9yZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGRvd25sb2FkIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKGRvd25sb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGlkLCBrZXkgfSA9IGRvd25sb2FkO1xuICAgIGNvbnN0IG1lZ2EgPSBhd2FpdCB0aGlzLmdldE1lZ2EoKTtcbiAgICBjb25zdCBmaWxlID0gbmV3IG1lZ2EuRmlsZSh7IGRvd25sb2FkSWQ6IGlkLCBrZXkgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgIGZpbGUubG9hZEF0dHJpYnV0ZXMoKGVycj86IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZXN0b3JlKG1vbml0b3JJbjogTW9uaXRvcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1vbml0b3IgPSBtb25pdG9ySW4uYXQoJ21lZ2FfcHJvdmlkZXInKTtcbiAgICBjb25zdCB7IGRvd25sb2FkIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKGRvd25sb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGlkLCBrZXkgfSA9IGRvd25sb2FkO1xuICAgIGNvbnN0IHsgZGF0YVBhdGgsIHRtcFBhdGggfSA9IHRoaXMuZW52aXJvbm1lbnQ7XG4gICAgY29uc3QgZG93bmxvYWRQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFBhdGgsICdzdG9yYWdlLmRiLnRhci5neicpO1xuXG4gICAgYXdhaXQgbW9uaXRvci5jYXB0dXJlU3BhbkxvZyhcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVnYSA9IGF3YWl0IHRoaXMuZ2V0TWVnYSgpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhZCA9IG5ldyBtZWdhLkZpbGUoe1xuICAgICAgICAgICAgZG93bmxvYWRJZDogaWQsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgfSkuZG93bmxvYWQoKTtcbiAgICAgICAgICBjb25zdCB3cml0ZSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGRvd25sb2FkUGF0aCk7XG5cbiAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3Qgb25Eb25lID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBvbkVycm9yID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmVhZC5vbmNlKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgIHdyaXRlLm9uY2UoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgd3JpdGUub25jZSgnZmluaXNoJywgb25Eb25lKTtcblxuICAgICAgICAgIHJlYWQucGlwZSh3cml0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ25lb19yZXN0b3JlX2Rvd25sb2FkJyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGF3YWl0IG1vbml0b3IuY2FwdHVyZVNwYW5Mb2coXG4gICAgICBhc3luYyAoKSA9PlxuICAgICAgICBleHRyYWN0KHtcbiAgICAgICAgICBkb3dubG9hZFBhdGgsXG4gICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIH0pLFxuICAgICAge1xuICAgICAgICBuYW1lOiAnbmVvX3Jlc3RvcmVfZXh0cmFjdCcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYmFja3VwKG1vbml0b3JJbjogTW9uaXRvcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1vbml0b3IgPSBtb25pdG9ySW4uYXQoJ21lZ2FfcHJvdmlkZXInKTtcbiAgICBjb25zdCB7IHVwbG9hZDogdXBsb2FkT3B0aW9ucyB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGlmICh1cGxvYWRPcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBlbWFpbCwgcGFzc3dvcmQsIGZpbGUgfSA9IHVwbG9hZE9wdGlvbnM7XG4gICAgY29uc3QgeyBkYXRhUGF0aCB9ID0gdGhpcy5lbnZpcm9ubWVudDtcblxuICAgIGF3YWl0IG1vbml0b3IuY2FwdHVyZVNwYW5Mb2coXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lZ2EgPSBhd2FpdCB0aGlzLmdldE1lZ2EoKTtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBtZWdhLlN0b3JhZ2Uoe1xuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgIGF1dG9sb2dpbjogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgICAgc3RvcmFnZS5sb2dpbigoaW5uZXJFcnI/OiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYgKGlubmVyRXJyKSB7XG4gICAgICAgICAgICAgIHJlamVjdChpbm5lckVycik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgdXBsb2FkKHtcbiAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICB3cml0ZTogc3RvcmFnZS51cGxvYWQoZmlsZSksXG4gICAgICAgICAgZmlsZUxpc3Q6IFsnLiddLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICduZW9fYmFja3VwX3B1c2gnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRNZWdhKCkge1xuICAgIHJldHVybiBpbXBvcnQoJ21lZ2FqcycpO1xuICB9XG59XG4iXX0=