diff --git a/.eslintrc b/.eslintrc index 2025d7b5..73eb5287 100644 --- a/.eslintrc +++ b/.eslintrc @@ -31,6 +31,7 @@ "vue/max-attributes-per-line": "off", "vue/html-self-closing": "off", "vue/no-v-html": "off", + "vue/no-v-model-argument": "off", "strict": 0, "indent": [0, 4, { diff --git a/build/webpack.base.config.js b/build/webpack.base.config.js index 747c506f..570f9193 100644 --- a/build/webpack.base.config.js +++ b/build/webpack.base.config.js @@ -5,11 +5,12 @@ const { VueLoaderPlugin } = require('vue-loader'); const clientDir = path.resolve(__dirname, '../client'); module.exports = { - /*resolve: { + resolve: { alias: { - vue: '@vue/compat' + ws: false, + //vue: '@vue/compat' } - },*/ + }, entry: [`${clientDir}/main.js`], output: { publicPath: '/app/', diff --git a/client/api/reader.js b/client/api/reader.js index d3995597..742a9792 100644 --- a/client/api/reader.js +++ b/client/api/reader.js @@ -219,7 +219,7 @@ class Reader { const state = response.state; if (!state) throw new Error('Неверный ответ api'); - if (response.state == 'error') { + if (state == 'error') { throw new Error(response.error); } diff --git a/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue b/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue index fb24cc86..b41d3fc6 100644 --- a/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue +++ b/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue @@ -55,16 +55,16 @@
- +
-
+
diff --git a/client/components/Reader/HelpPage/VersionHistoryPage/VersionHistoryPage.vue b/client/components/Reader/HelpPage/VersionHistoryPage/VersionHistoryPage.vue index 95df0a40..7fd4876f 100644 --- a/client/components/Reader/HelpPage/VersionHistoryPage/VersionHistoryPage.vue +++ b/client/components/Reader/HelpPage/VersionHistoryPage/VersionHistoryPage.vue @@ -33,14 +33,15 @@ class VersionHistoryPage { mounted() { let vh = []; - for (const version of versionHistory) { - vh.push(version.header); + for (const v of versionHistory) { + vh.push(`${v.version} (${v.releaseDate})`); } this.versionHeader = vh; let vc = []; - for (const version of versionHistory) { - vc.push({key: version.header, content: 'Версия ' + version.header + version.content}); + for (const v of versionHistory) { + let header = `${v.version} (${v.releaseDate})`; + vc.push({key: header, content: 'Версия ' + header + v.content}); } this.versionContent = vc; } diff --git a/client/components/Reader/LoaderPage/LoaderPage.vue b/client/components/Reader/LoaderPage/LoaderPage.vue index 7dcdb15a..831722e9 100644 --- a/client/components/Reader/LoaderPage/LoaderPage.vue +++ b/client/components/Reader/LoaderPage/LoaderPage.vue @@ -114,9 +114,7 @@ class LoaderPage { } get clientVersion() { - let v = versionHistory[0].header; - v = v.split(' ')[0]; - return v; + return versionHistory[0].version; } submitUrl() { diff --git a/client/components/Reader/Reader.vue b/client/components/Reader/Reader.vue index e6ea41cc..6fbe1c22 100644 --- a/client/components/Reader/Reader.vue +++ b/client/components/Reader/Reader.vue @@ -525,9 +525,7 @@ class Reader { } get clientVersion() { - let v = versionHistory[0].header; - v = v.split(' ')[0]; - return v; + return versionHistory[0].version; } get routeParamUrl() { diff --git a/client/components/Reader/ReaderDialogs/ReaderDialogs.vue b/client/components/Reader/ReaderDialogs/ReaderDialogs.vue index 13f84d2d..52f64320 100644 --- a/client/components/Reader/ReaderDialogs/ReaderDialogs.vue +++ b/client/components/Reader/ReaderDialogs/ReaderDialogs.vue @@ -5,12 +5,17 @@ Что нового: -
+
+
+
- Посмотреть историю версий - - Больше не показывать - + Посмотреть историю версий + + @@ -55,11 +60,13 @@
- + @@ -112,9 +119,9 @@ class ReaderDialogs { const whatsNew = versionHistory[0]; if (this.showWhatsNewDialog && whatsNew.showUntil >= utils.formatDate(new Date(), 'coDate') && - whatsNew.header != this.whatsNewContentHash) { + this.whatsNewHeader != this.whatsNewContentHash) { await utils.sleep(2000); - this.whatsNewContent = 'Версия ' + whatsNew.header + whatsNew.content; + this.whatsNewContent = 'Версия ' + this.whatsNewHeader + whatsNew.content; this.whatsNewVisible = true; } } @@ -160,8 +167,11 @@ class ReaderDialogs { whatsNewDisable() { this.whatsNewVisible = false; - const whatsNew = versionHistory[0]; - this.commit('reader/setWhatsNewContentHash', whatsNew.header); + this.commit('reader/setWhatsNewContentHash', this.whatsNewHeader); + } + + get whatsNewHeader() { + return `${versionHistory[0].version} (${versionHistory[0].releaseDate})`; } get mode() { diff --git a/client/components/Reader/SettingsPage/OthersTab.inc b/client/components/Reader/SettingsPage/OthersTab.inc index 6dd91fd5..9d5964d5 100644 --- a/client/components/Reader/SettingsPage/OthersTab.inc +++ b/client/components/Reader/SettingsPage/OthersTab.inc @@ -52,7 +52,7 @@ -
+
Другое
diff --git a/client/components/Reader/versionHistory.js b/client/components/Reader/versionHistory.js index 9a6ba551..8960de53 100644 --- a/client/components/Reader/versionHistory.js +++ b/client/components/Reader/versionHistory.js @@ -1,73 +1,99 @@ export const versionHistory = [ { + version: '0.11.3', + releaseDate: '2022-03-29', + showUntil: '2022-03-28', + content: +` + + +` +}, + +{ + version: '0.11.2', + releaseDate: '2022-01-11', showUntil: '2022-01-10', - header: '0.11.2 (2022-01-11)', content: ` + ` }, { + version: '0.11.1', + releaseDate: '2021-12-03', showUntil: '2021-12-02', - header: '0.11.1 (2021-12-03)', content: ` + ` }, { + version: '0.11.0', + releaseDate: '2021-11-18', showUntil: '2021-11-17', - header: '0.11.0 (2021-11-18)', content: ` + ` }, { + version: '0.10.3', + releaseDate: '2021-10-24', showUntil: '2021-10-23', - header: '0.10.3 (2021-10-24)', content: ` + ` }, { + version: '0.10.2', + releaseDate: '2021-10-19', showUntil: '2021-10-18', - header: '0.10.2 (2021-10-19)', content: ` + ` }, { + version: '0.10.1', + releaseDate: '2021-10-10', showUntil: '2021-10-09', - header: '0.10.1 (2021-10-10)', content: ` + ` }, { + version: '0.10.0', + releaseDate: '2021-02-09', showUntil: '2021-02-16', - header: '0.10.0 (2021-02-09)', content: ` + ` }, { + version: '0.9.12', + releaseDate: '2020-12-18', showUntil: '2020-12-17', - header: '0.9.12 (2020-12-18)', content: ` + ` }, { + version: '0.9.11', + releaseDate: '2020-12-09', showUntil: '2020-12-08', - header: '0.9.11 (2020-12-09)', content: ` + ` }, { + version: '0.9.10', + releaseDate: '2020-12-03', showUntil: '2020-12-10', - header: '0.9.10 (2020-12-03)', content: ` + ` }, { + version: '0.9.9', + releaseDate: '2020-11-21', showUntil: '2020-11-20', - header: '0.9.9 (2020-11-21)', content: ` + ` }, { + version: '0.9.8', + releaseDate: '2020-11-13', showUntil: '2020-11-12', - header: '0.9.8 (2020-11-13)', content: ` + ` }, { + version: '0.9.7', + releaseDate: '2020-11-12', showUntil: '2020-11-11', - header: '0.9.7 (2020-11-12)', content: ` + ` }, { + version: '0.9.6', + releaseDate: '2020-11-06', showUntil: '2020-11-05', - header: '0.9.6 (2020-11-06)', content: ` + ` }, { + version: '0.9.5', + releaseDate: '2020-11-01', showUntil: '2020-10-31', - header: '0.9.5 (2020-11-01)', content: ` + ` }, { + version: '0.9.4', + releaseDate: '2020-10-29', showUntil: '2020-10-28', - header: '0.9.4 (2020-10-29)', content: ` + ` }, { + version: '0.9.3', + releaseDate: '2020-05-21', showUntil: '2020-05-20', - header: '0.9.3 (2020-05-21)', content: ` + ` }, { + version: '0.9.2', + releaseDate: '2020-03-15', showUntil: '2020-04-25', - header: '0.9.2 (2020-03-15)', content: ` + ` }, { + version: '0.9.1', + releaseDate: '2020-03-03', showUntil: '2020-03-02', - header: '0.9.1 (2020-03-03)', content: ` + ` }, { + version: '0.9.0', + releaseDate: '2020-02-26', showUntil: '2020-02-25', - header: '0.9.0 (2020-02-26)', content: ` + ` }, { + version: '0.8.4', + releaseDate: '2020-02-06', showUntil: '2020-02-05', - header: '0.8.4 (2020-02-06)', content: ` + ` }, { + version: '0.8.3', + releaseDate: '2020-01-28', showUntil: '2020-01-27', - header: '0.8.3 (2020-01-28)', content: ` + ` }, { + version: '0.8.2', + releaseDate: '2020-01-20', showUntil: '2020-01-19', - header: '0.8.2 (2020-01-20)', content: ` + ` }, { + version: '0.8.1', + releaseDate: '2020-01-07', showUntil: '2020-01-06', - header: '0.8.1 (2020-01-07)', content: ` + ` }, { + version: '0.8.0', + releaseDate: '2020-01-02', showUntil: '2020-01-05', - header: '0.8.0 (2020-01-02)', content: ` + ` }, { + version: '0.7.9', + releaseDate: '2019-11-27', showUntil: '2019-11-26', - header: '0.7.9 (2019-11-27)', content: ` + ` }, { + version: '0.7.8', + releaseDate: '2019-11-25', showUntil: '2019-11-24', - header: '0.7.8 (2019-11-25)', content: ` + ` }, { + version: '0.7.7', + releaseDate: '2019-11-06', showUntil: '2019-11-10', - header: '0.7.7 (2019-11-06)', content: ` + ` }, { + version: '0.7.6', + releaseDate: '2019-10-30', showUntil: '2019-10-29', - header: '0.7.6 (2019-10-30)', content: ` + ` }, { + version: '0.7.5', + releaseDate: '2019-10-22', showUntil: '2019-10-21', - header: '0.7.5 (2019-10-22)', content: ` + ` }, { + version: '0.7.3', + releaseDate: '2019-10-18', showUntil: '2019-10-17', - header: '0.7.3 (2019-10-18)', content: ` + ` }, { + version: '0.7.1', + releaseDate: '2019-09-20', showUntil: '2019-09-19', - header: '0.7.1 (2019-09-20)', content: ` + ` }, { + version: '0.7.0', + releaseDate: '2019-09-07', showUntil: '2019-10-01', - header: '0.7.0 (2019-09-07)', content: ` + ` }, { + version: '0.6.10', + releaseDate: '2019-07-21', showUntil: '2019-07-20', - header: '0.6.10 (2019-07-21)', content: ` + ` }, { + version: '0.6.9', + releaseDate: '2019-06-23', showUntil: '2019-06-22', - header: '0.6.9 (2019-06-23)', content: ` + ` }, { + version: '0.6.7', + releaseDate: '2019-05-30', showUntil: '2019-06-05', - header: '0.6.7 (2019-05-30)', content: ` + ` }, { + version: '0.6.6', + releaseDate: '2019-03-29', showUntil: '2019-03-29', - header: '0.6.6 (2019-03-29)', content: ` + ` }, { + version: '0.6.4', + releaseDate: '2019-03-24', showUntil: '2019-03-24', - header: '0.6.4 (2019-03-24)', content: ` + ` }, { + version: '0.5.4', + releaseDate: '2019-03-04', showUntil: '2019-03-04', - header: '0.5.4 (2019-03-04)', content: ` + ` }, { + version: '0.3.0', + releaseDate: '2019-02-17', showUntil: '2019-02-17', - header: '0.3.0 (2019-02-17)', content: ` + ` }, { + version: '0.1.7', + releaseDate: '2019-02-14', showUntil: '2019-02-14', - header: '0.1.7 (2019-02-14)', content: ` + ` }, { + version: '0.1.0', + releaseDate: '2019-02-12', showUntil: '2019-02-12', - header: '0.1.0 (2019-02-12)', content: ` + ` }, diff --git a/package-lock.json b/package-lock.json index 7865b34a..13c1ce3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "Liberama", - "version": "0.11.1", + "version": "0.11.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "Liberama", - "version": "0.11.1", + "version": "0.11.2", "hasInstallScript": true, "license": "CC0-1.0", "dependencies": { @@ -22,7 +22,7 @@ "got": "^11.8.2", "he": "^1.2.0", "iconv-lite": "^0.6.3", - "jembadb": "^1.3.0", + "jembadb": "^2.3.0", "localforage": "^1.10.0", "lodash": "^4.17.21", "minimist": "^1.2.5", @@ -6379,9 +6379,9 @@ } }, "node_modules/jembadb": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jembadb/-/jembadb-1.3.0.tgz", - "integrity": "sha512-zMJ1GyXmqvniWToaZTzc3JPHK+SfvcynFHYsZAx8bJWlgVdQd6cqYpIEXJFP+3OZqxPTzMYG5OBGclxTsoOqtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/jembadb/-/jembadb-2.3.0.tgz", + "integrity": "sha512-Jrvbe+4a3ULZvYmM6VnIK6mGFegPELbAppSYTTvPUeMmndNVOAVr1RDHKEiV8ccLanv1xWnJYiCo1mdnepR/Cg==", "engines": { "node": ">=14.4.0" } @@ -16229,9 +16229,9 @@ } }, "jembadb": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jembadb/-/jembadb-1.3.0.tgz", - "integrity": "sha512-zMJ1GyXmqvniWToaZTzc3JPHK+SfvcynFHYsZAx8bJWlgVdQd6cqYpIEXJFP+3OZqxPTzMYG5OBGclxTsoOqtg==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/jembadb/-/jembadb-2.3.0.tgz", + "integrity": "sha512-Jrvbe+4a3ULZvYmM6VnIK6mGFegPELbAppSYTTvPUeMmndNVOAVr1RDHKEiV8ccLanv1xWnJYiCo1mdnepR/Cg==" }, "jest-worker": { "version": "27.3.1", diff --git a/package.json b/package.json index dd35260f..dcfffac9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Liberama", - "version": "0.11.2", + "version": "0.11.3", "author": "Book Pauk ", "license": "CC0-1.0", "repository": "bookpauk/liberama", @@ -60,7 +60,7 @@ "got": "^11.8.2", "he": "^1.2.0", "iconv-lite": "^0.6.3", - "jembadb": "^1.3.0", + "jembadb": "^2.3.0", "localforage": "^1.10.0", "lodash": "^4.17.21", "minimist": "^1.2.5", diff --git a/server/controllers/WebSocketController.js b/server/controllers/WebSocketController.js index 1ef46135..229dbcf0 100644 --- a/server/controllers/WebSocketController.js +++ b/server/controllers/WebSocketController.js @@ -55,8 +55,7 @@ class WebSocketController { ws.lastActivity = Date.now(); //pong for WebSocketConnection - if (req._rpo === 1) - this.send({_rok: 1}, req, ws); + this.send({_rok: 1}, req, ws); switch (req.action) { case 'test': diff --git a/server/core/AsyncExit.js b/server/core/AsyncExit.js index 10921f1b..59272504 100644 --- a/server/core/AsyncExit.js +++ b/server/core/AsyncExit.js @@ -1,27 +1,26 @@ let instance = null; const defaultTimeout = 15*1000;//15 sec -const exitSignals = ['SIGINT', 'SIGTERM', 'SIGBREAK', 'SIGHUP', 'uncaughtException', 'SIGUSR2']; +const exitSignals = ['SIGINT', 'SIGTERM', 'SIGBREAK', 'SIGHUP', 'uncaughtException']; //singleton class AsyncExit { - constructor() { + constructor(signals = exitSignals, codeOnSignal = 2) { if (!instance) { this.onSignalCallbacks = new Map(); this.callbacks = new Map(); this.afterCallbacks = new Map(); this.exitTimeout = defaultTimeout; - this.inited = false; + + this._init(signals, codeOnSignal); + instance = this; } return instance; } - init(signals = exitSignals, codeOnSignal = 2) { - if (this.inited) - throw new Error('AsyncExit: initialized already'); - + _init(signals, codeOnSignal) { const runSingalCallbacks = async(signal) => { for (const signalCallback of this.onSignalCallbacks.keys()) { try { @@ -38,8 +37,6 @@ class AsyncExit { this.exit(codeOnSignal); }); } - - this.inited = true; } onSignal(signalCallback) { diff --git a/server/core/WebSocketConnection.js b/server/core/WebSocketConnection.js index d33d95f0..3045659e 100644 --- a/server/core/WebSocketConnection.js +++ b/server/core/WebSocketConnection.js @@ -9,8 +9,7 @@ const cleanPeriod = 5*1000;//5 секунд class WebSocketConnection { //messageLifeTime в секундах (проверка каждый cleanPeriod интервал) constructor(url, openTimeoutSecs = 10, messageLifeTimeSecs = 30) { - //const ws = 'ws';//for nodejs - this.WebSocket = (isBrowser ? WebSocket : null/*for nodejs require(ws)*/); + this.WebSocket = (isBrowser ? WebSocket : require('ws')); this.url = url; this.ws = null; this.listeners = []; @@ -166,7 +165,7 @@ class WebSocketConnection { this.requestId = (this.requestId < 1000000 ? this.requestId + 1 : 1); const requestId = this.requestId;//реентерабельность!!! - this.ws.send(JSON.stringify(Object.assign({requestId, _rpo: 1}, req)));//_rpo: 1 - ждем в ответ _rok: 1 + this.ws.send(JSON.stringify(Object.assign({requestId}, req))); let resp = {}; try { diff --git a/server/db/JembaConnManager.js b/server/db/JembaConnManager.js index d91e3d44..27193f31 100644 --- a/server/db/JembaConnManager.js +++ b/server/db/JembaConnManager.js @@ -14,6 +14,7 @@ class JembaConnManager { constructor() { if (!instance) { this.inited = false; + this._db = {}; instance = this; } @@ -28,6 +29,8 @@ class JembaConnManager { this.config = config; this._db = {}; + ayncExit.add(this.close.bind(this)); + for (const dbConfig of this.config.jembaDb) { const dbPath = `${this.config.dataDir}/db/${dbConfig.dbName}`; @@ -44,17 +47,23 @@ class JembaConnManager { } else { dbConn = new JembaDb(); } + this._db[dbConfig.dbName] = dbConn; log(`Open "${dbConfig.dbName}" begin`); - await dbConn.openDb({ + await dbConn.lock({ dbPath, create: true, - cacheSize: dbConfig.cacheSize, - compressed: dbConfig.compressed, - forceFileClosing: dbConfig.forceFileClosing + softLock: true, + + tableDefaults: { + cacheSize: dbConfig.cacheSize, + compressed: dbConfig.compressed, + forceFileClosing: dbConfig.forceFileClosing, + typeCompatMode: true, + }, }); - if (dbConfig.openAll) { + if (dbConfig.openAll || forceAutoRepair || dbConfig.autoRepair) { try { await dbConn.openAll(); } catch(e) { @@ -83,21 +92,15 @@ class JembaConnManager { if (applied.length) log(`${applied.length} migrations applied to "${dbConfig.dbName}"`); } - - this._db[dbConfig.dbName] = dbConn; } - ayncExit.add(this.close.bind(this)); - this.inited = true; } async close() { - if (!this.inited) - return; - for (const dbConfig of this.config.jembaDb) { - await this._db[dbConfig.dbName].closeDb(); + if (this._db[dbConfig.dbName]) + await this._db[dbConfig.dbName].unlock(); } this._db = {}; diff --git a/server/index.js b/server/index.js index 884c147f..633f0f84 100644 --- a/server/index.js +++ b/server/index.js @@ -8,7 +8,6 @@ const http = require('http'); const WebSocket = require ('ws'); const ayncExit = new (require('./core/AsyncExit'))(); -ayncExit.init(); let log = null;