[Updater > Request] Self-rewrite

This commit is contained in:
Ducko 2022-01-19 18:16:35 +00:00
parent 96da1645b6
commit b9e8779b06
1 changed files with 47 additions and 161 deletions

View File

@ -1,160 +1,61 @@
"use strict"; const request = require('request');
Object.defineProperty(exports, "__esModule", { const nodeRequest = ({ method, url, headers, qs, timeout, body, stream }) => new Promise((resolve, reject) => {
value: true const req = request({
});
exports.default = void 0;
var _electron = require("electron");
var _querystring = _interopRequireDefault(require("querystring"));
var _request = _interopRequireDefault(require("request"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const DEFAULT_REQUEST_TIMEOUT = 30000;
function makeHTTPResponse({
method,
url,
headers,
statusCode,
statusMessage
}, body) {
return {
method, method,
url, url,
qs,
headers, headers,
statusCode, followAllRedirects: true,
statusMessage, encoding: null,
timeout: timeout ?? 30000,
body body
}; });
}
function makeHTTPStatusError(response) { req.on('response', (response) => {
const err = new Error(`HTTP Error: Status Code ${response.statusCode}`); const totalBytes = parseInt(response.headers['content-length'] || 1, 10);
err.response = response; let receivedBytes = 0;
return err; const chunks = [];
}
function handleHTTPResponse(resolve, reject, response, stream) { const badStatus = response.statusCode >= 300;
const totalBytes = parseInt(response.headers['content-length'] || 1, 10); if (badStatus) stream = null;
let receivedBytes = 0;
const chunks = []; // don't stream response if it's a failure response.on('data', chunk => {
if (stream != null) {
receivedBytes += chunk.length;
stream.write(chunk);
return stream.emit('progress', {
totalBytes,
receivedBytes
});
}
chunks.push(chunk);
});
if (response.statusCode >= 300) { response.on('end', () => {
stream = null; if (stream != null) {
} stream.on('finish', () => resolve(response));
return stream.end();
response.on('data', chunk => { }
if (stream != null) {
receivedBytes += chunk.length; if (badStatus) {
stream.write(chunk); const err = new Error('HTTP Error: Status Code ' + response.statusCode);
stream.emit('progress', { err.response = response;
totalBytes, return reject(err);
receivedBytes }
resolve({
...response,
body: Buffer.concat(chunks)
}); });
return;
}
chunks.push(chunk);
});
response.on('end', () => {
if (stream != null) {
stream.on('finish', () => resolve(makeHTTPResponse(response, null)));
stream.end();
return;
}
const res = makeHTTPResponse(response, Buffer.concat(chunks));
if (res.statusCode >= 300) {
reject(makeHTTPStatusError(res));
return;
}
resolve(res);
});
}
function nodeRequest({
method,
url,
headers,
qs,
timeout,
body,
stream
}) {
return new Promise((resolve, reject) => {
const req = (0, _request.default)({
method,
url,
qs,
headers,
followAllRedirects: true,
encoding: null,
timeout: timeout != null ? timeout : DEFAULT_REQUEST_TIMEOUT,
body
}); });
req.on('response', response => handleHTTPResponse(resolve, reject, response, stream));
req.on('error', err => reject(err));
});
}
async function electronRequest({
method,
url,
headers,
qs,
timeout,
body,
stream
}) {
await _electron.app.whenReady();
const {
net,
session
} = require('electron');
const req = net.request({
method,
url: `${url}${qs != null ? `?${_querystring.default.stringify(qs)}` : ''}`,
redirect: 'follow',
session: session.defaultSession
}); });
if (headers != null) { req.on('error', err => reject(err));
for (const headerKey of Object.keys(headers)) { });
req.setHeader(headerKey, headers[headerKey]);
}
}
if (body != null) { function requestWithMethod(method, options) {
req.write(body, 'utf-8');
}
return new Promise((resolve, reject) => {
const reqTimeout = setTimeout(() => {
req.abort();
reject(new Error(`network timeout: ${url}`));
}, timeout != null ? timeout : DEFAULT_REQUEST_TIMEOUT);
req.on('login', (authInfo, callback) => callback());
req.on('response', response => {
clearTimeout(reqTimeout);
handleHTTPResponse(resolve, reject, response, stream);
});
req.on('error', err => {
clearTimeout(reqTimeout);
reject(err);
});
req.end();
});
}
async function requestWithMethod(method, options) {
if (typeof options === 'string') { if (typeof options === 'string') {
options = { options = {
url: options url: options
@ -165,24 +66,9 @@ async function requestWithMethod(method, options) {
method method
}; };
log('Request', method, options.url); log('Updater > Request', method, options.url);
/* try {
return await electronRequest(options);
} catch (err) {
console.log(`Error downloading with electron net: ${err.message}`);
console.log('Falling back to node net library..');
} */
return nodeRequest(options); return nodeRequest(options);
} // only supports get for now, since retrying is non-idempotent and
// we'd want to grovel the errors to make sure it's safe to retry
for (const method of ['get']) {
requestWithMethod[method] = requestWithMethod.bind(null, method.toUpperCase());
} }
var _default = requestWithMethod; exports.get = requestWithMethod.bind(null, method.toUpperCase());
exports.default = _default;
module.exports = exports.default;