Explorar el Código

Начало работы над BookUpdateChecker

Book Pauk hace 3 años
padre
commit
5ccfe71c55

+ 1 - 1
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',
         },

+ 95 - 0
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;

+ 1 - 0
server/controllers/index.js

@@ -3,4 +3,5 @@ module.exports = {
     ReaderController: require('./ReaderController'),
     WorkerController: require('./WorkerController'),
     WebSocketController: require('./WebSocketController'),
+    BookUpdateCheckerController: require('./BookUpdateCheckerController'),
 }

+ 0 - 0
server/core/BookUpdateChecker/BUCClient.js


+ 24 - 0
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;

+ 16 - 0
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'
+        }],
+    ]
+};

+ 6 - 0
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')}
+    ]
+}

+ 1 - 1
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'),
 };

+ 6 - 0
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);