Selaa lähdekoodia

WebSocket: добавлен метод reader-storage, поправки багов

Book Pauk 5 vuotta sitten
vanhempi
commit
17670aabf9

+ 12 - 3
client/api/reader.js

@@ -195,13 +195,22 @@ class Reader {
     }
 
     async storage(request) {
-        let response = await api.post('/storage', request);
+        let response = null;
+        try {
+            await wsc.open();
+            response = await wsc.message(wsc.send({action: 'reader-storage', body: request}));
+        } catch (e) {
+            console.error(e);
+            //если с WebSocket проблема, работаем по http
+            response = await api.post('/storage', request);
+            response = response.data;
+        }
 
-        const state = response.data.state;
+        const state = response.state;
         if (!state)
             throw new Error('Неверный ответ api');
 
-        return response.data;
+        return response;
     }
 }
 

+ 5 - 1
client/api/webSocketConnection.js

@@ -111,7 +111,11 @@ class WebSocketConnection {
                 requestId,
                 timeout,
                 onMessage: (mes) => {
-                    resolve(mes);
+                    if (mes.error) {
+                        reject(mes.error);
+                    } else {
+                        resolve(mes);
+                    }
                 },
                 onError: (e) => {
                     reject(e);

+ 35 - 8
server/controllers/WebSocketController.js

@@ -4,6 +4,7 @@ const _ = require('lodash');
 const ReaderWorker = require('../core/Reader/ReaderWorker');//singleton
 const ReaderStorage = require('../core/Reader/ReaderStorage');//singleton
 const WorkerState = require('../core/WorkerState');//singleton
+const log = new (require('../core/AppLogger'))().log;//singleton
 const utils = require('../core/utils');
 
 const cleanPeriod = 1*60*1000;//1 минута
@@ -12,6 +13,8 @@ const closeSocketOnIdle = 5*60*1000;//5 минут
 class WebSocketController {
     constructor(wss, config) {
         this.config = config;
+        this.isDevelopment = (config.branch == 'development');
+
         this.readerStorage = new ReaderStorage();
         this.readerWorker = new ReaderWorker(config);
         this.workerState = new WorkerState();
@@ -43,19 +46,25 @@ class WebSocketController {
     async onMessage(ws, message) {
         let req = {};
         try {
+            if (this.isDevelopment) {
+                log(`WebSocket-IN:  ${message.substr(0, 4000)}`);
+            }
+
             ws.lastActivity = Date.now();
             req = JSON.parse(message);
             switch (req.action) {
                 case 'test':
-                    this.test(req, ws); break;
+                    await this.test(req, ws); break;
                 case 'get-config':
-                    this.getConfig(req, ws); break;
+                    await this.getConfig(req, ws); break;
                 case 'worker-get-state':
-                    this.workerGetState(req, ws); break;
+                    await this.workerGetState(req, ws); break;
                 case 'worker-get-state-finish':
-                    this.workerGetStateFinish(req, ws); break;
+                    await this.workerGetStateFinish(req, ws); break;
                 case 'reader-restore-cached-file':
-                    this.readerRestoreCachedFile(req, ws); break;
+                    await this.readerRestoreCachedFile(req, ws); break;
+                case 'reader-storage':
+                    await this.readerStorageDo(req, ws); break;
 
                 default:
                     throw new Error(`Action not found: ${req.action}`);
@@ -68,10 +77,17 @@ class WebSocketController {
     send(res, req, ws) {
         if (ws.readyState == WebSocket.OPEN) {
             ws.lastActivity = Date.now();
-            let r = Object.assign({}, res);
+            let r = res;
             if (req.requestId)
-                r.requestId = req.requestId;
-            ws.send(JSON.stringify(r));
+                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)}`);
+            }
+
         }
     }
 
@@ -132,6 +148,17 @@ class WebSocketController {
         const state = this.workerState.getState(workerId);
         this.send((state ? state : {}), req, ws);
     }
+
+    async readerStorageDo(req, ws) {
+        if (!req.body) 
+            throw new Error(`key 'body' is empty`);
+        if (!req.body.action) 
+            throw new Error(`key 'action' is empty`);
+        if (!req.body.items || Array.isArray(req.body.data)) 
+            throw new Error(`key 'items' is empty`);
+
+        this.send(await this.readerStorage.doAction(req.body), req, ws);
+    }
 }
 
 module.exports = WebSocketController;