LocalDatastoreController.react-native.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. "use strict";
  2. var _LocalDatastoreUtils = require("./LocalDatastoreUtils");
  3. /**
  4. * Copyright (c) 2015-present, Parse, LLC.
  5. * All rights reserved.
  6. *
  7. * This source code is licensed under the BSD-style license found in the
  8. * LICENSE file in the root directory of this source tree. An additional grant
  9. * of patent rights can be found in the PATENTS file in the same directory.
  10. *
  11. * @flow
  12. * @private
  13. */
  14. const RNStorage = require('./StorageController.react-native');
  15. const LocalDatastoreController = {
  16. async fromPinWithName(name
  17. /*: string*/
  18. )
  19. /*: Promise<Array<Object>>*/
  20. {
  21. const values = await RNStorage.getItemAsync(name);
  22. if (!values) {
  23. return [];
  24. }
  25. const objects = JSON.parse(values);
  26. return objects;
  27. },
  28. async pinWithName(name
  29. /*: string*/
  30. , value
  31. /*: any*/
  32. )
  33. /*: Promise<void>*/
  34. {
  35. try {
  36. const values = JSON.stringify(value);
  37. await RNStorage.setItemAsync(name, values);
  38. } catch (e) {
  39. // Quota exceeded, possibly due to Safari Private Browsing mode
  40. // eslint-disable-next-line no-console
  41. console.error(e.message);
  42. }
  43. },
  44. unPinWithName(name
  45. /*: string*/
  46. )
  47. /*: Promise<void>*/
  48. {
  49. return RNStorage.removeItemAsync(name);
  50. },
  51. async getAllContents()
  52. /*: Promise<Object>*/
  53. {
  54. const keys = await RNStorage.getAllKeysAsync();
  55. const batch = [];
  56. for (let i = 0; i < keys.length; i += 1) {
  57. const key = keys[i];
  58. if ((0, _LocalDatastoreUtils.isLocalDatastoreKey)(key)) {
  59. batch.push(key);
  60. }
  61. }
  62. const LDS = {};
  63. let results = [];
  64. try {
  65. results = await RNStorage.multiGet(batch);
  66. } catch (error) {
  67. // eslint-disable-next-line no-console
  68. console.error('Error getAllContents: ', error);
  69. return {};
  70. }
  71. results.forEach(pair => {
  72. const [key, value] = pair;
  73. try {
  74. LDS[key] = JSON.parse(value);
  75. } catch (error) {
  76. LDS[key] = null;
  77. }
  78. });
  79. return LDS;
  80. },
  81. // Used for testing
  82. async getRawStorage()
  83. /*: Promise<Object>*/
  84. {
  85. const keys = await RNStorage.getAllKeysAsync();
  86. const storage = {};
  87. const results = await RNStorage.multiGet(keys);
  88. results.forEach(pair => {
  89. const [key, value] = pair;
  90. storage[key] = value;
  91. });
  92. return storage;
  93. },
  94. async clear()
  95. /*: Promise<void>*/
  96. {
  97. const keys = await RNStorage.getAllKeysAsync();
  98. const batch = [];
  99. for (let i = 0; i < keys.length; i += 1) {
  100. const key = keys[i];
  101. if ((0, _LocalDatastoreUtils.isLocalDatastoreKey)(key)) {
  102. batch.push(key);
  103. }
  104. }
  105. return RNStorage.multiRemove(batch).catch(error => // eslint-disable-next-line no-console
  106. console.error('Error clearing local datastore: ', error));
  107. }
  108. };
  109. module.exports = LocalDatastoreController;