From a0a7f6153c3f1d2ac1fa1fc04d7cc1e1693dd174 Mon Sep 17 00:00:00 2001 From: Luis Blanco Date: Wed, 28 Sep 2022 22:37:31 +0400 Subject: [PATCH] Improve download script --- download.js | 38 ++++++++++++++++++++++++++++++-------- package-lock.json | 12 ++++++++++-- package.json | 2 +- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/download.js b/download.js index 0f4ab38..f471cc0 100644 --- a/download.js +++ b/download.js @@ -9,16 +9,38 @@ const WritableBuffer = require('./writable-buffer'); const protocols = { http, https }; -module.exports = url => new Promise((res, rej) => { +const download = async (url, count = 1) => { url = url.toLowerCase(); const stream = new WritableBuffer(); - const proto = protocols[url.match(/^https?/)[0]]; + const proto = protocols[url.match(/^https?/)[0]]; - proto.get(url, response => { - response.pipe(stream); - - response.on('end', () => res(stream.get())); - response.on('error', err => rej(err)); + const response = await new Promise((res, rej) => { + const request = proto.get(url, response => res(response)); + request.on('error', err => rej(err)); }); -}); + + // Handle redirects + if ([301, 302, 303, 307].includes(response.statusCode)) { + if (count < 5) { + return download(response.headers.location, count + 1); + } + console.log(url); + throw new Error('Error: Too many redirects.'); + } + + // Handle bad status + if (response.statusCode !== 200) { + console.log(url); + throw new Error(`Response status was ${response.statusCode}`); + } + + response.pipe(stream); + + return new Promise((res, rej) => { + response.on('error', err => rej(err)); + response.on('end', () => res(stream.get())); + }); +}; + +module.exports = url => download(url); diff --git a/package-lock.json b/package-lock.json index 89625d9..38b2789 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "addon-tools-raub", - "version": "6.0.0", + "version": "6.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "addon-tools-raub", - "version": "6.0.0", + "version": "6.0.1", "license": "MIT", "devDependencies": { "adm-zip": "^0.5.9", @@ -24,6 +24,14 @@ "peerDependencies": { "adm-zip": "^0.5.9", "node-addon-api": "^5.0.0" + }, + "peerDependenciesMeta": { + "adm-zip": { + "optional": true + }, + "node-addon-api": { + "optional": true + } } }, "node_modules/@ampproject/remapping": { diff --git a/package.json b/package.json index 8acddfa..9cbc62c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "author": "Luis Blanco ", "name": "addon-tools-raub", - "version": "6.0.0", + "version": "6.0.1", "description": "Helpers for Node.js addons and dependency packages", "license": "MIT", "main": "index.js",