From ae744fb80f7c891ca9b5eab16f898e0c89b71028 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Tue, 5 Feb 2019 15:53:30 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B8=D0=BE=D0=B4=D0=B8=D1=87=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D1=83=D1=8E=20=D1=87=D0=B8=D1=81=D1=82=D0=BA=D1=83=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/core/ReaderWorker.js | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/server/core/ReaderWorker.js b/server/core/ReaderWorker.js index dc2b8d47..797783f1 100644 --- a/server/core/ReaderWorker.js +++ b/server/core/ReaderWorker.js @@ -8,6 +8,10 @@ const FileDecompressor = require('./FileDecompressor'); const BookConverter = require('./BookConverter'); const utils = require('./utils'); +const maxTempPublicDirSize = 512*1024*1024;//512Мб +const maxUploadDirSize = 100*1024*1024;//100Мб +let singleCleanExecute = false; + class ReaderWorker { constructor(config) { this.config = Object.assign({}, config); @@ -21,6 +25,12 @@ class ReaderWorker { this.down = new FileDownloader(); this.decomp = new FileDecompressor(); this.bookConverter = new BookConverter(); + + if (!singleCleanExecute) { + this.periodicCleanDir(this.config.tempPublicDir, maxTempPublicDirSize, 60*60*1000);//1 раз в час + this.periodicCleanDir(this.config.uploadDir, maxUploadDirSize, 60*60*1000);//1 раз в час + singleCleanExecute = true; + } } async loadBook(url, wState) { @@ -113,6 +123,34 @@ class ReaderWorker { return `file://${hash}`; } + + async periodicCleanDir(dir, maxSize, timeout) { + const list = await fs.readdir(dir); + + let size = 0; + let files = []; + for (const name of list) { + const stat = await fs.stat(`${dir}/${name}`); + if (!stat.isDirectory()) { + size += stat.size; + files.push({name, stat}); + } + } + + files.sort((a, b) => a.stat.mtimeMs - b.stat.mtimeMs); + + let i = 0; + while (i < files.length && size > maxSize) { + const file = files[i]; + await fs.remove(`${dir}/${file.name}`); + size -= file.stat.size; + i++; + } + + setTimeout(() => { + this.periodicCleanDir(dir, maxSize, timeout); + }, timeout); + } } module.exports = ReaderWorker; \ No newline at end of file