localforage-setitems.js 7.3 KB

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