1 | import * as fs from 'fs';
|
2 | import * as path from 'path';
|
3 | import { extract } from './extract';
|
4 | import { Provider } from './Provider';
|
5 | import { upload } from './upload';
|
6 | export 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==
|