From 5c173eedb270bb9b93001c19a49dc0fff7710b72 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Fri, 11 Jan 2019 23:24:10 +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/ReaderWorker.js | 40 +++++++++---------------------------- server/core/readerLoader.js | 32 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 31 deletions(-) create mode 100644 server/core/readerLoader.js diff --git a/server/core/ReaderWorker.js b/server/core/ReaderWorker.js index d0baa496..a641ae49 100644 --- a/server/core/ReaderWorker.js +++ b/server/core/ReaderWorker.js @@ -1,40 +1,18 @@ const workerState = require('./workerState'); -const utils = require('./utils'); - const fs = require('fs-extra'); -const util = require('util'); -const stream = require('stream'); -const pipeline = util.promisify(stream.pipeline); -const download = require('download'); class ReaderWorker { constructor(config) { - this.config = config; - this.tempDownloadDir = `${config.tempDir}/download`; - fs.ensureDirSync(this.tempDownloadDir); + this.config = Object.assign({}, config); + this.config.tempDownloadDir = `${config.tempDir}/download`; + fs.ensureDirSync(this.config.tempDownloadDir); } - async loadBook(wState, url) { - const maxDownloadSize = 10*1024*1024; - let errMes = ''; - try { - wState.set({state: 'download', step: 1, totalSteps: 3, url}); - - const tempFilename = utils.randomHexString(30); - const d = download(url); - d.on('downloadProgress', progress => { - wState.set({progress: Math.round(progress.percent*100)}); - if (progress.transferred > maxDownloadSize) { - errMes = 'file too big'; - d.destroy(); - } - }); - await pipeline(d, fs.createWriteStream(`${this.tempDownloadDir}/${tempFilename}`)); - - wState.finish({step: 3, file: tempFilename}); - } catch (e) { - wState.set({state: 'error', error: (errMes ? errMes : e.message)}); - } + async loadBook(url, wState) { + const loader = require('./readerLoader'); + loader(url, this.config, (state) => { + wState.set(state) + }); } loadBookUrl(url) { @@ -42,7 +20,7 @@ class ReaderWorker { const wState = workerState.getControl(workerId); wState.set({state: 'start'}); - this.loadBook(wState, url); + this.loadBook(url, wState); return workerId; } diff --git a/server/core/readerLoader.js b/server/core/readerLoader.js new file mode 100644 index 00000000..31b85c69 --- /dev/null +++ b/server/core/readerLoader.js @@ -0,0 +1,32 @@ +const utils = require('./utils'); + +const fs = require('fs-extra'); +const util = require('util'); +const stream = require('stream'); +const pipeline = util.promisify(stream.pipeline); +const download = require('download'); + +async function main(url, config, setState) { + const maxDownloadSize = 10*1024*1024; + let errMes = ''; + try { + setState({state: 'download', step: 1, totalSteps: 3, url}); + + const tempFilename = utils.randomHexString(30); + const d = download(url); + d.on('downloadProgress', progress => { + setState({progress: Math.round(progress.percent*100)}); + if (progress.transferred > maxDownloadSize) { + errMes = 'file too big'; + d.destroy(); + } + }); + await pipeline(d, fs.createWriteStream(`${config.tempDownloadDir}/${tempFilename}`)); + + setState({state: 'finish', step: 3, file: tempFilename}); + } catch (e) { + setState({state: 'error', error: (errMes ? errMes : e.message)}); + } +} + +module.exports = main; \ No newline at end of file