Эталонный работающий вариант ServerStorage без оптимизации, с дебагом

This commit is contained in:
Book Pauk
2019-09-07 12:25:14 +07:00
parent 629d1b0630
commit a8abd5d427
3 changed files with 22 additions and 77 deletions

View File

@@ -512,7 +512,7 @@ class Reader extends Vue {
const oldBook = this.mostRecentBookReactive; const oldBook = this.mostRecentBookReactive;
const newBook = bookManager.mostRecentBook(); const newBook = bookManager.mostRecentBook();
console.log(oldBook.bookPos, newBook.bookPos);
if (oldBook && newBook) { if (oldBook && newBook) {
if (oldBook.key != newBook.key) { if (oldBook.key != newBook.key) {
this.loadingBook = true; this.loadingBook = true;

View File

@@ -54,7 +54,6 @@ class ServerStorage extends Vue {
this.oldProfiles = {}; this.oldProfiles = {};
this.oldSettings = {}; this.oldSettings = {};
this.oldRecent = null;
} }
async init() { async init() {
@@ -346,38 +345,17 @@ class ServerStorage extends Vue {
} }
} }
let recentDiff = null; if (force || revs.items.recentDiff.rev != oldRecentDiffRev || revs.items.recent.rev != oldRecentRev) {
if (force || revs.items.recentDiff.rev != oldRecentDiffRev) {
try {
recentDiff = await this.storageGet({recentDiff: {}});
} catch(e) {
this.error(`Ошибка соединения с сервером: ${e.message}`);
return;
}
if (recentDiff.state == 'success') {
recentDiff = recentDiff.items.recentDiff;
if (recentDiff.rev == 0)
recentDiff.data = {};
await bookManager.setRecentDiffRev(recentDiff.rev);
} else {
this.warning(`Неверный ответ сервера: ${recentDiff.state}`);
recentDiff = null;
}
}
if (force || revs.items.recent.rev != oldRecentRev) {
let recent = null; let recent = null;
try { try {
recent = await this.storageGet({recent: {}}); recent = await this.storageGet({recent: {}, recentDiff: {}});
} catch(e) { } catch(e) {
this.error(`Ошибка соединения с сервером: ${e.message}`); this.error(`Ошибка соединения с сервером: ${e.message}`);
return; return;
} }
if (recent.state == 'success') { if (recent.state == 'success') {
let recentDiff = recent.items.recentDiff;
recent = recent.items.recent; recent = recent.items.recent;
if (recent.rev == 0) if (recent.rev == 0)
@@ -390,17 +368,13 @@ class ServerStorage extends Vue {
newRecent = recent.data; newRecent = recent.data;
} }
this.oldRecent = _.cloneDeep(recent.data);//!!!
await bookManager.setRecent(newRecent); await bookManager.setRecent(newRecent);
await bookManager.setRecentRev(recent.rev); await bookManager.setRecentRev(recent.rev);
await bookManager.setRecentDiffRev(recentDiff.rev);
console.log('loaded');
} else { } else {
this.warning(`Неверный ответ сервера: ${recent.state}`); this.warning(`Неверный ответ сервера: ${recent.state}`);
} }
} else if (revs.items.recent.rev == oldRecentRev && recentDiff && recentDiff.data) {
let i = 0;
while (!bookManager.loaded && i++ < 1000) utils.sleep(100);
const newRecent = utils.applyObjDiff(bookManager.recent, recentDiff.data);
await bookManager.setRecent(newRecent);
} }
if (doNotifySuccess) if (doNotifySuccess)
@@ -413,60 +387,26 @@ class ServerStorage extends Vue {
const bm = bookManager; const bm = bookManager;
//несколько замудреная инициализация oldRecent if (!bookManager.loaded) {
if (!this.oldRecent) { this.warning('Функции сохранения на сервер пока недоступны');
this.oldRecent = _.cloneDeep(bookManager.recent); return;
}
if (bookManager.loaded && !this.oldRecentInited) {
this.oldRecent = _.cloneDeep(bookManager.recent);
this.oldRecentInited = true;
} }
//вычисляем дифф //вычисляем дифф
let diff = null; /*let diff = utils.getObjDiff(this.oldRecent, bm.recent);
if (itemKey) {
//ускорение вычисления диффа
const itemDiff = utils.getObjDiff({[itemKey]: (this.oldRecentInited ? this.oldRecent[itemKey] : {})}, {[itemKey]: bm.recent[itemKey]});
if (this.recentDiff) {
diff = this.recentDiff;
diff.change[itemKey] = itemDiff.change[itemKey];
} else {
diff = itemDiff;
}
} else {
if (this.oldRecentInited) {
diff = utils.getObjDiff(this.oldRecent, bm.recent);
} else
return;
}
if (utils.isEmptyObjDiff(diff)) if (utils.isEmptyObjDiff(diff))
return; return;*/
//вычисление критерия сохранения целиком let forceSaveRecent = true;
let forceSaveRecent = JSON.stringify(diff).length > 1000;
if (!forceSaveRecent && itemKey) {
if (!this.sameKeyCount)
this.sameKeyCount = 0;
if (this.prevItemKey == itemKey)
this.sameKeyCount++;
forceSaveRecent = this.sameKeyCount > 5 && (Object.keys(diff.change).length > 1);
this.sameKeyCount = (!forceSaveRecent ? this.sameKeyCount : 0);
this.prevItemKey = itemKey;
}
//сохранение
this.recentDiff = diff;
this.savingRecent = true; this.savingRecent = true;
try { try {
if (forceSaveRecent) {//сохраняем recent целиком if (forceSaveRecent) {//сохраняем recent целиком
let result = {state: ''}; let result = {state: ''};
try { try {
result = await this.storageSet({recent: {rev: bm.recentRev + 1, data: bm.recent}}); result = await this.storageSet({recent: {rev: bm.recentRev + 1, data: bm.recent}, recentDiff: {rev: bm.recentDiffRev + 1, data: {}}});
} catch(e) { } catch(e) {
this.error(`Ошибка соединения с сервером (${e.message}). Данные не сохранены и могут быть перезаписаны.`); this.error(`Ошибка соединения с сервером (${e.message}). Данные не сохранены и могут быть перезаписаны.`);
} }
@@ -475,9 +415,11 @@ class ServerStorage extends Vue {
await this.loadRecent(true, false); await this.loadRecent(true, false);
this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`); this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`);
} else if (result.state == 'success') { } else if (result.state == 'success') {
this.oldRecent = _.cloneDeep(bm.recent); //this.oldRecent = _.cloneDeep(bm.recent);
this.recentDiff = null; //this.recentDiff = null;
await bm.setRecentRev(bm.recentRev + 1); await bm.setRecentRev(bm.recentRev + 1);
await bm.setRecentDiffRev(bm.recentDiffRev + 1);
console.log('saved');
} }
} else {//сохраняем только дифф } else {//сохраняем только дифф
let result = {state: ''}; let result = {state: ''};
@@ -489,7 +431,7 @@ class ServerStorage extends Vue {
} }
if (result.state == 'reject') { if (result.state == 'reject') {
await this.loadRecent(false, false); await this.loadRecent(true, false);
this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`); this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`);
} else if (result.state == 'success') { } else if (result.state == 'success') {
await bm.setRecentDiffRev(bm.recentDiffRev + 1); await bm.setRecentDiffRev(bm.recentDiffRev + 1);

View File

@@ -30,7 +30,10 @@ class BookManager {
this.recentLast = await bmRecentStore.getItem('recent-last'); this.recentLast = await bmRecentStore.getItem('recent-last');
if (this.recentLast) { if (this.recentLast) {
this.recent[this.recentLast.key] = this.recentLast; this.recent[this.recentLast.key] = this.recentLast;
// let meta = await bmMetaStore.getItem(key); const meta = await bmMetaStore.getItem(`bmMeta-${this.recentLast.key}`);
if (_.isObject(meta)) {
this.books[meta.key] = meta;
}
} }
this.recentRev = await bmRecentStore.getItem('recent-rev') || 0; this.recentRev = await bmRecentStore.getItem('recent-rev') || 0;