diff --git a/client/components/Reader/versionHistory.js b/client/components/Reader/versionHistory.js
index 02038499..55941153 100644
--- a/client/components/Reader/versionHistory.js
+++ b/client/components/Reader/versionHistory.js
@@ -1,4 +1,15 @@
export const versionHistory = [
+{
+ showUntil: '2020-11-11',
+ header: '0.9.7 (2020-11-12)',
+ content:
+`
+
+`
+},
+
{
showUntil: '2020-11-05',
header: '0.9.6 (2020-11-06)',
diff --git a/client/share/utils.js b/client/share/utils.js
index 0dd69976..add984a8 100644
--- a/client/share/utils.js
+++ b/client/share/utils.js
@@ -103,30 +103,57 @@ export function fromBase64(data) {
));
}
-export function getObjDiff(oldObj, newObj) {
- const result = {__isDiff: true, change: {}, add: {}, del: []};
+export function getObjDiff(oldObj, newObj, opts = {}) {
+ const {
+ exclude = [],
+ excludeAdd = [],
+ excludeDel = [],
+ } = opts;
- for (const key of Object.keys(oldObj)) {
- if (newObj.hasOwnProperty(key)) {
- if (!_.isEqual(oldObj[key], newObj[key])) {
- if (_.isObject(oldObj[key]) && _.isObject(newObj[key])) {
- result.change[key] = getObjDiff(oldObj[key], newObj[key]);
- } else {
- result.change[key] = _.cloneDeep(newObj[key]);
+ const ex = new Set(exclude);
+ const exAdd = new Set(excludeAdd);
+ const exDel = new Set(excludeDel);
+
+ const makeObjDiff = (oldObj, newObj, keyPath) => {
+ const result = {__isDiff: true, change: {}, add: {}, del: []};
+
+ keyPath = `${keyPath}${keyPath ? '/' : ''}`;
+
+ for (const key of Object.keys(oldObj)) {
+ const kp = `${keyPath}${key}`;
+
+ if (newObj.hasOwnProperty(key)) {
+ if (ex.has(kp))
+ continue;
+
+ if (!_.isEqual(oldObj[key], newObj[key])) {
+ if (_.isObject(oldObj[key]) && _.isObject(newObj[key])) {
+ result.change[key] = makeObjDiff(oldObj[key], newObj[key], kp);
+ } else {
+ result.change[key] = _.cloneDeep(newObj[key]);
+ }
}
+ } else {
+ if (exDel.has(kp))
+ continue;
+ result.del.push(key);
}
- } else {
- result.del.push(key);
}
+
+ for (const key of Object.keys(newObj)) {
+ const kp = `${keyPath}${key}`;
+ if (exAdd.has(kp))
+ continue;
+
+ if (!oldObj.hasOwnProperty(key)) {
+ result.add[key] = _.cloneDeep(newObj[key]);
+ }
+ }
+
+ return result;
}
- for (const key of Object.keys(newObj)) {
- if (!oldObj.hasOwnProperty(key)) {
- result.add[key] = _.cloneDeep(newObj[key]);
- }
- }
-
- return result;
+ return makeObjDiff(oldObj, newObj, '');
}
export function isObjDiff(diff) {
diff --git a/client/store/modules/reader.js b/client/store/modules/reader.js
index 12ec4d67..cf7cd0c4 100644
--- a/client/store/modules/reader.js
+++ b/client/store/modules/reader.js
@@ -268,9 +268,12 @@ for (const button of toolButtons)
for (const hotKey of hotKeys)
settingDefaults.userHotKeys[hotKey.name] = hotKey.codes;
+const excludeDiffHotKeys = [];
+for (const hotKey of hotKeys)
+ excludeDiffHotKeys.push(`userHotKeys/${hotKey.name}`);
+
function addDefaultsToSettings(settings) {
- const diff = utils.getObjDiff(settings, settingDefaults);
-
+ const diff = utils.getObjDiff(settings, settingDefaults, {exclude: excludeDiffHotKeys});
if (!utils.isEmptyObjDiffDeep(diff, {isApplyChange: false})) {
return utils.applyObjDiff(settings, diff, {isApplyChange: false});
}
diff --git a/package-lock.json b/package-lock.json
index 2390c0d2..1d1d0700 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "Liberama",
- "version": "0.9.6",
+ "version": "0.9.7",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index ebbfb5b2..cbce616e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "Liberama",
- "version": "0.9.6",
+ "version": "0.9.7",
"author": "Book Pauk ",
"license": "CC0-1.0",
"repository": "bookpauk/liberama",
diff --git a/server/config/base.js b/server/config/base.js
index f7506800..8211cad4 100644
--- a/server/config/base.js
+++ b/server/config/base.js
@@ -18,7 +18,7 @@ module.exports = {
loggingEnabled: true,
maxUploadFileSize: 50*1024*1024,//50Мб
- maxTempPublicDirSize: 512*1024*1024,//512Мб
+ maxTempPublicDirSize: 512*1024*1024,//512Мб + 20% квота если проблема с remoteWebDavStorage
maxUploadPublicDirSize: 200*1024*1024,//100Мб
useExternalBookConverter: false,
diff --git a/server/core/Reader/ReaderWorker.js b/server/core/Reader/ReaderWorker.js
index 32f77807..3e76f8aa 100644
--- a/server/core/Reader/ReaderWorker.js
+++ b/server/core/Reader/ReaderWorker.js
@@ -266,30 +266,38 @@ class ReaderWorker {
files.push({name, stat});
}
}
- log(`clean dir ${dir}, maxSize=${maxSize}, found ${files.length} files`);
+ log(`clean dir ${dir}, maxSize=${maxSize}, found ${files.length} files, total size=${size}`);
files.sort((a, b) => a.stat.mtimeMs - b.stat.mtimeMs);
let i = 0;
+ let j = 0;
while (i < files.length && size > maxSize) {
const file = files[i];
const oldFile = `${dir}/${file.name}`;
+ let remoteSuccess = true;
//отправляем только this.config.tempPublicDir
- //TODO: убрать в будущем, т.к. уже делается ленивое сохранение compFilename в удаленном хранилище
if (this.remoteWebDavStorage && dir === this.config.tempPublicDir) {
+ remoteSuccess = false;
try {
//log(`remoteWebDavStorage.putFile ${path.basename(oldFile)}`);
await this.remoteWebDavStorage.putFile(oldFile);
+ remoteSuccess = true;
} catch (e) {
log(LM_ERR, e.stack);
}
}
- await fs.remove(oldFile);
+ //реально удаляем только если сохранили в хранилище
+ if (remoteSuccess || size > maxSize*1.2) {
+ await fs.remove(oldFile);
+ j++;
+ }
+
size -= file.stat.size;
i++;
}
- log(`removed ${i} files`);
+ log(`removed ${j} files`);
} catch(e) {
log(LM_ERR, e.stack);
} finally {