commit: 15124319735f3bf0cb384edb95a0060f902ccc63
parent da94c94fbe95a183476fd2b71efc45c95e945b9c
Author: Henry Jameson <me@hjkos.com>
Date: Thu, 24 Nov 2022 22:31:38 +0200
fix leaky journal by running uniq on addToCollection entries
Diffstat:
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/src/modules/serverSideStorage.js b/src/modules/serverSideStorage.js
@@ -1,5 +1,5 @@
import { toRaw } from 'vue'
-import { isEqual, cloneDeep, set, get, clamp, flatten, groupBy, findLastIndex, takeRight } from 'lodash'
+import { isEqual, cloneDeep, set, get, clamp, flatten, groupBy, findLastIndex, takeRight, uniqWith } from 'lodash'
import { CURRENT_UPDATE_COUNTER } from 'src/components/update_notification/update_notification.js'
export const VERSION = 1
@@ -149,12 +149,21 @@ const _mergeJournal = (...journals) => {
if (path.startsWith('collections')) {
const lastRemoveIndex = findLastIndex(journal, ({ operation }) => operation === 'removeFromCollection')
// everything before last remove is unimportant
+ let remainder
if (lastRemoveIndex > 0) {
- return journal.slice(lastRemoveIndex)
+ remainder = journal.slice(lastRemoveIndex)
} else {
// everything else doesn't need trimming
- return journal
+ remainder = journal
}
+ return uniqWith(remainder, (a, b) => {
+ if (a.path !== b.path) { return false }
+ if (a.operation !== b.operation) { return false }
+ if (a.operation === 'addToCollection') {
+ return a.args[0] === b.args[0]
+ }
+ return false
+ })
} else if (path.startsWith('simple')) {
// Only the last record is important
return takeRight(journal)
diff --git a/test/unit/specs/modules/serverSideStorage.spec.js b/test/unit/specs/modules/serverSideStorage.spec.js
@@ -148,6 +148,18 @@ describe('The serverSideStorage module', () => {
timestamp: state.prefsStorage._journal[1].timestamp
})
})
+
+ it('should remove duplicate entries from journal', () => {
+ const state = cloneDeep(defaultState)
+ setPreference(state, { path: 'simple.testing', value: 1 })
+ setPreference(state, { path: 'simple.testing', value: 1 })
+ addCollectionPreference(state, { path: 'collections.testing', value: 2 })
+ addCollectionPreference(state, { path: 'collections.testing', value: 2 })
+ updateCache(state, { username: 'test' })
+ expect(state.prefsStorage.simple.testing).to.eql(1)
+ expect(state.prefsStorage.collections.testing).to.eql([2])
+ expect(state.prefsStorage._journal.length).to.eql(2)
+ })
})
})