From c4496f8dc8368d18ab7930e8670db0dc5a950e0c Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Fri, 20 Sep 2019 18:53:21 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reader/ServerStorage/ServerStorage.vue | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/client/components/Reader/ServerStorage/ServerStorage.vue b/client/components/Reader/ServerStorage/ServerStorage.vue index 13e42559..74fb6d3e 100644 --- a/client/components/Reader/ServerStorage/ServerStorage.vue +++ b/client/components/Reader/ServerStorage/ServerStorage.vue @@ -401,7 +401,14 @@ class ServerStorage extends Vue { let newRecent = {}; if (recentDelta && recentDelta.data) { - newRecent = Object.assign(recent.data, recentDelta.data); + if (recentDelta.data.diff) { + newRecent = recent.data; + const key = recentDelta.data.diff.key; + if (newRecent[key]) + newRecent[key] = utils.applyObjDiff(newRecent[key], recentDelta.data.diff); + } else { + newRecent = Object.assign(recent.data, recentDelta.data); + } this.recentDelta = recentDelta.data; } else { newRecent = recent.data; @@ -432,7 +439,6 @@ class ServerStorage extends Vue { const bm = bookManager; //вычисление критерия сохранения целиком - let forceSaveRecent = false; if (!this.sameKeyCount) this.sameKeyCount = 0; if (this.prevItemKey == itemKey) { @@ -441,11 +447,24 @@ class ServerStorage extends Vue { this.sameKeyCount = 0; } - forceSaveRecent = this.sameKeyCount > 5 && (Object.keys(this.recentDelta).length > 1); + const l = Object.keys(this.recentDelta).length - (1*(!!this.recentDelta.diff)); + this.makeDeltaDiff = (l == 1 && this.prevItemKey == itemKey ? this.makeDeltaDiff : false); + const forceSaveRecent = l > 10 || (this.sameKeyCount > 5 && (l > 1)) || (l == 1 && this.sameKeyCount > 10 && !this.makeDeltaDiff); this.sameKeyCount = (!forceSaveRecent ? this.sameKeyCount : 0); this.prevItemKey = itemKey; + //дифф от дельты для уменьшения размера передаваемых данных в частном случае + if (this.makeDeltaDiff) { + this.recentDelta.diff = utils.getObjDiff(this.prevSavedItem, bm.recent[itemKey]); + this.recentDelta.diff.key = itemKey; + delete this.recentDelta[itemKey]; + } else if (this.recentDelta.diff) { + const key = this.recentDelta.diff.key; + this.recentDelta[key] = utils.applyObjDiff(this.prevSavedItem, this.recentDelta.diff); + delete this.recentDelta.diff; + } + this.savingRecent = true; try { if (forceSaveRecent) {//сохраняем recent целиком @@ -467,7 +486,10 @@ class ServerStorage extends Vue { return; } } else if (result.state == 'success') { - this.recentDelta = null; + this.makeDeltaDiff = true; + this.prevSavedItem = _.cloneDeep(bm.recent[itemKey]); + + this.recentDelta = {}; await bm.setRecentRev(bm.recentRev + 1); await bm.setRecentDeltaRev(bm.recentDeltaRev + 1); }