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/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:
`
- - переход на JembaDb вместо SQLite
+ - исправления багов
+
`
},
{
+ version: '0.11.1',
+ releaseDate: '2021-12-03',
showUntil: '2021-12-02',
- header: '0.11.1 (2021-12-03)',
content:
`
- переход на JembaDb вместо SQLite
+
`
},
{
+ 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:
`
@@ -76,12 +102,14 @@ export const versionHistory = [
- в настройки добавлена возможность загрузки пользовательских обоев (пока без синхронизации)
- немного улучшен парсинг fb2
+
`
},
{
+ version: '0.9.12',
+ releaseDate: '2020-12-18',
showUntil: '2020-12-17',
- header: '0.9.12 (2020-12-18)',
content:
`
@@ -90,23 +118,27 @@ export const versionHistory = [
- добавлена кнопка для быстрого доступа к настройкам конвертирования
- улучшения работы конвертеров
+
`
},
{
+ 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:
`
@@ -114,69 +146,81 @@ export const versionHistory = [
- добавлена поддержка Rar-архивов
- исправления багов
+
`
},
{
+ 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:
`
@@ -184,23 +228,27 @@ export const versionHistory = [
- для liberama.top добавлено новое окно: "Библиотека"
- исправления багов
+
`
},
{
+ 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:
`
@@ -208,119 +256,139 @@ export const versionHistory = [
- переход на Service Worker вместо AppCache для автономного режима работы
- исправления багов
+
`
},
{
+ 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:
`
- переход на UI-фреймфорк Quasar
- незначительные изменения интерфейса
+
`
},
{
+ version: '0.8.4',
+ releaseDate: '2020-02-06',
showUntil: '2020-02-05',
- header: '0.8.4 (2020-02-06)',
content:
`
- добавлен paypal-адрес для пожертвований
- исправления багов
+
`
},
{
+ 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:
`
- добавлена частичная поддержка формата FB3
- исправлен баг "Request path contains unescaped characters"
+
`
},
{
+ 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:
`
- добавлен неубираемый баннер для http-версии о переходе на httpS
- исправления багов
+
`
},
{
+ version: '0.7.8',
+ releaseDate: '2019-11-25',
showUntil: '2019-11-24',
- header: '0.7.8 (2019-11-25)',
content:
`
- улучшение html-фильтров для сайтов
- исправления багов
+
`
},
{
+ version: '0.7.7',
+ releaseDate: '2019-11-06',
showUntil: '2019-11-10',
- header: '0.7.7 (2019-11-06)',
content:
`
@@ -332,34 +400,40 @@ export const versionHistory = [
- от центра влево: уменьшить скорость скроллинга
+
`
},
{
+ 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:
`
@@ -368,12 +442,14 @@ export const versionHistory = [
- добавлен параметр "Включить html-фильтр для сайтов" в раздел "Вид"->"Текст" в настройках
- исправления багов
+
`
},
{
+ version: '0.7.1',
+ releaseDate: '2019-09-20',
showUntil: '2019-09-19',
- header: '0.7.1 (2019-09-20)',
content:
`
@@ -381,12 +457,14 @@ export const versionHistory = [
- на панель управления добавлена кнопка "Автономный режим"
- актуализирована справка
+
`
},
{
+ version: '0.7.0',
+ releaseDate: '2019-09-07',
showUntil: '2019-10-01',
- header: '0.7.0 (2019-09-07)',
content:
`
@@ -397,23 +475,27 @@ export const versionHistory = [
- немного улучшен внешний вид и управление на смартфонах
- добавлен параметр "Компактность" в раздел "Вид"->"Текст" в настройках
+
`
},
{
+ 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:
`
@@ -424,12 +506,14 @@ export const versionHistory = [
- улучшены прогрессбары
- исправления недочетов, небольшие оптимизации
+
`
},
{
+ version: '0.6.7',
+ releaseDate: '2019-05-30',
showUntil: '2019-06-05',
- header: '0.6.7 (2019-05-30)',
content:
`
@@ -442,36 +526,42 @@ export const versionHistory = [
- добавлен GET-параметр вида "/reader?__pp=50.5&url=..." для указания позиции в книге в процентах
- исправления багов и недочетов
+
`
},
{
+ 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:
`
@@ -480,12 +570,14 @@ export const versionHistory = [
- (0.4.2) фильтр для СИ больше не вырезает изображения
- (0.4.0) добавлено отображение картинок в fb2
+
`
},
{
+ version: '0.3.0',
+ releaseDate: '2019-02-17',
showUntil: '2019-02-17',
- header: '0.3.0 (2019-02-17)',
content:
`
@@ -493,12 +585,14 @@ export const versionHistory = [
- улучшено распознавание текста
- изменена верстка страницы - убрано позиционирование каждого слова
+
`
},
{
+ version: '0.1.7',
+ releaseDate: '2019-02-14',
showUntil: '2019-02-14',
- header: '0.1.7 (2019-02-14)',
content:
`
@@ -508,17 +602,20 @@ export const versionHistory = [
- добавлена возможность сброса настроек
- убран автоматический редирект на последнюю загруженную книгу, если не задан url в маршруте
+
`
},
{
+ version: '0.1.0',
+ releaseDate: '2019-02-12',
showUntil: '2019-02-12',
- header: '0.1.0 (2019-02-12)',
content:
`
- первый деплой проекта, длительность разработки - 2 месяца
+
`
},
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;