Skip to content

Commit fe5e21a

Browse files
authored
Reuse StorageController for LDS (#984)
* Reuse StorageController for LDS Let me know if changes are needed. Some of the promises could be written better. * Improve coverage * replace for with reduce * fix tests
1 parent d42cd14 commit fe5e21a

15 files changed

+96
-238
lines changed

integration/test/ParseLocalDatastoreTest.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2688,6 +2688,7 @@ describe('Parse LocalDatastore', () => {
26882688
beforeEach((done) => {
26892689
Parse.initialize('integration', null, 'notsosecret');
26902690
Parse.CoreManager.set('SERVER_URL', 'http://localhost:1337/parse');
2691+
Parse.CoreManager.getInstallationController()._setInstallationIdCache('1234');
26912692
Parse.enableLocalDatastore();
26922693
Parse.User.enableUnsafeCurrentUser();
26932694
Parse.Storage._clear();
@@ -2697,8 +2698,7 @@ describe('Parse LocalDatastore', () => {
26972698
});
26982699

26992700
const controllers = [
2700-
{ name: 'Default', file: '../../lib/node/LocalDatastoreController.default' },
2701-
{ name: 'Browser', file: '../../lib/node/LocalDatastoreController.browser' },
2701+
{ name: 'Default', file: '../../lib/node/LocalDatastoreController' },
27022702
{ name: 'React-Native', file: '../../lib/node/LocalDatastoreController.react-native' },
27032703
];
27042704

src/CoreManager.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,12 +338,14 @@ module.exports = {
338338
'getItemAsync',
339339
'setItemAsync',
340340
'removeItemAsync',
341+
'getAllKeysAsync'
341342
], controller);
342343
} else {
343344
requireMethods('A synchronous StorageController', [
344345
'getItem',
345346
'setItem',
346347
'removeItem',
348+
'getAllKeys'
347349
], controller);
348350
}
349351
config['StorageController'] = controller;

src/LocalDatastore.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -406,11 +406,7 @@ module.exports = LocalDatastore;
406406

407407
if (process.env.PARSE_BUILD === 'react-native') {
408408
CoreManager.setLocalDatastoreController(require('./LocalDatastoreController.react-native'));
409-
} else if (process.env.PARSE_BUILD === 'browser') {
410-
CoreManager.setLocalDatastoreController(require('./LocalDatastoreController.browser'));
411-
} else if (process.env.PARSE_BUILD === 'weapp') {
412-
CoreManager.setLocalDatastoreController(require('./LocalDatastoreController.weapp'));
413409
} else {
414-
CoreManager.setLocalDatastoreController(require('./LocalDatastoreController.default'));
410+
CoreManager.setLocalDatastoreController(require('./LocalDatastoreController'));
415411
}
416412
CoreManager.setLocalDatastore(LocalDatastore);

src/LocalDatastoreController.default.js

Lines changed: 0 additions & 55 deletions
This file was deleted.

src/LocalDatastoreController.browser.js renamed to src/LocalDatastoreController.js

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@
88
*
99
* @flow
1010
*/
11-
12-
/* global localStorage */
1311
import { isLocalDatastoreKey } from './LocalDatastoreUtils';
12+
import Storage from './Storage';
1413

1514
const LocalDatastoreController = {
16-
fromPinWithName(name: string): Array<Object> {
17-
const values = localStorage.getItem(name);
15+
async fromPinWithName(name: string): Array<Object> {
16+
const values = await Storage.getItemAsync(name);
1817
if (!values) {
1918
return [];
2019
}
@@ -23,49 +22,46 @@ const LocalDatastoreController = {
2322
},
2423

2524
pinWithName(name: string, value: any) {
26-
try {
27-
const values = JSON.stringify(value);
28-
localStorage.setItem(name, values);
29-
} catch (e) {
30-
// Quota exceeded, possibly due to Safari Private Browsing mode
31-
console.log(e.message);
32-
}
25+
const values = JSON.stringify(value);
26+
return Storage.setItemAsync(name, values);
3327
},
3428

3529
unPinWithName(name: string) {
36-
localStorage.removeItem(name);
30+
return Storage.removeItemAsync(name);
3731
},
3832

39-
getAllContents(): Object {
40-
const LDS = {};
41-
for (let i = 0; i < localStorage.length; i += 1) {
42-
const key = localStorage.key(i);
33+
async getAllContents(): Object {
34+
const keys = await Storage.getAllKeysAsync();
35+
return keys.reduce(async (previousPromise, key) => {
36+
const LDS = await previousPromise;
4337
if (isLocalDatastoreKey(key)) {
44-
const value = localStorage.getItem(key);
38+
const value = await Storage.getItemAsync(key);
4539
try {
4640
LDS[key] = JSON.parse(value);
4741
} catch (error) {
4842
console.error('Error getAllContents: ', error);
4943
}
5044
}
51-
}
52-
return LDS;
45+
return LDS;
46+
}, Promise.resolve({}));
5347
},
5448

55-
getRawStorage(): Object {
56-
const storage = {};
57-
for (let i = 0; i < localStorage.length; i += 1) {
58-
const key = localStorage.key(i);
59-
const value = localStorage.getItem(key);
60-
storage[key] = value;
61-
}
62-
return storage;
49+
// Used for testing
50+
async getRawStorage(): Object {
51+
const keys = await Storage.getAllKeysAsync();
52+
return keys.reduce(async (previousPromise, key) => {
53+
const LDS = await previousPromise;
54+
const value = await Storage.getItemAsync(key);
55+
LDS[key] = value;
56+
return LDS;
57+
}, Promise.resolve({}));
6358
},
6459

65-
clear(): Promise {
60+
async clear(): Promise {
61+
const keys = await Storage.getAllKeysAsync();
62+
6663
const toRemove = [];
67-
for (let i = 0; i < localStorage.length; i += 1) {
68-
const key = localStorage.key(i);
64+
for(const key of keys){
6965
if (isLocalDatastoreKey(key)) {
7066
toRemove.push(key);
7167
}

src/LocalDatastoreController.react-native.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const LocalDatastoreController = {
3737
},
3838

3939
async getAllContents(): Promise<Object> {
40-
const keys = await RNStorage.getAllKeys();
40+
const keys = await RNStorage.getAllKeysAsync();
4141
const batch = [];
4242
for (let i = 0; i < keys.length; i += 1) {
4343
const key = keys[i];
@@ -64,8 +64,9 @@ const LocalDatastoreController = {
6464
return LDS;
6565
},
6666

67+
// Used for testing
6768
async getRawStorage(): Promise<Object> {
68-
const keys = await RNStorage.getAllKeys();
69+
const keys = await RNStorage.getAllKeysAsync();
6970
const storage = {};
7071
const results = await RNStorage.multiGet(keys);
7172
results.map((pair) => {
@@ -76,7 +77,7 @@ const LocalDatastoreController = {
7677
},
7778

7879
async clear(): Promise<void> {
79-
const keys = await RNStorage.getAllKeys();
80+
const keys = await RNStorage.getAllKeysAsync();
8081
const batch = [];
8182
for (let i = 0; i < keys.length; i += 1) {
8283
const key = keys[i];

src/LocalDatastoreController.weapp.js

Lines changed: 0 additions & 73 deletions
This file was deleted.

src/Storage.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,24 @@ const Storage = {
7171
return Promise.resolve(controller.removeItem(path));
7272
},
7373

74+
getAllKeys(): Array<string> {
75+
const controller = CoreManager.getStorageController();
76+
if (controller.async === 1) {
77+
throw new Error(
78+
'Synchronous storage is not supported by the current storage controller'
79+
);
80+
}
81+
return controller.getAllKeys();
82+
},
83+
84+
getAllKeysAsync(): Promise<Array<string>> {
85+
const controller = CoreManager.getStorageController();
86+
if (controller.async === 1) {
87+
return controller.getAllKeysAsync();
88+
}
89+
return Promise.resolve(controller.getAllKeys());
90+
},
91+
7492
generatePath(path: string): string {
7593
if (!CoreManager.get('APPLICATION_ID')) {
7694
throw new Error('You need to call Parse.initialize before using Parse.');

src/StorageController.browser.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,22 @@ const StorageController = {
2121
localStorage.setItem(path, value);
2222
} catch (e) {
2323
// Quota exceeded, possibly due to Safari Private Browsing mode
24+
console.log(e.message);
2425
}
2526
},
2627

2728
removeItem(path: string) {
2829
localStorage.removeItem(path);
2930
},
3031

32+
getAllKeys() {
33+
const keys = [];
34+
for (let i = 0; i < localStorage.length; i += 1) {
35+
keys.push(localStorage.key(i));
36+
}
37+
return keys;
38+
},
39+
3140
clear() {
3241
localStorage.clear();
3342
}

src/StorageController.default.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ const StorageController = {
2929
delete memMap[path];
3030
},
3131

32+
getAllKeys() {
33+
return Object.keys(memMap);
34+
},
35+
3236
clear() {
3337
for (const key in memMap) {
3438
if (memMap.hasOwnProperty(key)) {

0 commit comments

Comments
 (0)