UNPKG

13.8 kBJavaScriptView Raw
1import * as fs from 'fs';
2import * as path from 'path';
3import { extract } from './extract';
4import { Provider } from './Provider';
5import { upload } from './upload';
6export class MegaProvider extends Provider {
7 constructor({ environment, options }) {
8 super();
9 this.environment = environment;
10 this.options = options;
11 }
12 async canRestore() {
13 const { download } = this.options;
14 if (download === undefined) {
15 return false;
16 }
17 const { id, key } = download;
18 const mega = await this.getMega();
19 const file = new mega.File({ downloadId: id, key });
20 return new Promise((resolve) => {
21 file.loadAttributes((err) => {
22 if (err) {
23 resolve(false);
24 }
25 else {
26 resolve(true);
27 }
28 });
29 });
30 }
31 async restore(monitorIn) {
32 const monitor = monitorIn.at('mega_provider');
33 const { download } = this.options;
34 if (download === undefined) {
35 return;
36 }
37 const { id, key } = download;
38 const { dataPath, tmpPath } = this.environment;
39 const downloadPath = path.resolve(tmpPath, 'storage.db.tar.gz');
40 await monitor.captureSpanLog(async () => {
41 const mega = await this.getMega();
42 return new Promise((resolve, reject) => {
43 const read = new mega.File({
44 downloadId: id,
45 key,
46 }).download();
47 const write = fs.createWriteStream(downloadPath);
48 let done = false;
49 const cleanup = () => {
50 done = true;
51 };
52 const onDone = () => {
53 if (!done) {
54 cleanup();
55 resolve();
56 }
57 };
58 const onError = (error) => {
59 if (!done) {
60 cleanup();
61 reject(error);
62 }
63 };
64 read.once('error', onError);
65 write.once('error', onError);
66 write.once('finish', onDone);
67 read.pipe(write);
68 });
69 }, {
70 name: 'neo_restore_download',
71 });
72 await monitor.captureSpanLog(async () => extract({
73 downloadPath,
74 dataPath,
75 }), {
76 name: 'neo_restore_extract',
77 });
78 }
79 async backup(monitorIn) {
80 const monitor = monitorIn.at('mega_provider');
81 const { upload: uploadOptions } = this.options;
82 if (uploadOptions === undefined) {
83 return;
84 }
85 const { email, password, file } = uploadOptions;
86 const { dataPath } = this.environment;
87 await monitor.captureSpanLog(async () => {
88 const mega = await this.getMega();
89 const storage = new mega.Storage({
90 email,
91 password,
92 autologin: false,
93 });
94 await new Promise((resolve, reject) => storage.login((innerErr) => {
95 if (innerErr) {
96 reject(innerErr);
97 }
98 else {
99 resolve();
100 }
101 }));
102 await upload({
103 dataPath,
104 write: storage.upload(file),
105 fileList: ['.'],
106 });
107 }, {
108 name: 'neo_backup_push',
109 });
110 }
111 async getMega() {
112 return import('megajs');
113 }
114}
115
116//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFJLEVBQUUsR0FBRyxhQUFhLENBQUM7UUFDaEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFdEMsTUFBTSxPQUFPLENBQUMsY0FBYyxDQUMxQixLQUFLLElBQUksRUFBRTtZQUNULE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDL0IsS0FBSztnQkFDTCxRQUFRO2dCQUNSLFNBQVMsRUFBRSxLQUFLO2FBQ2pCLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FDMUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQWdCLEVBQUUsRUFBRTtnQkFDakMsSUFBSSxRQUFRLEVBQUU7b0JBQ1osTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUNsQjtxQkFBTTtvQkFDTCxPQUFPLEVBQUUsQ0FBQztpQkFDWDtZQUNILENBQUMsQ0FBQyxDQUNILENBQUM7WUFFRixNQUFNLE1BQU0sQ0FBQztnQkFDWCxRQUFRO2dCQUNSLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDM0IsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUMsRUFDRDtZQUNFLElBQUksRUFBRSxpQkFBaUI7U0FDeEIsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPO1FBQ25CLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFCLENBQUM7Q0FDRiIsImZpbGUiOiJuZW8tb25lLW5vZGUtZGF0YS1iYWNrdXAvc3JjL3Byb3ZpZGVyL01lZ2FQcm92aWRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vbml0b3IgfSBmcm9tICdAbmVvLW9uZS9tb25pdG9yJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGV4dHJhY3QgfSBmcm9tICcuL2V4dHJhY3QnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVyJztcbmltcG9ydCB7IHVwbG9hZCB9IGZyb20gJy4vdXBsb2FkJztcblxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIHtcbiAgcmVhZG9ubHkgZG93bmxvYWQ/OiB7XG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgfTtcblxuICByZWFkb25seSB1cGxvYWQ/OiB7XG4gICAgcmVhZG9ubHkgZW1haWw6IHN0cmluZztcbiAgICByZWFkb25seSBwYXNzd29yZDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGZpbGU6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIE1lZ2FQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogT3B0aW9ucztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoeyBlbnZpcm9ubWVudCwgb3B0aW9ucyB9OiB7IHJlYWRvbmx5IGVudmlyb25tZW50OiBFbnZpcm9ubWVudDsgcmVhZG9ubHkgb3B0aW9uczogT3B0aW9ucyB9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjYW5SZXN0b3JlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgZG93bmxvYWQgfSA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAoZG93bmxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaWQsIGtleSB9ID0gZG93bmxvYWQ7XG4gICAgY29uc3QgbWVnYSA9IGF3YWl0IHRoaXMuZ2V0TWVnYSgpO1xuICAgIGNvbnN0IGZpbGUgPSBuZXcgbWVnYS5GaWxlKHsgZG93bmxvYWRJZDogaWQsIGtleSB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZmlsZS5sb2FkQXR0cmlidXRlcygoZXJyPzogRXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlc3RvcmUobW9uaXRvckluOiBNb25pdG9yKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbW9uaXRvciA9IG1vbml0b3JJbi5hdCgnbWVnYV9wcm92aWRlcicpO1xuICAgIGNvbnN0IHsgZG93bmxvYWQgfSA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAoZG93bmxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaWQsIGtleSB9ID0gZG93bmxvYWQ7XG4gICAgY29uc3QgeyBkYXRhUGF0aCwgdG1wUGF0aCB9ID0gdGhpcy5lbnZpcm9ubWVudDtcbiAgICBjb25zdCBkb3dubG9hZFBhdGggPSBwYXRoLnJlc29sdmUodG1wUGF0aCwgJ3N0b3JhZ2UuZGIudGFyLmd6Jyk7XG5cbiAgICBhd2FpdCBtb25pdG9yLmNhcHR1cmVTcGFuTG9nKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZWdhID0gYXdhaXQgdGhpcy5nZXRNZWdhKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCByZWFkID0gbmV3IG1lZ2EuRmlsZSh7XG4gICAgICAgICAgICBkb3dubG9hZElkOiBpZCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICB9KS5kb3dubG9hZCgpO1xuICAgICAgICAgIGNvbnN0IHdyaXRlID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0oZG93bmxvYWRQYXRoKTtcblxuICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBvbkRvbmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZWFkLm9uY2UoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgd3JpdGUub25jZSgnZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICB3cml0ZS5vbmNlKCdmaW5pc2gnLCBvbkRvbmUpO1xuXG4gICAgICAgICAgcmVhZC5waXBlKHdyaXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnbmVvX3Jlc3RvcmVfZG93bmxvYWQnLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXdhaXQgbW9uaXRvci5jYXB0dXJlU3BhbkxvZyhcbiAgICAgIGFzeW5jICgpID0+XG4gICAgICAgIGV4dHJhY3Qoe1xuICAgICAgICAgIGRvd25sb2FkUGF0aCxcbiAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgfSksXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICduZW9fcmVzdG9yZV9leHRyYWN0JyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBiYWNrdXAobW9uaXRvckluOiBNb25pdG9yKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbW9uaXRvciA9IG1vbml0b3JJbi5hdCgnbWVnYV9wcm92aWRlcicpO1xuICAgIGNvbnN0IHsgdXBsb2FkOiB1cGxvYWRPcHRpb25zIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKHVwbG9hZE9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGVtYWlsLCBwYXNzd29yZCwgZmlsZSB9ID0gdXBsb2FkT3B0aW9ucztcbiAgICBjb25zdCB7IGRhdGFQYXRoIH0gPSB0aGlzLmVudmlyb25tZW50O1xuXG4gICAgYXdhaXQgbW9uaXRvci5jYXB0dXJlU3BhbkxvZyhcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVnYSA9IGF3YWl0IHRoaXMuZ2V0TWVnYSgpO1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gbmV3IG1lZ2EuU3RvcmFnZSh7XG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgYXV0b2xvZ2luOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgICAgICBzdG9yYWdlLmxvZ2luKChpbm5lckVycj86IEVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5uZXJFcnIpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGlubmVyRXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBhd2FpdCB1cGxvYWQoe1xuICAgICAgICAgIGRhdGFQYXRoLFxuICAgICAgICAgIHdyaXRlOiBzdG9yYWdlLnVwbG9hZChmaWxlKSxcbiAgICAgICAgICBmaWxlTGlzdDogWycuJ10sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ25lb19iYWNrdXBfcHVzaCcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE1lZ2EoKSB7XG4gICAgcmV0dXJuIGltcG9ydCgnbWVnYWpzJyk7XG4gIH1cbn1cbiJdfQ==