From f8557cba88f21526354c083ad224253da4a7e457 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Fri, 5 Aug 2022 02:25:45 +0700 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B0=D0=B3=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/core/BookUpdateChecker/BUCServer.js | 6 ++---- server/core/FileDownloader.js | 22 ++++++++++++++++++++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/server/core/BookUpdateChecker/BUCServer.js b/server/core/BookUpdateChecker/BUCServer.js index 4f51d04c..820c44aa 100644 --- a/server/core/BookUpdateChecker/BUCServer.js +++ b/server/core/BookUpdateChecker/BUCServer.js @@ -259,9 +259,8 @@ class BUCServer { try { let unchanged = true; let hash = ''; -log(`head ${row.id}`) + const headers = await this.down.head(row.id); -log(`headers ${row.id}: ${JSON.stringify(headers)}`) const etag = headers['etag'] || ''; const modTime = headers['last-modified'] || ''; @@ -274,9 +273,8 @@ log(`headers ${row.id}: ${JSON.stringify(headers)}`) && (!modTime || !row.modTime || (modTime !== row.modTime)) && (!size || !row.size || (size !== row.size)) ) { -log(`down ${row.id}`) + const downdata = await this.down.load(row.id); -log(`loaded ${row.id}`) size = downdata.length; hash = await utils.getBufHash(downdata, 'sha256', 'hex'); diff --git a/server/core/FileDownloader.js b/server/core/FileDownloader.js index b05fb26a..7061532a 100644 --- a/server/core/FileDownloader.js +++ b/server/core/FileDownloader.js @@ -1,4 +1,5 @@ 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'; @@ -77,25 +78,42 @@ class FileDownloader { return res.headers; } - streamToBuffer(stream, progress) { + streamToBuffer(stream, progress, timeout = 30*1000) { return new Promise((resolve, reject) => { if (!progress) progress = () => {}; const _buf = []; + let resolved = false; + let timer = 0; stream.on('data', (chunk) => { + timer = 0; _buf.push(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) => { reject(err); }); stream.on('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')) + })(); }); } }