Skip to content

Commit 78997dd

Browse files
committed
Promisify solc-js downloader
1 parent fc232fe commit 78997dd

File tree

2 files changed

+80
-63
lines changed

2 files changed

+80
-63
lines changed

downloadCurrentVersion.ts

Lines changed: 16 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,73 +3,26 @@
33
// This is used to download the correct binary version
44
// as part of the prepublish step.
55

6-
import * as fs from 'fs';
7-
import { https } from 'follow-redirects';
8-
import MemoryStream from 'memorystream';
9-
import { keccak256 } from 'js-sha3';
6+
import downloader from './downloader';
107
const pkg = require('./package.json');
118

12-
function getVersionList (cb) {
13-
console.log('Retrieving available version list...');
14-
15-
const mem = new MemoryStream(null, { readable: false });
16-
https.get('https://binaries.soliditylang.org/bin/list.json', function (response) {
17-
if (response.statusCode !== 200) {
18-
console.log('Error downloading file: ' + response.statusCode);
19-
process.exit(1);
9+
async function download () {
10+
try {
11+
const list = JSON.parse(await downloader.getVersionList());
12+
const wanted = pkg.version.match(/^(\d+\.\d+\.\d+)$/)[1];
13+
const releaseFileName = list.releases[wanted];
14+
const expectedFile = list.builds.filter(function (entry) { return entry.path === releaseFileName; })[0];
15+
if (!expectedFile) {
16+
throw new Error('Requested version not found. Version list is invalid or corrupted?');
2017
}
21-
response.pipe(mem);
22-
response.on('end', function () {
23-
cb(mem.toString());
24-
});
25-
});
26-
}
27-
28-
function downloadBinary (outputName, version, expectedHash) {
29-
console.log('Downloading version', version);
30-
31-
// Remove if existing
32-
if (fs.existsSync(outputName)) {
33-
fs.unlinkSync(outputName);
34-
}
35-
36-
process.on('SIGINT', function () {
37-
console.log('Interrupted, removing file.');
38-
fs.unlinkSync(outputName);
18+
const expectedHash = expectedFile.keccak256;
19+
await downloader.downloadBinary('soljson.js', releaseFileName, expectedHash);
20+
process.exit();
21+
} catch (err) {
22+
console.log(err.message);
3923
process.exit(1);
40-
});
41-
42-
const file = fs.createWriteStream(outputName, { encoding: 'binary' });
43-
https.get('https://binaries.soliditylang.org/bin/' + version, function (response) {
44-
if (response.statusCode !== 200) {
45-
console.log('Error downloading file: ' + response.statusCode);
46-
process.exit(1);
47-
}
48-
response.pipe(file);
49-
file.on('finish', function () {
50-
file.close(function () {
51-
const hash = '0x' + keccak256(fs.readFileSync(outputName, { encoding: 'binary' }));
52-
if (expectedHash !== hash) {
53-
console.log('Hash mismatch: ' + expectedHash + ' vs ' + hash);
54-
process.exit(1);
55-
}
56-
console.log('Done.');
57-
});
58-
});
59-
});
24+
}
6025
}
6126

6227
console.log('Downloading correct solidity binary...');
63-
64-
getVersionList(function (list) {
65-
list = JSON.parse(list);
66-
const wanted = pkg.version.match(/^(\d+\.\d+\.\d+)$/)[1];
67-
const releaseFileName = list.releases[wanted];
68-
const expectedFile = list.builds.filter(function (entry) { return entry.path === releaseFileName; })[0];
69-
if (!expectedFile) {
70-
console.log('Version list is invalid or corrupted?');
71-
process.exit(1);
72-
}
73-
const expectedHash = expectedFile.keccak256;
74-
downloadBinary('soljson.js', releaseFileName, expectedHash);
75-
});
28+
download();

downloader.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import * as fs from 'fs';
2+
import { https } from 'follow-redirects';
3+
import MemoryStream from 'memorystream';
4+
import { keccak256 } from 'js-sha3';
5+
6+
function getVersionList () {
7+
console.log('Retrieving available version list...');
8+
9+
return new Promise<string>((resolve, reject) => {
10+
const mem = new MemoryStream(null, { readable: false });
11+
https.get('https://binaries.soliditylang.org/bin/list.json', function (response) {
12+
if (response.statusCode !== 200) {
13+
reject(new Error('Error downloading file: ' + response.statusCode));
14+
}
15+
response.pipe(mem);
16+
response.on('end', function () {
17+
resolve(mem.toString());
18+
});
19+
}).on('error', (err) => {
20+
reject(err);
21+
});
22+
});
23+
}
24+
25+
function downloadBinary (outputName, version, expectedHash) {
26+
console.log('Downloading version', version);
27+
28+
return new Promise<void>((resolve, reject) => {
29+
// Remove if existing
30+
if (fs.existsSync(outputName)) {
31+
fs.unlinkSync(outputName);
32+
}
33+
34+
process.on('SIGINT', function () {
35+
fs.unlinkSync(outputName);
36+
reject(new Error('Interrupted, removing file.'));
37+
});
38+
39+
const file = fs.createWriteStream(outputName, { encoding: 'binary' });
40+
https.get('https://binaries.soliditylang.org/bin/' + version, function (response) {
41+
if (response.statusCode !== 200) {
42+
reject(new Error('Error downloading file: ' + response.statusCode));
43+
}
44+
response.pipe(file);
45+
file.on('finish', function () {
46+
file.close();
47+
const hash = '0x' + keccak256(fs.readFileSync(outputName, { encoding: 'binary' }));
48+
if (expectedHash !== hash) {
49+
reject(new Error('Hash mismatch: ' + expectedHash + ' vs ' + hash));
50+
} else {
51+
console.log('Done.');
52+
resolve();
53+
}
54+
});
55+
}).on('error', (err) => {
56+
reject(err);
57+
});
58+
});
59+
}
60+
61+
export = {
62+
getVersionList,
63+
downloadBinary
64+
};

0 commit comments

Comments
 (0)