Sfoglia il codice sorgente

Переход на WebSocket, поправки багов

Book Pauk 2 anni fa
parent
commit
29bf80108d
4 ha cambiato i file con 57 aggiunte e 90 eliminazioni
  1. 4 16
      client/api/misc.js
  2. 22 66
      client/api/reader.js
  3. 18 0
      server/controllers/WebSocketController.js
  4. 13 8
      server/routes.js

+ 4 - 16
client/api/misc.js

@@ -1,10 +1,5 @@
-import axios from 'axios';
 import wsc from './webSocketConnection';
 
-const api = axios.create({
-  baseURL: '/api'
-});
-
 class Misc {
     async loadConfig() {
 
@@ -12,18 +7,11 @@ class Misc {
             'name', 'version', 'mode', 'maxUploadFileSize', 'useExternalBookConverter', 'acceptFileExt', 'bucEnabled', 'branch',
         ]};
 
-        try {
-            const config = await wsc.message(await wsc.send(Object.assign({action: 'get-config'}, query)));
-            if (config.error)
-                throw new Error(config.error);
-            return config;
-        } catch (e) {
-            console.error(e);
-        }
+        const config = await wsc.message(await wsc.send(Object.assign({action: 'get-config'}, query)));
+        if (config.error)
+            throw new Error(config.error);
 
-        //если с WebSocket проблема, работаем по http
-        const response = await api.post('/config', query);
-        return response.data;
+        return config;
     }
 }
 

+ 22 - 66
client/api/reader.js

@@ -7,9 +7,9 @@ const api = axios.create({
     baseURL: '/api/reader'
 });
 
-const workerApi = axios.create({
+/*const workerApi = axios.create({
     baseURL: '/api/worker'
-});
+});*/
 
 class Reader {
     constructor() {
@@ -19,58 +19,24 @@ class Reader {
         if (!callback) callback = () => {};
 
         let response = {};
-        try {
-            const requestId = await wsc.send({action: 'worker-get-state-finish', workerId});
-
-            let prevResponse = false;
-            while (1) {// eslint-disable-line no-constant-condition
-                response = await wsc.message(requestId);
-
-                if (!response.state && prevResponse !== false) {//экономия траффика
-                    callback(prevResponse);
-                } else {//были изменения worker state
-                    if (!response.state)
-                        throw new Error('Неверный ответ api');
-                    callback(response);
-                    prevResponse = response;
-                }
-
-                if (response.state == 'finish' || response.state == 'error') {
-                    break;
-                }
-            }
-            return response;
-        } catch (e) {
-            console.error(e);
-        }
+        const requestId = await wsc.send({action: 'worker-get-state-finish', workerId});
 
-        //если с WebSocket проблема, работаем по http
-        const refreshPause = 500;
-        let i = 0;
-        response = {};
+        let prevResponse = false;
         while (1) {// eslint-disable-line no-constant-condition
-            const prevProgress = response.progress || 0;
-            const prevState = response.state || 0;
-            response = await workerApi.post('/get-state', {workerId});
-            response = response.data;
-            callback(response);
-
-            if (!response.state)
-                throw new Error('Неверный ответ api');
+            response = await wsc.message(requestId);
+
+            if (!response.state && prevResponse !== false) {//экономия траффика
+                callback(prevResponse);
+            } else {//были изменения worker state
+                if (!response.state)
+                    throw new Error('Неверный ответ api');
+                callback(response);
+                prevResponse = response;
+            }
 
             if (response.state == 'finish' || response.state == 'error') {
                 break;
             }
-
-            if (i > 0)
-                await utils.sleep(refreshPause);
-
-            i++;
-            if (i > 180*1000/refreshPause) {//3 мин ждем телодвижений воркера
-                throw new Error('Слишком долгое время ожидания');
-            }
-            //проверка воркера
-            i = (prevProgress != response.progress || prevState != response.state ? 1 : i);
         }
 
         return response;
@@ -79,14 +45,13 @@ class Reader {
     async loadBook(opts, callback) {
         if (!callback) callback = () => {};
 
-        let response = await api.post('/load-book', opts);
-
-        const workerId = response.data.workerId;
+        let response = await wsc.message(await wsc.send(Object.assign({action: 'load-book'}, opts)));
+        const workerId = response.workerId;
         if (!workerId)
             throw new Error('Неверный ответ api');
 
         callback({totalSteps: 4});
-        callback(response.data);
+        callback(response);
 
         response = await this.getWorkerStateFinish(workerId, callback);
 
@@ -181,22 +146,13 @@ class Reader {
     }
 
     async storage(request) {
-        let response = null;
-        try {
-            response = await wsc.message(await wsc.send({action: 'reader-storage', body: request}));
-        } catch (e) {
-            console.error(e);
-            //если с WebSocket проблема, работаем по http
-            response = await api.post('/storage', request);
-            response = response.data;
-        }
+        const response = await wsc.message(await wsc.send({action: 'reader-storage', body: request}));
 
-        const state = response.state;
-        if (!state)
-            throw new Error('Неверный ответ api');
-        if (state == 'error') {
+        if (response.error)
             throw new Error(response.error);
-        }
+
+        if (!response.state)
+            throw new Error('Неверный ответ api');
 
         return response;
     }

+ 18 - 0
server/controllers/WebSocketController.js

@@ -71,6 +71,8 @@ class WebSocketController {
                     await this.test(req, ws); break;
                 case 'get-config':
                     await this.getConfig(req, ws); break;
+                case 'load-book':
+                    await this.loadBook(req, ws); break;
                 case 'worker-get-state':
                     await this.workerGetState(req, ws); break;
                 case 'worker-get-state-finish':
@@ -124,6 +126,22 @@ class WebSocketController {
         }
     }
 
+    async loadBook(req, ws) {
+        const workerId = this.readerWorker.loadBookUrl({
+            url: req.url, 
+            enableSitesFilter: (_.has(req, 'enableSitesFilter') ? req.enableSitesFilter : true),
+            skipHtmlCheck: (_.has(req, 'skipHtmlCheck') ? req.skipHtmlCheck : false),
+            isText: (_.has(req, 'isText') ? req.isText : false),
+            uploadFileName: (_.has(req, 'uploadFileName') ? req.uploadFileName : false),
+            djvuQuality: (_.has(req, 'djvuQuality') ? req.djvuQuality : false),
+            pdfAsText: (_.has(req, 'pdfAsText') ? req.pdfAsText : false),
+            pdfQuality: (_.has(req, 'pdfQuality') ? req.pdfQuality : false),
+        });
+        const state = this.workerState.getState(workerId);
+
+        this.send((state ? state : {}), req, ws);
+    }
+
     async workerGetState(req, ws) {
         if (!req.workerId)
             throw new Error(`key 'workerId' is wrong`);

+ 13 - 8
server/routes.js

@@ -6,25 +6,30 @@ const multer = require('multer');
 const ReaderWorker = require('./core/Reader/ReaderWorker');//singleton
 const log = new (require('./core/AppLogger'))().log;//singleton
 
-const c = require('./controllers');
+const {
+    ReaderController,
+    WebSocketController,
+    BookUpdateCheckerController,
+} = require('./controllers');
+
 const utils = require('./core/utils');
 
 function initRoutes(app, wss, config) {
     //эксклюзив для update_checker
     if (config.mode === 'book_update_checker') {
-        new c.BookUpdateCheckerController(wss, config);
+        new BookUpdateCheckerController(wss, config);
         return;
     }
 
     initStatic(app, config);
         
-    const reader = new c.ReaderController(config);
-    new c.WebSocketController(wss, config);
+    const reader = new ReaderController(config);
+    new WebSocketController(wss, config);
 
     //multer
     const storage = multer.diskStorage({
         destination: (req, file, cb) => {
-            cb(null, config.uploadDir);
+            cb(null, config.uploadPublicDir);
         },
         filename: (req, file, cb) => {
             cb(null, utils.randomHexString(30));
@@ -40,7 +45,7 @@ function initRoutes(app, wss, config) {
     //to app
     for (let route of routes) {
         let callbacks = [];
-        let [httpMethod, path, controllers] = route;
+        let [httpMethod, actionPath, controllers] = route;
         let controller = controllers;
         if (Array.isArray(controllers)) {
             controller = controllers[controllers.length - 1];
@@ -61,10 +66,10 @@ function initRoutes(app, wss, config) {
 
         switch (httpMethod) {
             case 'GET' :
-                app.get(path, ...callbacks);
+                app.get(actionPath, ...callbacks);
                 break;
             case 'POST':
-                app.post(path, ...callbacks);
+                app.post(actionPath, ...callbacks);
                 break;
             default: 
                 throw new Error(`initRoutes error: unknown httpMethod: ${httpMethod}`);