From 11f6897dc217b8b0787e185502585b8d2ddf0804 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Tue, 5 Nov 2019 16:46:14 -0600 Subject: [PATCH 1/4] Reuse StorageController for LDS Let me know if changes are needed. Some of the promises could be written better. --- integration/test/ParseLocalDatastoreTest.js | 3 +- src/CoreManager.js | 2 + src/LocalDatastore.js | 6 +- src/LocalDatastoreController.default.js | 55 -------------- ...browser.js => LocalDatastoreController.js} | 38 +++++----- src/LocalDatastoreController.react-native.js | 6 +- src/LocalDatastoreController.weapp.js | 73 ------------------ src/Storage.js | 18 +++++ src/StorageController.browser.js | 8 ++ src/StorageController.default.js | 4 + src/StorageController.react-native.js | 2 +- src/StorageController.weapp.js | 5 ++ src/__tests__/CoreManager-test.js | 9 ++- src/__tests__/LocalDatastore-test.js | 75 +++---------------- src/__tests__/Storage-test.js | 4 +- 15 files changed, 81 insertions(+), 227 deletions(-) delete mode 100644 src/LocalDatastoreController.default.js rename src/{LocalDatastoreController.browser.js => LocalDatastoreController.js} (64%) delete mode 100644 src/LocalDatastoreController.weapp.js diff --git a/integration/test/ParseLocalDatastoreTest.js b/integration/test/ParseLocalDatastoreTest.js index b01b86a87..c7f115e92 100644 --- a/integration/test/ParseLocalDatastoreTest.js +++ b/integration/test/ParseLocalDatastoreTest.js @@ -2697,8 +2697,7 @@ describe('Parse LocalDatastore', () => { }); const controllers = [ - { name: 'Default', file: '../../lib/node/LocalDatastoreController.default' }, - { name: 'Browser', file: '../../lib/node/LocalDatastoreController.browser' }, + { name: 'Default', file: '../../lib/node/LocalDatastoreController' }, { name: 'React-Native', file: '../../lib/node/LocalDatastoreController.react-native' }, ]; diff --git a/src/CoreManager.js b/src/CoreManager.js index cf3ca5dd0..dc45d4314 100644 --- a/src/CoreManager.js +++ b/src/CoreManager.js @@ -338,12 +338,14 @@ module.exports = { 'getItemAsync', 'setItemAsync', 'removeItemAsync', + 'getAllKeysAsync' ], controller); } else { requireMethods('A synchronous StorageController', [ 'getItem', 'setItem', 'removeItem', + 'getAllKeys' ], controller); } config['StorageController'] = controller; diff --git a/src/LocalDatastore.js b/src/LocalDatastore.js index 7b1c4a8f9..6e6423708 100644 --- a/src/LocalDatastore.js +++ b/src/LocalDatastore.js @@ -406,11 +406,7 @@ module.exports = LocalDatastore; if (process.env.PARSE_BUILD === 'react-native') { CoreManager.setLocalDatastoreController(require('./LocalDatastoreController.react-native')); -} else if (process.env.PARSE_BUILD === 'browser') { - CoreManager.setLocalDatastoreController(require('./LocalDatastoreController.browser')); -} else if (process.env.PARSE_BUILD === 'weapp') { - CoreManager.setLocalDatastoreController(require('./LocalDatastoreController.weapp')); } else { - CoreManager.setLocalDatastoreController(require('./LocalDatastoreController.default')); + CoreManager.setLocalDatastoreController(require('./LocalDatastoreController')); } CoreManager.setLocalDatastore(LocalDatastore); diff --git a/src/LocalDatastoreController.default.js b/src/LocalDatastoreController.default.js deleted file mode 100644 index 524472169..000000000 --- a/src/LocalDatastoreController.default.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow - */ -import { isLocalDatastoreKey } from './LocalDatastoreUtils'; - -const memMap = {}; -const LocalDatastoreController = { - fromPinWithName(name: string): Array { - if (!memMap.hasOwnProperty(name)) { - return []; - } - const objects = JSON.parse(memMap[name]); - return objects; - }, - - pinWithName(name: string, value: any) { - const values = JSON.stringify(value); - memMap[name] = values; - }, - - unPinWithName(name: string) { - delete memMap[name]; - }, - - getAllContents() { - const LDS = {}; - for (const key in memMap) { - if (memMap.hasOwnProperty(key) && isLocalDatastoreKey(key)) { - LDS[key] = JSON.parse(memMap[key]); - } - } - return LDS; - }, - - getRawStorage() { - return memMap; - }, - - clear() { - for (const key in memMap) { - if (memMap.hasOwnProperty(key) && isLocalDatastoreKey(key)) { - delete memMap[key]; - } - } - } -}; - -module.exports = LocalDatastoreController; diff --git a/src/LocalDatastoreController.browser.js b/src/LocalDatastoreController.js similarity index 64% rename from src/LocalDatastoreController.browser.js rename to src/LocalDatastoreController.js index dacb77ad9..470730b9a 100644 --- a/src/LocalDatastoreController.browser.js +++ b/src/LocalDatastoreController.js @@ -8,13 +8,12 @@ * * @flow */ - -/* global localStorage */ import { isLocalDatastoreKey } from './LocalDatastoreUtils'; +import Storage from './Storage'; const LocalDatastoreController = { - fromPinWithName(name: string): Array { - const values = localStorage.getItem(name); + async fromPinWithName(name: string): Array { + const values = await Storage.getItemAsync(name); if (!values) { return []; } @@ -22,10 +21,10 @@ const LocalDatastoreController = { return objects; }, - pinWithName(name: string, value: any) { + async pinWithName(name: string, value: any) { try { const values = JSON.stringify(value); - localStorage.setItem(name, values); + await Storage.setItemAsync(name, values); } catch (e) { // Quota exceeded, possibly due to Safari Private Browsing mode console.log(e.message); @@ -33,15 +32,16 @@ const LocalDatastoreController = { }, unPinWithName(name: string) { - localStorage.removeItem(name); + return Storage.removeItemAsync(name); }, - getAllContents(): Object { + async getAllContents(): Object { + const keys = await Storage.getAllKeysAsync(); const LDS = {}; - for (let i = 0; i < localStorage.length; i += 1) { - const key = localStorage.key(i); + + for(const key of keys){ if (isLocalDatastoreKey(key)) { - const value = localStorage.getItem(key); + const value = await Storage.getItemAsync(key); try { LDS[key] = JSON.parse(value); } catch (error) { @@ -52,20 +52,22 @@ const LocalDatastoreController = { return LDS; }, - getRawStorage(): Object { + async getRawStorage(): Object { + const keys = await Storage.getAllKeysAsync(); const storage = {}; - for (let i = 0; i < localStorage.length; i += 1) { - const key = localStorage.key(i); - const value = localStorage.getItem(key); + + for(const key of keys){ + const value = await Storage.getItemAsync(key); storage[key] = value; } return storage; }, - clear(): Promise { + async clear(): Promise { + const keys = await Storage.getAllKeysAsync(); + const toRemove = []; - for (let i = 0; i < localStorage.length; i += 1) { - const key = localStorage.key(i); + for(const key of keys){ if (isLocalDatastoreKey(key)) { toRemove.push(key); } diff --git a/src/LocalDatastoreController.react-native.js b/src/LocalDatastoreController.react-native.js index 1b348b352..3d17b5993 100644 --- a/src/LocalDatastoreController.react-native.js +++ b/src/LocalDatastoreController.react-native.js @@ -37,7 +37,7 @@ const LocalDatastoreController = { }, async getAllContents(): Promise { - const keys = await RNStorage.getAllKeys(); + const keys = await RNStorage.getAllKeysAsync(); const batch = []; for (let i = 0; i < keys.length; i += 1) { const key = keys[i]; @@ -65,7 +65,7 @@ const LocalDatastoreController = { }, async getRawStorage(): Promise { - const keys = await RNStorage.getAllKeys(); + const keys = await RNStorage.getAllKeysAsync(); const storage = {}; const results = await RNStorage.multiGet(keys); results.map((pair) => { @@ -76,7 +76,7 @@ const LocalDatastoreController = { }, async clear(): Promise { - const keys = await RNStorage.getAllKeys(); + const keys = await RNStorage.getAllKeysAsync(); const batch = []; for (let i = 0; i < keys.length; i += 1) { const key = keys[i]; diff --git a/src/LocalDatastoreController.weapp.js b/src/LocalDatastoreController.weapp.js deleted file mode 100644 index 4fe1d40a7..000000000 --- a/src/LocalDatastoreController.weapp.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow - */ -import { isLocalDatastoreKey } from './LocalDatastoreUtils'; - -const LocalDatastoreController = { - fromPinWithName(name: string): Array { - const values = wx.getStorageSync(name); - if (!values) { - return []; - } - return values; - }, - - pinWithName(name: string, value: any) { - try { - wx.setStorageSync(name, value); - } catch (e) { - // Quota exceeded - } - }, - - unPinWithName(name: string) { - wx.removeStorageSync(name); - }, - - getAllContents(): Object { - const res = wx.getStorageInfoSync(); - const keys = res.keys; - - const LDS = {}; - for(const key of keys){ - if (isLocalDatastoreKey(key)) { - LDS[key] = wx.getStorageSync(key); - } - } - return LDS; - }, - - getRawStorage(): Object { - const res = wx.getStorageInfoSync(); - const keys = res.keys; - - const storage = {}; - for(const key of keys){ - storage[key] = wx.getStorageSync(key); - } - return storage; - }, - - clear(): Promise { - const res = wx.getStorageInfoSync(); - const keys = res.keys; - - const toRemove = []; - for(const key of keys){ - if (isLocalDatastoreKey(key)) { - toRemove.push(key); - } - } - const promises = toRemove.map(this.unPinWithName); - return Promise.all(promises); - } -}; - -module.exports = LocalDatastoreController; diff --git a/src/Storage.js b/src/Storage.js index 04fff8fe6..0388ca698 100644 --- a/src/Storage.js +++ b/src/Storage.js @@ -71,6 +71,24 @@ const Storage = { return Promise.resolve(controller.removeItem(path)); }, + getAllKeys(): Array { + const controller = CoreManager.getStorageController(); + if (controller.async === 1) { + throw new Error( + 'Synchronous storage is not supported by the current storage controller' + ); + } + return controller.getAllKeys(); + }, + + getAllKeysAsync(): Promise> { + const controller = CoreManager.getStorageController(); + if (controller.async === 1) { + return controller.getAllKeysAsync(); + } + return Promise.resolve(controller.getAllKeys()); + }, + generatePath(path: string): string { if (!CoreManager.get('APPLICATION_ID')) { throw new Error('You need to call Parse.initialize before using Parse.'); diff --git a/src/StorageController.browser.js b/src/StorageController.browser.js index 16d2f9157..a75d957f1 100644 --- a/src/StorageController.browser.js +++ b/src/StorageController.browser.js @@ -28,6 +28,14 @@ const StorageController = { localStorage.removeItem(path); }, + getAllKeys() { + const keys = []; + for (let i = 0; i < localStorage.length; i += 1) { + keys.push(localStorage.key(i)); + } + return keys; + }, + clear() { localStorage.clear(); } diff --git a/src/StorageController.default.js b/src/StorageController.default.js index 7a82d70e2..fe60c9ba4 100644 --- a/src/StorageController.default.js +++ b/src/StorageController.default.js @@ -29,6 +29,10 @@ const StorageController = { delete memMap[path]; }, + getAllKeys() { + return Object.keys(memMap); + }, + clear() { for (const key in memMap) { if (memMap.hasOwnProperty(key)) { diff --git a/src/StorageController.react-native.js b/src/StorageController.react-native.js index dbb3f1b4e..a82722903 100644 --- a/src/StorageController.react-native.js +++ b/src/StorageController.react-native.js @@ -54,7 +54,7 @@ const StorageController = { }); }, - getAllKeys(): Promise { + getAllKeysAsync(): Promise { return new Promise((resolve, reject) => { this.getAsyncStorage().getAllKeys(function(err, keys) { if (err) { diff --git a/src/StorageController.weapp.js b/src/StorageController.weapp.js index da9358dfd..d074d75ba 100644 --- a/src/StorageController.weapp.js +++ b/src/StorageController.weapp.js @@ -27,6 +27,11 @@ const StorageController = { wx.removeStorageSync(path); }, + getAllKeys() { + const res = wx.getStorageInfoSync(); + return res.keys; + }, + clear() { wx.clearStorageSync(); } diff --git a/src/__tests__/CoreManager-test.js b/src/__tests__/CoreManager-test.js index bcc6096f6..81bb2691a 100644 --- a/src/__tests__/CoreManager-test.js +++ b/src/__tests__/CoreManager-test.js @@ -288,7 +288,8 @@ describe('CoreManager', () => { async: 0, getItem: function() {}, setItem: function() {}, - removeItem: function() {} + removeItem: function() {}, + getAllKeys: function() {} })).not.toThrow(); expect(CoreManager.setStorageController.bind(null, { async: 1 })).toThrow( @@ -310,7 +311,8 @@ describe('CoreManager', () => { async: 1, getItemAsync: function() {}, setItemAsync: function() {}, - removeItemAsync: function() {} + removeItemAsync: function() {}, + getAllKeysAsync: function() {} })).not.toThrow(); }); @@ -319,7 +321,8 @@ describe('CoreManager', () => { async: 0, getItem: function() {}, setItem: function() {}, - removeItem: function() {} + removeItem: function() {}, + getAllKeys: function() {} }; CoreManager.setStorageController(controller); diff --git a/src/__tests__/LocalDatastore-test.js b/src/__tests__/LocalDatastore-test.js index 55da547dd..689f85003 100644 --- a/src/__tests__/LocalDatastore-test.js +++ b/src/__tests__/LocalDatastore-test.js @@ -100,9 +100,10 @@ const LocalDatastore = require('../LocalDatastore'); const ParseObject = require('../ParseObject'); const ParseQuery = require('../ParseQuery'); const ParseUser = require('../ParseUser').default; +const LocalDatastoreController = require('../LocalDatastoreController'); const RNDatastoreController = require('../LocalDatastoreController.react-native'); -const BrowserDatastoreController = require('../LocalDatastoreController.browser'); -const DefaultDatastoreController = require('../LocalDatastoreController.default'); +const BrowserStorageController = require('../StorageController.browser'); +const DefaultStorageController = require('../StorageController.default'); const item1 = new ParseObject('Item'); const item2 = new ParseObject('Item'); @@ -788,71 +789,14 @@ describe('LocalDatastore', () => { }); }); -describe('BrowserDatastoreController', () => { +describe('LocalDatastore (BrowserStorageController)', () => { beforeEach(async () => { - await BrowserDatastoreController.clear(); - }); - - it('implement functionality', () => { - expect(typeof BrowserDatastoreController.fromPinWithName).toBe('function'); - expect(typeof BrowserDatastoreController.pinWithName).toBe('function'); - expect(typeof BrowserDatastoreController.unPinWithName).toBe('function'); - expect(typeof BrowserDatastoreController.getAllContents).toBe('function'); - expect(typeof BrowserDatastoreController.clear).toBe('function'); - }); - - it('can store and retrieve values', async () => { - expect(await BrowserDatastoreController.fromPinWithName(KEY1)).toEqual([]); - await BrowserDatastoreController.pinWithName(KEY1, [item1._toFullJSON()]); - expect(await BrowserDatastoreController.fromPinWithName(KEY1)).toEqual([item1._toFullJSON()]); - expect(await BrowserDatastoreController.getAllContents()).toEqual({ [KEY1]: [item1._toFullJSON()] }); - }); - - it('can remove values', async () => { - await BrowserDatastoreController.pinWithName(KEY1, [item1._toFullJSON()]); - expect(await BrowserDatastoreController.fromPinWithName(KEY1)).toEqual([item1._toFullJSON()]); - await BrowserDatastoreController.unPinWithName(KEY1); - expect(await BrowserDatastoreController.fromPinWithName(KEY1)).toEqual([]); - expect(await BrowserDatastoreController.getAllContents()).toEqual({}); - }); -}); - -describe('DefaultDatastoreController', () => { - beforeEach(async () => { - await DefaultDatastoreController.clear(); - }); - - it('implement functionality', () => { - expect(typeof DefaultDatastoreController.fromPinWithName).toBe('function'); - expect(typeof DefaultDatastoreController.pinWithName).toBe('function'); - expect(typeof DefaultDatastoreController.unPinWithName).toBe('function'); - expect(typeof DefaultDatastoreController.getAllContents).toBe('function'); - expect(typeof DefaultDatastoreController.clear).toBe('function'); - }); - - it('can store and retrieve values', async () => { - expect(await DefaultDatastoreController.fromPinWithName(KEY1)).toEqual([]); - await DefaultDatastoreController.pinWithName(KEY1, [item1._toFullJSON()]); - expect(await DefaultDatastoreController.fromPinWithName(KEY1)).toEqual([item1._toFullJSON()]); - expect(await DefaultDatastoreController.getAllContents()).toEqual({ [KEY1]: [item1._toFullJSON()] }); - }); - - it('can remove values', async () => { - await DefaultDatastoreController.pinWithName(KEY1, [item1._toFullJSON()]); - expect(await DefaultDatastoreController.fromPinWithName(KEY1)).toEqual([item1._toFullJSON()]); - await DefaultDatastoreController.unPinWithName(KEY1); - expect(await DefaultDatastoreController.fromPinWithName(KEY1)).toEqual([]); - expect(await DefaultDatastoreController.getAllContents()).toEqual({}); - }); -}); - -describe('LocalDatastore (BrowserDatastoreController)', () => { - beforeEach(async () => { - CoreManager.setLocalDatastoreController(BrowserDatastoreController); + CoreManager.setStorageController(BrowserStorageController); + CoreManager.setLocalDatastoreController(LocalDatastoreController); await LocalDatastore._clear(); }); - it('can store and retrieve values', async () => { + fit('can store and retrieve values', async () => { expect(await LocalDatastore.fromPinWithName(KEY1)).toEqual([]); await LocalDatastore.pinWithName(KEY1, [item1._toFullJSON()]); expect(await LocalDatastore.fromPinWithName(KEY1)).toEqual([item1._toFullJSON()]); @@ -896,9 +840,10 @@ describe('LocalDatastore (BrowserDatastoreController)', () => { }); }); -describe('LocalDatastore (DefaultDatastoreController)', () => { +describe('LocalDatastore (DefaultStorageController)', () => { beforeEach(async () => { - CoreManager.setLocalDatastoreController(DefaultDatastoreController); + CoreManager.setStorageController(DefaultStorageController); + CoreManager.setLocalDatastoreController(LocalDatastoreController); await LocalDatastore._clear(); }); diff --git a/src/__tests__/Storage-test.js b/src/__tests__/Storage-test.js index aaf7b61f0..2a97ec071 100644 --- a/src/__tests__/Storage-test.js +++ b/src/__tests__/Storage-test.js @@ -119,7 +119,7 @@ describe('React Native StorageController', () => { return RNStorageController.getItemAsync('myKey'); }).then((result) => { expect(result).toBe('myValue'); - return RNStorageController.getAllKeys(); + return RNStorageController.getAllKeysAsync(); }).then((keys) => { expect(keys[0]).toBe('myKey'); done(); @@ -172,7 +172,7 @@ describe('React Native StorageController', () => { }, }; CoreManager.setAsyncStorage(mockRNError); - RNStorageController.getAllKeys().catch((error) => { + RNStorageController.getAllKeysAsync().catch((error) => { expect(error).toBe('Error Thrown'); done(); }); From 12e7187fc1ef4f7c929b7c86c5b66a5738385524 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Tue, 5 Nov 2019 17:36:33 -0600 Subject: [PATCH 2/4] Improve coverage --- src/LocalDatastoreController.js | 15 +++++---------- src/StorageController.browser.js | 1 + src/__tests__/LocalDatastore-test.js | 2 +- src/__tests__/Storage-test.js | 7 +++++++ 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/LocalDatastoreController.js b/src/LocalDatastoreController.js index 470730b9a..35b45ccca 100644 --- a/src/LocalDatastoreController.js +++ b/src/LocalDatastoreController.js @@ -21,14 +21,9 @@ const LocalDatastoreController = { return objects; }, - async pinWithName(name: string, value: any) { - try { - const values = JSON.stringify(value); - await Storage.setItemAsync(name, values); - } catch (e) { - // Quota exceeded, possibly due to Safari Private Browsing mode - console.log(e.message); - } + pinWithName(name: string, value: any) { + const values = JSON.stringify(value); + return Storage.setItemAsync(name, values); }, unPinWithName(name: string) { @@ -39,7 +34,7 @@ const LocalDatastoreController = { const keys = await Storage.getAllKeysAsync(); const LDS = {}; - for(const key of keys){ + for(const key of keys) { if (isLocalDatastoreKey(key)) { const value = await Storage.getItemAsync(key); try { @@ -56,7 +51,7 @@ const LocalDatastoreController = { const keys = await Storage.getAllKeysAsync(); const storage = {}; - for(const key of keys){ + for(const key of keys) { const value = await Storage.getItemAsync(key); storage[key] = value; } diff --git a/src/StorageController.browser.js b/src/StorageController.browser.js index a75d957f1..f404499d4 100644 --- a/src/StorageController.browser.js +++ b/src/StorageController.browser.js @@ -21,6 +21,7 @@ const StorageController = { localStorage.setItem(path, value); } catch (e) { // Quota exceeded, possibly due to Safari Private Browsing mode + console.log(e.message); } }, diff --git a/src/__tests__/LocalDatastore-test.js b/src/__tests__/LocalDatastore-test.js index 689f85003..ce7623c91 100644 --- a/src/__tests__/LocalDatastore-test.js +++ b/src/__tests__/LocalDatastore-test.js @@ -796,7 +796,7 @@ describe('LocalDatastore (BrowserStorageController)', () => { await LocalDatastore._clear(); }); - fit('can store and retrieve values', async () => { + it('can store and retrieve values', async () => { expect(await LocalDatastore.fromPinWithName(KEY1)).toEqual([]); await LocalDatastore.pinWithName(KEY1, [item1._toFullJSON()]); expect(await LocalDatastore.fromPinWithName(KEY1)).toEqual([item1._toFullJSON()]); diff --git a/src/__tests__/Storage-test.js b/src/__tests__/Storage-test.js index 2a97ec071..96ab1b43f 100644 --- a/src/__tests__/Storage-test.js +++ b/src/__tests__/Storage-test.js @@ -218,6 +218,7 @@ describe('Storage (Default StorageController)', () => { expect(Storage.getItem('myKey')).toBe(null); Storage.setItem('myKey', 'myValue'); expect(Storage.getItem('myKey')).toBe('myValue'); + expect(Storage.getAllKeys()).toEqual(['myKey']); }); it('can remove values', () => { @@ -274,6 +275,9 @@ describe('Storage (Async StorageController)', () => { expect(Storage.removeItem).toThrow( 'Synchronous storage is not supported by the current storage controller' ); + expect(Storage.getAllKeys).toThrow( + 'Synchronous storage is not supported by the current storage controller' + ); }); it('wraps synchronous methods in async wrappers', (done) => { @@ -284,6 +288,9 @@ describe('Storage (Async StorageController)', () => { return Storage.getItemAsync('myKey'); }).then((result) => { expect(result).toBe('myValue'); + return Storage.getAllKeysAsync(); + }).then((result) => { + expect(result).toEqual(['myKey']); return Storage.removeItemAsync('myKey'); }).then(() => { return Storage.getItemAsync('myKey'); From 7af5a1678ecfc814d74579489adc58705f30c678 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Tue, 5 Nov 2019 18:10:37 -0600 Subject: [PATCH 3/4] replace for with reduce --- src/LocalDatastoreController.js | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/LocalDatastoreController.js b/src/LocalDatastoreController.js index 35b45ccca..637ba8352 100644 --- a/src/LocalDatastoreController.js +++ b/src/LocalDatastoreController.js @@ -32,30 +32,26 @@ const LocalDatastoreController = { async getAllContents(): Object { const keys = await Storage.getAllKeysAsync(); - const LDS = {}; - - for(const key of keys) { + return keys.reduce(async (accumulator, key) => { if (isLocalDatastoreKey(key)) { const value = await Storage.getItemAsync(key); try { - LDS[key] = JSON.parse(value); + accumulator[key] = JSON.parse(value); } catch (error) { console.error('Error getAllContents: ', error); } } - } - return LDS; + return accumulator; + }, {}); }, async getRawStorage(): Object { const keys = await Storage.getAllKeysAsync(); - const storage = {}; - - for(const key of keys) { + return keys.reduce(async (accumulator, key) => { const value = await Storage.getItemAsync(key); - storage[key] = value; - } - return storage; + accumulator[key] = value; + return accumulator; + }, {}); }, async clear(): Promise { From 76207525890be7fc459f65a1e162a624a418a192 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Tue, 5 Nov 2019 19:04:52 -0600 Subject: [PATCH 4/4] fix tests --- integration/test/ParseLocalDatastoreTest.js | 1 + src/LocalDatastoreController.js | 19 +++++++++++-------- src/LocalDatastoreController.react-native.js | 1 + 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/integration/test/ParseLocalDatastoreTest.js b/integration/test/ParseLocalDatastoreTest.js index c7f115e92..29c5b2905 100644 --- a/integration/test/ParseLocalDatastoreTest.js +++ b/integration/test/ParseLocalDatastoreTest.js @@ -2688,6 +2688,7 @@ describe('Parse LocalDatastore', () => { beforeEach((done) => { Parse.initialize('integration', null, 'notsosecret'); Parse.CoreManager.set('SERVER_URL', 'http://localhost:1337/parse'); + Parse.CoreManager.getInstallationController()._setInstallationIdCache('1234'); Parse.enableLocalDatastore(); Parse.User.enableUnsafeCurrentUser(); Parse.Storage._clear(); diff --git a/src/LocalDatastoreController.js b/src/LocalDatastoreController.js index 637ba8352..ca0a5216f 100644 --- a/src/LocalDatastoreController.js +++ b/src/LocalDatastoreController.js @@ -32,26 +32,29 @@ const LocalDatastoreController = { async getAllContents(): Object { const keys = await Storage.getAllKeysAsync(); - return keys.reduce(async (accumulator, key) => { + return keys.reduce(async (previousPromise, key) => { + const LDS = await previousPromise; if (isLocalDatastoreKey(key)) { const value = await Storage.getItemAsync(key); try { - accumulator[key] = JSON.parse(value); + LDS[key] = JSON.parse(value); } catch (error) { console.error('Error getAllContents: ', error); } } - return accumulator; - }, {}); + return LDS; + }, Promise.resolve({})); }, + // Used for testing async getRawStorage(): Object { const keys = await Storage.getAllKeysAsync(); - return keys.reduce(async (accumulator, key) => { + return keys.reduce(async (previousPromise, key) => { + const LDS = await previousPromise; const value = await Storage.getItemAsync(key); - accumulator[key] = value; - return accumulator; - }, {}); + LDS[key] = value; + return LDS; + }, Promise.resolve({})); }, async clear(): Promise { diff --git a/src/LocalDatastoreController.react-native.js b/src/LocalDatastoreController.react-native.js index 3d17b5993..05d63efe9 100644 --- a/src/LocalDatastoreController.react-native.js +++ b/src/LocalDatastoreController.react-native.js @@ -64,6 +64,7 @@ const LocalDatastoreController = { return LDS; }, + // Used for testing async getRawStorage(): Promise { const keys = await RNStorage.getAllKeysAsync(); const storage = {};