Исправление багов
This commit is contained in:
@@ -259,9 +259,8 @@ class BUCServer {
|
|||||||
try {
|
try {
|
||||||
let unchanged = true;
|
let unchanged = true;
|
||||||
let hash = '';
|
let hash = '';
|
||||||
log(`head ${row.id}`)
|
|
||||||
const headers = await this.down.head(row.id);
|
const headers = await this.down.head(row.id);
|
||||||
log(`headers ${row.id}: ${JSON.stringify(headers)}`)
|
|
||||||
|
|
||||||
const etag = headers['etag'] || '';
|
const etag = headers['etag'] || '';
|
||||||
const modTime = headers['last-modified'] || '';
|
const modTime = headers['last-modified'] || '';
|
||||||
@@ -274,9 +273,8 @@ log(`headers ${row.id}: ${JSON.stringify(headers)}`)
|
|||||||
&& (!modTime || !row.modTime || (modTime !== row.modTime))
|
&& (!modTime || !row.modTime || (modTime !== row.modTime))
|
||||||
&& (!size || !row.size || (size !== row.size))
|
&& (!size || !row.size || (size !== row.size))
|
||||||
) {
|
) {
|
||||||
log(`down ${row.id}`)
|
|
||||||
const downdata = await this.down.load(row.id);
|
const downdata = await this.down.load(row.id);
|
||||||
log(`loaded ${row.id}`)
|
|
||||||
|
|
||||||
size = downdata.length;
|
size = downdata.length;
|
||||||
hash = await utils.getBufHash(downdata, 'sha256', 'hex');
|
hash = await utils.getBufHash(downdata, 'sha256', 'hex');
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
const axios = require('axios');
|
const axios = require('axios');
|
||||||
|
const utils = require('./utils');
|
||||||
|
|
||||||
const userAgent = 'Mozilla/5.0 (X11; HasCodingOs 1.0; Linux x64) AppleWebKit/637.36 (KHTML, like Gecko) Chrome/70.0.3112.101 Safari/637.36 HasBrowser/5.0';
|
const userAgent = 'Mozilla/5.0 (X11; HasCodingOs 1.0; Linux x64) AppleWebKit/637.36 (KHTML, like Gecko) Chrome/70.0.3112.101 Safari/637.36 HasBrowser/5.0';
|
||||||
|
|
||||||
@@ -77,25 +78,42 @@ class FileDownloader {
|
|||||||
return res.headers;
|
return res.headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
streamToBuffer(stream, progress) {
|
streamToBuffer(stream, progress, timeout = 30*1000) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
if (!progress)
|
if (!progress)
|
||||||
progress = () => {};
|
progress = () => {};
|
||||||
|
|
||||||
const _buf = [];
|
const _buf = [];
|
||||||
|
let resolved = false;
|
||||||
|
let timer = 0;
|
||||||
|
|
||||||
stream.on('data', (chunk) => {
|
stream.on('data', (chunk) => {
|
||||||
|
timer = 0;
|
||||||
_buf.push(chunk);
|
_buf.push(chunk);
|
||||||
progress(chunk);
|
progress(chunk);
|
||||||
});
|
});
|
||||||
stream.on('end', () => resolve(Buffer.concat(_buf)));
|
stream.on('end', () => {
|
||||||
|
resolved = true;
|
||||||
|
timer = timeout;
|
||||||
|
resolve(Buffer.concat(_buf));
|
||||||
|
});
|
||||||
stream.on('error', (err) => {
|
stream.on('error', (err) => {
|
||||||
reject(err);
|
reject(err);
|
||||||
});
|
});
|
||||||
stream.on('aborted', () => {
|
stream.on('aborted', () => {
|
||||||
reject(new Error('aborted'));
|
reject(new Error('aborted'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//бодяга с timer и timeout, чтобы гарантировать отсутствие зависания по каким-либо причинам
|
||||||
|
(async() => {
|
||||||
|
while (timer < timeout) {
|
||||||
|
await utils.sleep(1000);
|
||||||
|
timer += 1000;
|
||||||
|
}
|
||||||
|
if (!resolved)
|
||||||
|
reject(new Error('FileDownloader: timed out'))
|
||||||
|
})();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user