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