| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- /**
- * Copyright (c) 2019 ESHA Research
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- *
- * Adds an 'async' duplicate on all store APIs that
- * performs storage-related operations asynchronously and returns
- * a promise.
- *
- * Status: BETA - works great, but lacks justification for existence
- */
- ;(function(window, _) {
- var dontPromisify = ['async', 'area', 'namespace', 'isFake', 'toString'];
- _.promisify = function(api) {
- var async = api.async = _.Store(api._id, api._area, api._ns);
- async._async = true;
- Object.keys(api).forEach(function(name) {
- if (name.charAt(0) !== '_' && dontPromisify.indexOf(name) < 0) {
- var fn = api[name];
- if (typeof fn === "function") {
- async[name] = _.promiseFn(name, fn, api);
- }
- }
- });
- return async;
- };
- _.promiseFn = function(name, fn, self) {
- return function promised() {
- var args = arguments;
- return new Promise(function(resolve, reject) {
- setTimeout(function() {
- try {
- resolve(fn.apply(self, args));
- } catch (e) {
- reject(e);
- }
- }, 0);
- });
- };
- };
- // promisify existing apis
- for (var apiName in _.apis) {
- _.promisify(_.apis[apiName]);
- }
- // ensure future apis are promisified
- Object.defineProperty(_.storeAPI, 'async', {
- enumerable: true,
- configurable: true,
- get: function() {
- var async = _.promisify(this);
- // overwrite getter to avoid re-promisifying
- Object.defineProperty(this, 'async', {
- enumerable: true,
- value: async
- });
- return async;
- }
- });
- })(window, window.store._);
|