diff --git a/client/api/misc.js b/client/api/misc.js index 141fd3cf..e3c4b3fb 100644 --- a/client/api/misc.js +++ b/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; } } diff --git a/client/api/reader.js b/client/api/reader.js index 1cf1339e..0beb0e07 100644 --- a/client/api/reader.js +++ b/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}); + 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); - } - - //если с 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); + response = await wsc.message(requestId); - if (!response.state) - throw new Error('Неверный ответ api'); + 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; } diff --git a/server/controllers/WebSocketController.js b/server/controllers/WebSocketController.js index 43593e4b..c17aa98d 100644 --- a/server/controllers/WebSocketController.js +++ b/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`); diff --git a/server/routes.js b/server/routes.js index e0ea4dde..a294b66f 100644 --- a/server/routes.js +++ b/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}`);