UNPKG

@neo-one/node-data-backup

Version:

NEO•ONE node data path backup and restore.

121 lines (119 loc) 13.9 kB
"use strict"; 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=