From 8c85b7be377f1a24be18ecddecc046dd4b64fb3f Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Mon, 21 Jan 2019 18:09:50 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D0=BB=D0=B0=D0=B4=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=81=D0=B6=D0=B0=D1=82=D0=B8=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=BA=D0=BD=D0=B8=D0=B3=20=D0=B2=20/tmp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/api/reader.js | 3 ++- .../Reader/ProgressPage/ProgressPage.vue | 1 + server/core/FileDecompressor.js | 26 +++++++++++++++++++ server/core/FileDownloader.js | 2 +- server/core/ReaderWorker.js | 15 ++++++++--- server/index.js | 12 ++++++++- 6 files changed, 53 insertions(+), 6 deletions(-) diff --git a/client/api/reader.js b/client/api/reader.js index aae3dcd9..91cb1e98 100644 --- a/client/api/reader.js +++ b/client/api/reader.js @@ -57,8 +57,9 @@ class Reader { async loadCachedBook(url, callback){ const options = { onDownloadProgress: progress => { + const total = (progress.total ? progress.total : progress.loaded + 200000); if (callback) - callback({state: 'loading', progress: Math.round((progress.loaded*100)/progress.total)}); + callback({state: 'loading', progress: Math.round((progress.loaded*100)/total)}); } } //загрузка diff --git a/client/components/Reader/ProgressPage/ProgressPage.vue b/client/components/Reader/ProgressPage/ProgressPage.vue index cae5a345..23b11706 100644 --- a/client/components/Reader/ProgressPage/ProgressPage.vue +++ b/client/components/Reader/ProgressPage/ProgressPage.vue @@ -53,6 +53,7 @@ class ProgressPage extends Vue { this.step = (state.step ? state.step : this.step); this.totalSteps = (state.totalSteps > this.totalSteps ? state.totalSteps : this.totalSteps); this.progress = state.progress || 0; +console.log(state); } get percentage() { diff --git a/server/core/FileDecompressor.js b/server/core/FileDecompressor.js index 4579fa1e..a19e62f1 100644 --- a/server/core/FileDecompressor.js +++ b/server/core/FileDecompressor.js @@ -1,3 +1,6 @@ +const fs = require('fs-extra'); +const zlib = require('zlib'); +const crypto = require('crypto'); const decompress = require('decompress'); const FileDetector = require('./FileDetector'); @@ -28,6 +31,29 @@ class FileDecompressor { return result; } + + async gzipBuffer(buf) { + return new Promise((resolve, reject) => { + zlib.gzip(buf, {level: 1}, (err, result) => { + if (err) reject(err); + resolve(result); + }); + }); + } + + async gzipFileIfNotExists(filename, outDir) { + const buf = await fs.readFile(filename); + + const hash = crypto.createHash('sha256').update(buf).digest('hex'); + + const outFilename = `${outDir}/${hash}`; + + if (!await fs.pathExists(outFilename)) { + await fs.writeFile(outFilename, await this.gzipBuffer(buf)) + } + + return outFilename; + } } module.exports = FileDecompressor; \ No newline at end of file diff --git a/server/core/FileDownloader.js b/server/core/FileDownloader.js index 2965afbd..5e2a24cc 100644 --- a/server/core/FileDownloader.js +++ b/server/core/FileDownloader.js @@ -26,7 +26,7 @@ class FileDownloader { if (estSize) prog = Math.round(progress.transferred/estSize*100); else if (progress.transferred) - prog = Math.round(progress.transferred/(progress.transferred + 100000)*100); + prog = Math.round(progress.transferred/(progress.transferred + 200000)*100); if (prog != prevProg && callback) callback(prog); diff --git a/server/core/ReaderWorker.js b/server/core/ReaderWorker.js index 50dc2269..ffccbe43 100644 --- a/server/core/ReaderWorker.js +++ b/server/core/ReaderWorker.js @@ -1,4 +1,5 @@ const fs = require('fs-extra'); +const path = require('path'); const workerState = require('./workerState'); const FileDownloader = require('./FileDownloader'); @@ -25,6 +26,7 @@ class ReaderWorker { let errMes = ''; let decompDir = ''; let downloadedFilename = ''; + let convertFilename = ''; try { wState.set({state: 'download', step: 1, totalSteps: 3, url}); @@ -49,14 +51,19 @@ class ReaderWorker { //parse book wState.set({state: 'convert', step: 3, progress: 0}); - let resultFilename = `${this.config.tempPublicDir}/${tempFilename2}`; - await this.bookConverter.convertToFb2(decompFilename, resultFilename, url, progress => { + convertFilename = `${this.config.tempDownloadDir}/${tempFilename2}`; + await this.bookConverter.convertToFb2(decompFilename, convertFilename, url, progress => { wState.set({progress}); }); + + //compress file to tmp dir, if not exists with the same hashname + const compFilename = await this.decomp.gzipFileIfNotExists(convertFilename, `${this.config.tempPublicDir}`); + wState.set({progress: 100}); //finish - wState.finish({path: `/tmp/${tempFilename2}`}); + const finishFilename = path.basename(compFilename); + wState.finish({path: `/tmp/${finishFilename}`}); } catch (e) { wState.set({state: 'error', error: (errMes ? errMes : e.message)}); @@ -67,6 +74,8 @@ class ReaderWorker { await fs.remove(decompDir); if (downloadedFilename) await fs.remove(downloadedFilename); + if (convertFilename) + await fs.remove(convertFilename); } } diff --git a/server/index.js b/server/index.js index a6505a38..4e655661 100644 --- a/server/index.js +++ b/server/index.js @@ -5,6 +5,7 @@ initLogger(config); const log = getLog(); const fs = require('fs-extra'); +const path = require('path'); const express = require('express'); const compression = require('compression'); @@ -42,7 +43,16 @@ async function main() { app.use(express.json()); if (devModule) devModule.logQueries(app); - app.use(express.static(serverConfig.publicDir, { maxAge: '30d' })); + + app.use(express.static(serverConfig.publicDir, { + maxAge: '30d', + setHeaders: (res, filePath) => { + if (path.basename(path.dirname(filePath)) == 'tmp') { + res.set('Content-Type', 'text/xml'); + res.set('Content-Encoding', 'gzip'); + } + } + })); require('./routes').initRoutes(app, connPool, serverConfig);