localforage-setitems.es6.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import localforage from 'localforage';
  2. function getSerializerPromise(localForageInstance) {
  3. if (getSerializerPromise.result) {
  4. return getSerializerPromise.result;
  5. }
  6. if (!localForageInstance || typeof localForageInstance.getSerializer !== 'function') {
  7. return Promise.reject(new Error('localforage.getSerializer() was not available! ' + 'localforage v1.4+ is required!'));
  8. }
  9. getSerializerPromise.result = localForageInstance.getSerializer();
  10. return getSerializerPromise.result;
  11. }
  12. function executeCallback(promise, callback) {
  13. if (callback) {
  14. promise.then(function (result) {
  15. callback(null, result);
  16. }, function (error) {
  17. callback(error);
  18. });
  19. }
  20. }
  21. function forEachItem(items, keyFn, valueFn, loopFn) {
  22. function ensurePropGetterMethod(propFn, defaultPropName) {
  23. var propName = propFn || defaultPropName;
  24. if ((!propFn || typeof propFn !== 'function') && typeof propName === 'string') {
  25. propFn = function propFn(item) {
  26. return item[propName];
  27. };
  28. }
  29. return propFn;
  30. }
  31. var result = [];
  32. // http://stackoverflow.com/questions/4775722/check-if-object-is-array
  33. if (Object.prototype.toString.call(items) === '[object Array]') {
  34. keyFn = ensurePropGetterMethod(keyFn, 'key');
  35. valueFn = ensurePropGetterMethod(valueFn, 'value');
  36. for (var i = 0, len = items.length; i < len; i++) {
  37. var item = items[i];
  38. result.push(loopFn(keyFn(item), valueFn(item)));
  39. }
  40. } else {
  41. for (var prop in items) {
  42. if (items.hasOwnProperty(prop)) {
  43. result.push(loopFn(prop, items[prop]));
  44. }
  45. }
  46. }
  47. return result;
  48. }
  49. function setItemsIndexedDB(items, keyFn, valueFn, callback) {
  50. var localforageInstance = this;
  51. var promise = localforageInstance.ready().then(function () {
  52. return new Promise(function (resolve, reject) {
  53. // Inspired from @lu4 PR mozilla/localForage#318
  54. var dbInfo = localforageInstance._dbInfo;
  55. var transaction = dbInfo.db.transaction(dbInfo.storeName, 'readwrite');
  56. var store = transaction.objectStore(dbInfo.storeName);
  57. var lastError;
  58. transaction.oncomplete = function () {
  59. resolve(items);
  60. };
  61. transaction.onabort = transaction.onerror = function (event) {
  62. reject(lastError || event.target);
  63. };
  64. function requestOnError(evt) {
  65. var request = evt.target || this;
  66. lastError = request.error || request.transaction.error;
  67. reject(lastError);
  68. }
  69. forEachItem(items, keyFn, valueFn, function (key, value) {
  70. // The reason we don't _save_ null is because IE 10 does
  71. // not support saving the `null` type in IndexedDB. How
  72. // ironic, given the bug below!
  73. // See: https://github.com/mozilla/localForage/issues/161
  74. if (value === null) {
  75. value = undefined;
  76. }
  77. var request = store.put(value, key);
  78. request.onerror = requestOnError;
  79. });
  80. });
  81. });
  82. executeCallback(promise, callback);
  83. return promise;
  84. }
  85. function setItemsWebsql(items, keyFn, valueFn, callback) {
  86. var localforageInstance = this;
  87. var promise = new Promise(function (resolve, reject) {
  88. localforageInstance.ready().then(function () {
  89. return getSerializerPromise(localforageInstance);
  90. }).then(function (serializer) {
  91. // Inspired from @lu4 PR mozilla/localForage#318
  92. var dbInfo = localforageInstance._dbInfo;
  93. dbInfo.db.transaction(function (t) {
  94. var query = 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' (key, value) VALUES (?, ?)';
  95. var itemPromises = forEachItem(items, keyFn, valueFn, function (key, value) {
  96. return new Promise(function (resolve, reject) {
  97. serializer.serialize(value, function (value, error) {
  98. if (error) {
  99. reject(error);
  100. } else {
  101. t.executeSql(query, [key, value], function () {
  102. resolve();
  103. }, function (t, error) {
  104. reject(error);
  105. });
  106. }
  107. });
  108. });
  109. });
  110. Promise.all(itemPromises).then(function () {
  111. resolve(items);
  112. }, reject);
  113. }, function (sqlError) {
  114. reject(sqlError);
  115. } /*, function() {
  116. if (resolving) {
  117. resolve(items);
  118. }
  119. }*/);
  120. }).catch(reject);
  121. });
  122. executeCallback(promise, callback);
  123. return promise;
  124. }
  125. function setItemsGeneric(items, keyFn, valueFn, callback) {
  126. var localforageInstance = this;
  127. var itemPromises = forEachItem(items, keyFn, valueFn, function (key, value) {
  128. return localforageInstance.setItem(key, value);
  129. });
  130. var promise = Promise.all(itemPromises);
  131. executeCallback(promise, callback);
  132. return promise;
  133. }
  134. function localforageSetItems(items, keyFn, valueFn, callback) {
  135. var localforageInstance = this;
  136. var currentDriver = localforageInstance.driver();
  137. if (currentDriver === localforageInstance.INDEXEDDB) {
  138. return setItemsIndexedDB.call(localforageInstance, items, keyFn, valueFn, callback);
  139. } else if (currentDriver === localforageInstance.WEBSQL) {
  140. return setItemsWebsql.call(localforageInstance, items, keyFn, valueFn, callback);
  141. } else {
  142. return setItemsGeneric.call(localforageInstance, items, keyFn, valueFn, callback);
  143. }
  144. }
  145. function extendPrototype(localforage$$1) {
  146. var localforagePrototype = Object.getPrototypeOf(localforage$$1);
  147. if (localforagePrototype) {
  148. localforagePrototype.setItems = localforageSetItems;
  149. localforagePrototype.setItems.indexedDB = function () {
  150. return setItemsIndexedDB.apply(this, arguments);
  151. };
  152. localforagePrototype.setItems.websql = function () {
  153. return setItemsWebsql.apply(this, arguments);
  154. };
  155. localforagePrototype.setItems.generic = function () {
  156. return setItemsGeneric.apply(this, arguments);
  157. };
  158. }
  159. }
  160. var extendPrototypeResult = extendPrototype(localforage);
  161. export { setItemsGeneric, localforageSetItems, extendPrototype, extendPrototypeResult };