64 lines
2.0 KiB
JavaScript
64 lines
2.0 KiB
JavaScript
/**
|
|
* 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._);
|