|
1 | 1 | const axios = require('axios');
|
2 |
| -const fs = require('fs'); |
3 |
| -const zip = require('cross-zip'); |
| 2 | +const fs = require('fs').promises; |
4 | 3 | const path = require('path');
|
| 4 | +const download = require('download'); |
5 | 5 | const packageJson = require('./package.json');
|
6 | 6 |
|
7 | 7 | let networkName = 'mainnet';
|
@@ -47,51 +47,90 @@ module.exports = {
|
47 | 47 | return path.dirname(require.resolve(packageJson.name));
|
48 | 48 | }
|
49 | 49 | },
|
| 50 | + createDirIfNotExist: async path => { |
| 51 | + try { |
| 52 | + await fs.access(path); |
| 53 | + } catch (e) { |
| 54 | + if (e.code === 'ENOENT') { |
| 55 | + await fs.mkdir(path); |
| 56 | + } else { |
| 57 | + throw new Error( |
| 58 | + `[prepareMetamask] Unhandled error from fs.access() with following error:\n${e}`, |
| 59 | + ); |
| 60 | + } |
| 61 | + } |
| 62 | + }, |
| 63 | + checkDirOrFileExist: async path => { |
| 64 | + try { |
| 65 | + await fs.access(path); |
| 66 | + return true; |
| 67 | + } catch (e) { |
| 68 | + if (e.code === 'ENOENT') { |
| 69 | + return false; |
| 70 | + } else { |
| 71 | + throw new Error( |
| 72 | + `[checkDirOrFileExist] Unhandled error from fs.access() with following error:\n${e}`, |
| 73 | + ); |
| 74 | + } |
| 75 | + } |
| 76 | + }, |
50 | 77 | getMetamaskReleases: async version => {
|
51 | 78 | let filename;
|
52 | 79 | let downloadUrl;
|
| 80 | + let tagName; |
53 | 81 |
|
54 |
| - const response = await axios.get( |
55 |
| - 'https://api.github.com/repos/metamask/metamask-extension/releases', |
56 |
| - ); |
57 |
| - |
58 |
| - if (version === 'latest' || !version) { |
59 |
| - filename = response.data[0].assets[0].name; |
60 |
| - downloadUrl = response.data[0].assets[0].browser_download_url; |
61 |
| - } else if (version) { |
62 |
| - filename = `metamask-chrome-${version}.zip`; |
63 |
| - downloadUrl = `https://github.com/MetaMask/metamask-extension/releases/download/v${version}/metamask-chrome-${version}.zip`; |
| 82 | + try { |
| 83 | + const response = await axios.get( |
| 84 | + 'https://api.github.com/repos/metamask/metamask-extension/releases', |
| 85 | + ); |
| 86 | + if (version === 'latest' || !version) { |
| 87 | + filename = response.data[0].assets[0].name; |
| 88 | + downloadUrl = response.data[0].assets[0].browser_download_url; |
| 89 | + tagName = response.data[0].tag_name; |
| 90 | + } else if (version) { |
| 91 | + filename = `metamask-chrome-${version}.zip`; |
| 92 | + downloadUrl = `https://github.com/MetaMask/metamask-extension/releases/download/v${version}/metamask-chrome-${version}.zip`; |
| 93 | + tagName = `metamask-chrome-${version}`; |
| 94 | + } |
| 95 | + return { |
| 96 | + filename, |
| 97 | + downloadUrl, |
| 98 | + tagName, |
| 99 | + }; |
| 100 | + } catch (e) { |
| 101 | + throw new Error( |
| 102 | + `[getMetamaskReleases] Unable to fetch metamask releases from: ${downloadUrl} with following error:\n${e}`, |
| 103 | + ); |
64 | 104 | }
|
65 |
| - |
66 |
| - return { |
67 |
| - filename, |
68 |
| - downloadUrl, |
69 |
| - }; |
70 | 105 | },
|
71 | 106 | download: async (url, destination) => {
|
72 |
| - const writer = fs.createWriteStream(destination); |
73 |
| - const result = await axios({ |
74 |
| - url, |
75 |
| - method: 'GET', |
76 |
| - responseType: 'stream', |
77 |
| - }); |
78 |
| - await new Promise(resolve => |
79 |
| - result.data.pipe(writer).on('finish', resolve), |
80 |
| - ); |
81 |
| - }, |
82 |
| - extract: async (file, destination) => { |
83 |
| - await zip.unzip(file, destination); |
| 107 | + try { |
| 108 | + await download(url, destination, { extract: true }); |
| 109 | + } catch (e) { |
| 110 | + throw new Error( |
| 111 | + `[download] Unable to download metamask release from: ${url} to: ${destination} with following error:\n${e}`, |
| 112 | + ); |
| 113 | + } |
84 | 114 | },
|
85 | 115 | prepareMetamask: async version => {
|
86 | 116 | const release = await module.exports.getMetamaskReleases(version);
|
87 | 117 | const downloadsDirectory = path.resolve(__dirname, 'downloads');
|
88 |
| - if (!fs.existsSync(downloadsDirectory)) { |
89 |
| - fs.mkdirSync(downloadsDirectory); |
| 118 | + await module.exports.createDirIfNotExist(downloadsDirectory); |
| 119 | + const metamaskDirectory = path.join(downloadsDirectory, release.tagName); |
| 120 | + const metamaskDirectoryExists = await module.exports.checkDirOrFileExist( |
| 121 | + metamaskDirectory, |
| 122 | + ); |
| 123 | + const metamaskManifestFilePath = path.join( |
| 124 | + downloadsDirectory, |
| 125 | + release.tagName, |
| 126 | + 'manifest.json', |
| 127 | + ); |
| 128 | + const metamaskManifestFileExists = await module.exports.checkDirOrFileExist( |
| 129 | + metamaskManifestFilePath, |
| 130 | + ); |
| 131 | + if (!metamaskDirectoryExists && !metamaskManifestFileExists) { |
| 132 | + await module.exports.download(release.downloadUrl, metamaskDirectory); |
90 | 133 | }
|
91 |
| - const downloadDestination = path.join(downloadsDirectory, release.filename); |
92 |
| - await module.exports.download(release.downloadUrl, downloadDestination); |
93 |
| - const metamaskDirectory = path.join(downloadsDirectory, 'metamask'); |
94 |
| - await module.exports.extract(downloadDestination, metamaskDirectory); |
95 | 134 | return metamaskDirectory;
|
96 | 135 | },
|
97 | 136 | };
|
0 commit comments