diff --git a/server/controllers/ReaderController.js b/server/controllers/ReaderController.js index 1fd19366..c388bf8c 100644 --- a/server/controllers/ReaderController.js +++ b/server/controllers/ReaderController.js @@ -1,12 +1,13 @@ const BaseController = require('./BaseController'); const ReaderWorker = require('../core/ReaderWorker'); const readerStorage = require('../core/readerStorage'); -const workerState = require('../core/workerState'); +const WorkerState = require('../core/WorkerState');//singleton class ReaderController extends BaseController { constructor(config) { super(config); this.readerWorker = new ReaderWorker(config); + this.workerState = new WorkerState(); } async loadBook(req, res) { @@ -19,7 +20,7 @@ class ReaderController extends BaseController { url: request.url, enableSitesFilter: (request.hasOwnProperty('enableSitesFilter') ? request.enableSitesFilter : true) }); - const state = workerState.getState(workerId); + const state = this.workerState.getState(workerId); return (state ? state : {}); } catch (e) { error = e.message; diff --git a/server/controllers/WorkerController.js b/server/controllers/WorkerController.js index 3437077f..69bd4982 100644 --- a/server/controllers/WorkerController.js +++ b/server/controllers/WorkerController.js @@ -1,7 +1,12 @@ const BaseController = require('./BaseController'); -const workerState = require('../core/workerState'); +const WorkerState = require('../core/WorkerState');//singleton class WorkerController extends BaseController { + constructor(config) { + super(config); + this.workerState = new WorkerState(); + } + async getState(req, res) { const request = req.body; let error = ''; @@ -9,7 +14,7 @@ class WorkerController extends BaseController { if (!request.workerId) throw new Error(`key 'workerId' is wrong`); - const state = workerState.getState(request.workerId); + const state = this.workerState.getState(request.workerId); return (state ? state : {}); } catch (e) { error = e.message; diff --git a/server/core/ReaderWorker.js b/server/core/ReaderWorker.js index 1707692a..00a86392 100644 --- a/server/core/ReaderWorker.js +++ b/server/core/ReaderWorker.js @@ -1,7 +1,7 @@ const fs = require('fs-extra'); const path = require('path'); -const workerState = require('./workerState'); +const WorkerState = require('./WorkerState');//singleton const FileDownloader = require('./FileDownloader'); const FileDecompressor = require('./FileDecompressor'); const BookConverter = require('./BookConverter'); @@ -20,6 +20,7 @@ class ReaderWorker { this.config.tempPublicDir = `${config.publicDir}/tmp`; fs.ensureDirSync(this.config.tempPublicDir); + this.workerState = new WorkerState(); this.down = new FileDownloader(); this.decomp = new FileDecompressor(); this.bookConverter = new BookConverter(this.config); @@ -106,8 +107,8 @@ class ReaderWorker { } loadBookUrl(opts) { - const workerId = workerState.generateWorkerId(); - const wState = workerState.getControl(workerId); + const workerId = this.workerState.generateWorkerId(); + const wState = this.workerState.getControl(workerId); wState.set({state: 'start'}); this.loadBook(opts, wState); diff --git a/server/core/workerState.js b/server/core/WorkerState.js similarity index 85% rename from server/core/workerState.js rename to server/core/WorkerState.js index b9526d27..a4c0c1b0 100644 --- a/server/core/workerState.js +++ b/server/core/WorkerState.js @@ -3,10 +3,18 @@ const utils = require('./utils'); const cleanInterval = 3600; //sec const cleanAfterLastModified = cleanInterval - 60; //sec +let instance = null; + +//singleton class WorkerState { constructor() { - this.states = {}; - setTimeout(this.cleanStates.bind(this), cleanInterval*1000); + if (!instance) { + this.states = {}; + this.cleanStates(); + instance = this; + } + + return instance; } generateWorkerId() { @@ -51,6 +59,4 @@ class WorkerState { } } -const workerState = new WorkerState(); - -module.exports = workerState; \ No newline at end of file +module.exports = WorkerState; \ No newline at end of file