diff --git a/server/config/base.js b/server/config/base.js index 0624d269..86457c11 100644 --- a/server/config/base.js +++ b/server/config/base.js @@ -49,7 +49,7 @@ module.exports = { servers: [ { serverName: '1', - mode: 'normal', //'none', 'normal', 'site', 'reader', 'omnireader', 'liberama.top' + mode: 'normal', //'none', 'normal', 'site', 'reader', 'omnireader', 'liberama.top', 'book_update_checker' ip: '0.0.0.0', port: '33080', }, diff --git a/server/controllers/BookUpdateCheckerController.js b/server/controllers/BookUpdateCheckerController.js new file mode 100644 index 00000000..a87dc36c --- /dev/null +++ b/server/controllers/BookUpdateCheckerController.js @@ -0,0 +1,95 @@ +const WebSocket = require ('ws'); +//const _ = require('lodash'); + +const log = new (require('../core/AppLogger'))().log;//singleton +//const utils = require('../core/utils'); + +const cleanPeriod = 1*60*1000;//1 минута +const closeSocketOnIdle = 5*60*1000;//5 минут + +class BookUpdateCheckerController { + constructor(wss, config) { + this.config = config; + this.isDevelopment = (config.branch == 'development'); + + //this.readerStorage = new JembaReaderStorage(); + + this.wss = wss; + + wss.on('connection', (ws) => { + ws.on('message', (message) => { + this.onMessage(ws, message.toString()); + }); + + ws.on('error', (err) => { + log(LM_ERR, err); + }); + }); + + setTimeout(() => { this.periodicClean(); }, cleanPeriod); + } + + periodicClean() { + try { + const now = Date.now(); + this.wss.clients.forEach((ws) => { + if (!ws.lastActivity || now - ws.lastActivity > closeSocketOnIdle - 50) { + ws.terminate(); + } + }); + } finally { + setTimeout(() => { this.periodicClean(); }, cleanPeriod); + } + } + + async onMessage(ws, message) { + let req = {}; + try { + if (this.isDevelopment) { + log(`WebSocket-IN: ${message.substr(0, 4000)}`); + } + + req = JSON.parse(message); + + ws.lastActivity = Date.now(); + + //pong for WebSocketConnection + this.send({_rok: 1}, req, ws); + + switch (req.action) { + case 'test': + await this.test(req, ws); break; + + default: + throw new Error(`Action not found: ${req.action}`); + } + } catch (e) { + this.send({error: e.message}, req, ws); + } + } + + send(res, req, ws) { + if (ws.readyState == WebSocket.OPEN) { + ws.lastActivity = Date.now(); + let r = res; + if (req.requestId) + r = Object.assign({requestId: req.requestId}, r); + + const message = JSON.stringify(r); + ws.send(message); + + if (this.isDevelopment) { + log(`WebSocket-OUT: ${message.substr(0, 4000)}`); + } + + } + } + + //Actions ------------------------------------------------------------------ + async test(req, ws) { + this.send({message: 'Liberama project is awesome'}, req, ws); + } + +} + +module.exports = BookUpdateCheckerController; diff --git a/server/controllers/index.js b/server/controllers/index.js index 9c2f4f07..1c2bfc76 100644 --- a/server/controllers/index.js +++ b/server/controllers/index.js @@ -3,4 +3,5 @@ module.exports = { ReaderController: require('./ReaderController'), WorkerController: require('./WorkerController'), WebSocketController: require('./WebSocketController'), + BookUpdateCheckerController: require('./BookUpdateCheckerController'), } \ No newline at end of file diff --git a/server/core/BookUpdateChecker/BUCClient.js b/server/core/BookUpdateChecker/BUCClient.js new file mode 100644 index 00000000..e69de29b diff --git a/server/core/BookUpdateChecker/BUCServer.js b/server/core/BookUpdateChecker/BUCServer.js new file mode 100644 index 00000000..098968bd --- /dev/null +++ b/server/core/BookUpdateChecker/BUCServer.js @@ -0,0 +1,24 @@ +let instance = null; + +//singleton +class BUCServer { + constructor(config) { + if (!instance) { + this.config = Object.assign({}, config); + + this.config.tempDownloadDir = `${config.tempDir}/download`; + fs.ensureDirSync(this.config.tempDownloadDir); + + this.down = new FileDownloader(config.maxUploadFileSize); + + instance = this; + } + + return instance; + } + + async main() { + } +} + +module.exports = BUCServer; \ No newline at end of file diff --git a/server/db/jembaMigrations/book-update-server/001-create.js b/server/db/jembaMigrations/book-update-server/001-create.js new file mode 100644 index 00000000..cd911f00 --- /dev/null +++ b/server/db/jembaMigrations/book-update-server/001-create.js @@ -0,0 +1,16 @@ +module.exports = { + up: [ + ['create', { + table: 'checked', + index: [ + {field: 'queryTime', type: 'number'}, + {field: 'checkTime', type: 'number'}, + ] + }], + ], + down: [ + ['drop', { + table: 'checked' + }], + ] +}; diff --git a/server/db/jembaMigrations/book-update-server/index.js b/server/db/jembaMigrations/book-update-server/index.js new file mode 100644 index 00000000..85941af0 --- /dev/null +++ b/server/db/jembaMigrations/book-update-server/index.js @@ -0,0 +1,6 @@ +module.exports = { + table: 'migration1', + data: [ + {id: 1, name: 'create', data: require('./001-create')} + ] +} \ No newline at end of file diff --git a/server/db/jembaMigrations/index.js b/server/db/jembaMigrations/index.js index 4769618c..21cd2dcd 100644 --- a/server/db/jembaMigrations/index.js +++ b/server/db/jembaMigrations/index.js @@ -1,4 +1,4 @@ module.exports = { - //'app': require('./jembaMigrations/app'), 'reader-storage': require('./reader-storage'), + 'book-update-server': require('./book-update-server'), }; diff --git a/server/routes.js b/server/routes.js index c87b59c3..cd204ae8 100644 --- a/server/routes.js +++ b/server/routes.js @@ -3,6 +3,12 @@ const utils = require('./core/utils'); const multer = require('multer'); function initRoutes(app, wss, config) { + //эксклюзив для update_checker + if (config.mode === 'book_update_checker') { + new c.BookUpdateCheckerController(wss, config); + return; + } + const misc = new c.MiscController(config); const reader = new c.ReaderController(config); const worker = new c.WorkerController(config);