diff --git a/lib/Onyx.js b/lib/Onyx.js index eb3124fb8..a2f14c299 100644 --- a/lib/Onyx.js +++ b/lib/Onyx.js @@ -1216,6 +1216,14 @@ function update(data) { return clearPromise.then(() => Promise.all(_.map(promises, p => p()))); } +/** + * When set these keys will not be persisted to storage + * @param {string[]} keyList + */ +function setMemoryOnlyKeys(keyList) { + Storage.setMemoryOnlyKeys(keyList); +} + /** * Initialize the store with actions and listening for storage events * @@ -1304,6 +1312,7 @@ const Onyx = { removeFromEvictionBlockList, isSafeEvictionKey, METHOD, + setMemoryOnlyKeys, }; /** diff --git a/lib/storage/providers/LocalForage.js b/lib/storage/providers/LocalForage.js index 338d1abe9..677208df3 100644 --- a/lib/storage/providers/LocalForage.js +++ b/lib/storage/providers/LocalForage.js @@ -8,6 +8,7 @@ import localforage from 'localforage'; import _ from 'underscore'; import {extendPrototype} from 'localforage-removeitems'; import SyncQueue from '../../SyncQueue'; +import * as Str from '../../Str'; import fastMerge from '../../fastMerge'; extendPrototype(localforage); @@ -16,6 +17,11 @@ localforage.config({ name: 'OnyxDB', }); +/** + * Keys that will not ever be persisted to disk. + */ +let memoryOnlyKeys = []; + const provider = { /** * Writing very quickly to IndexedDB causes performance issues and can lock up the page and lead to jank. @@ -23,6 +29,10 @@ const provider = { * to the next. */ setItemQueue: new SyncQueue(({key, value, shouldMerge}) => { + if (_.find(memoryOnlyKeys, noCacheKey => Str.startsWith(key, noCacheKey))) { + return Promise.resolve(); + } + if (shouldMerge) { return localforage.getItem(key) .then((existingValue) => { @@ -125,6 +135,13 @@ const provider = { setItem(key, value) { return this.setItemQueue.push({key, value}); }, + + /** + * @param {string[]} keyList + */ + setMemoryOnlyKeys(keyList) { + memoryOnlyKeys = keyList; + }, }; export default provider; diff --git a/lib/storage/providers/SQLiteStorage.js b/lib/storage/providers/SQLiteStorage.js index 2fd865fa2..c19016360 100644 --- a/lib/storage/providers/SQLiteStorage.js +++ b/lib/storage/providers/SQLiteStorage.js @@ -128,6 +128,11 @@ const provider = { * @returns {Promise} */ clear: () => db.executeAsync('DELETE FROM keyvaluepairs;', []), + + /** + * Noop on mobile for now. + */ + setMemoryOnlyKeys: () => {}, }; export default provider;