From d040dd07185ec1649598119769ebbf582f817919 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Sun, 13 Jan 2019 15:20:03 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/core/FileDownloader.js | 34 ++++++++++++++++++++++++++++++++++ server/core/ReaderWorker.js | 23 ++++++++--------------- 2 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 server/core/FileDownloader.js diff --git a/server/core/FileDownloader.js b/server/core/FileDownloader.js new file mode 100644 index 00000000..9feb7a36 --- /dev/null +++ b/server/core/FileDownloader.js @@ -0,0 +1,34 @@ +const got = require('got'); + +class FileDownloader { + constructor() { + } + + async load(url, callback) { + const maxDownloadSize = 10*1024*1024; + + let estSize = 100000; + const request = got(url).on('downloadProgress', progress => { + if (progress.transferred > maxDownloadSize) { + request.cancel(); + } + const prog = Math.round(progress.transferred/estSize*100); + if (callback) + callback(prog); + if (prog > 100) + estSize *= 1.5; + }); + + + try { + return (await request).body; + } catch (error) { + if (request.isCanceled) { + throw new Error('file too big') + } + throw error; + } + } +} + +module.exports = FileDownloader; \ No newline at end of file diff --git a/server/core/ReaderWorker.js b/server/core/ReaderWorker.js index abde29d8..7d1503ea 100644 --- a/server/core/ReaderWorker.js +++ b/server/core/ReaderWorker.js @@ -1,11 +1,11 @@ +const fs = require('fs-extra'); + const workerState = require('./workerState'); +const FileDownloader = require('./FileDownloader'); const FileDecompressor = require('./FileDecompressor'); const BookConverter = require('./BookConverter'); const utils = require('./utils'); -const fs = require('fs-extra'); -const got = require('got'); - class ReaderWorker { constructor(config) { this.config = Object.assign({}, config); @@ -16,12 +16,12 @@ class ReaderWorker { this.config.tempPublicDir = `${config.publicDir}/tmp`; fs.ensureDirSync(this.config.tempPublicDir); + this.down = new FileDownloader(); this.decomp = new FileDecompressor(); this.bookConverter = new BookConverter(); } async loadBook(url, wState) { - const maxDownloadSize = 10*1024*1024; let errMes = ''; let decompDir = ''; let downloadedFilename = ''; @@ -33,19 +33,12 @@ class ReaderWorker { const decompDirname = utils.randomHexString(30); //download - let estSize = 100000;// - const downdata = await got(url).on('downloadProgress', progress => { - if (progress.transferred > maxDownloadSize) { - errMes = 'file too big'; - d.destroy(); - } - const prog = Math.round(progress.transferred/estSize*100); - if (prog > 100) - estSize *= 1.5; - wState.set({progress: (prog > 100 ? 100 : prog) }); + const downdata = await this.down.load(url, (progress) => { + wState.set({progress}); }); + downloadedFilename = `${this.config.tempDownloadDir}/${tempFilename}`; - await fs.writeFile(downloadedFilename, downdata.body); + await fs.writeFile(downloadedFilename, downdata); wState.set({progress: 100}); //decompress