UNPKG

2.91 kBJavaScriptView Raw
1var os = require('os');
2var fs = require('fs');
3var path = require('path');
4var url = require('url');
5
6var got = require('got');
7var tar = require('tar');
8var AdmZip = require('adm-zip');
9var proxyAgent = require('https-proxy-agent');
10
11var Promise = require('bluebird');
12
13var platform = os.platform();
14var arch = os.arch();
15
16var baseCDNURL = process.env.GECKODRIVER_CDNURL || process.env.npm_config_geckodriver_cdnurl || 'https://github.com/mozilla/geckodriver/releases/download';
17var CACHED_ARCHIVE = process.env.GECKODRIVER_FILEPATH ? path.resolve(process.env.GECKODRIVER_FILEPATH) : undefined;
18
19var version = process.env.GECKODRIVER_VERSION || '0.24.0';
20
21// Remove trailing slash if included
22baseCDNURL = baseCDNURL.replace(/\/+$/, '');
23
24var baseDownloadUrl = baseCDNURL + '/v' + version + '/geckodriver-v' + version;
25var DOWNLOAD_MAC = baseDownloadUrl +'-macos.tar.gz';
26var DOWNLOAD_LINUX64 = baseDownloadUrl +'-linux64.tar.gz';
27var DOWNLOAD_LINUX32 = baseDownloadUrl +'-linux32.tar.gz';
28var DOWNLOAD_WIN32 = baseDownloadUrl +'-win32.zip';
29var DOWNLOAD_WIN64 = baseDownloadUrl +'-win64.zip';
30
31// TODO: move this to package.json or something
32var downloadUrl = DOWNLOAD_MAC;
33var outFile = 'geckodriver.tar.gz';
34var executable = 'geckodriver';
35
36var downloadOptions = {}
37var proxy = process.env.HTTPS_PROXY || process.env.HTTP_PROXY || null;
38if (proxy !== null) {
39 downloadOptions.agent = new proxyAgent(proxy);
40}
41
42if (platform === 'linux') {
43 downloadUrl = arch === 'x64' ? DOWNLOAD_LINUX64 : DOWNLOAD_LINUX32;
44}
45
46if (platform === 'win32') {
47 // No 32-bits of geckodriver for now
48 downloadUrl = arch === 'x64' ? DOWNLOAD_WIN64 : DOWNLOAD_WIN32;
49 outFile = 'geckodriver.zip';
50 executable = 'geckodriver.exe';
51}
52
53if (CACHED_ARCHIVE) {
54 extract(CACHED_ARCHIVE);
55} else {
56 process.stdout.write('Downloading geckodriver... ');
57 got.stream(url.parse(downloadUrl), downloadOptions)
58 .pipe(fs.createWriteStream(outFile))
59 .on('close', function () {
60 extract(path.join(__dirname, outFile));
61 });
62}
63
64
65function extract(archivePath) {
66 process.stdout.write('Extracting... ');
67 var targetDirectoryPath = __dirname;
68
69 return new Promise(function (resolve, reject) {
70 if (outFile.indexOf('.tar.gz') >= 0) {
71 tar.extract({
72 file: archivePath,
73 cwd: targetDirectoryPath
74 }).then(function (err) {
75 if (err) {
76 reject(err);
77 } else {
78 resolve();
79 }
80 });
81 } else if (outFile.indexOf('.zip') >= 0) {
82 new AdmZip(archivePath).extractAllToAsync(targetDirectoryPath, true, function (err) {
83 if (err) {
84 reject(err);
85 } else {
86 resolve();
87 }
88 });
89 } else {
90 reject('This archive extension is not supported: ' + archivePath);
91 }
92 })
93 .then(function () {
94 console.log('Complete.');
95 })
96 .catch(function (err) {
97 console.log('Something is wrong ', err.stack);
98 });
99}