@nexex/orderbook
Version:
95 lines • 3.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
/* class decorator */
var LocalCache_1 = require("../utils/LocalCache");
var cacheMap = new Map();
function keyGen(args) {
if (args === void 0) { args = []; }
try {
var argsStr = '';
for (var _i = 0, args_1 = args; _i < args_1.length; _i++) {
var arg = args_1[_i];
if (typeof arg === 'string' || typeof arg === 'number' || String(arg) !== '[object Object]') {
argsStr += String(arg);
}
else {
throw new Error();
}
}
return argsStr;
}
catch (e) {
throw new Error('invalid params');
}
}
function getLocalCache(target, name, args, isPromise) {
var cacheObj = cacheMap.get(target.constructor.name + "#" + name);
if (!cacheObj) {
cacheObj = { cacheData: new LocalCache_1.LocalCache(), isPromise: isPromise };
cacheMap.set(target.constructor.name + "#" + name, cacheObj);
}
return cacheObj.cacheData;
}
function testPromise(e) {
return !!e && typeof e.then === 'function';
}
function localCache(expire) {
return function (target, name, descriptor) {
if (!!descriptor && typeof descriptor.value === 'function') {
var orig_1 = descriptor.value;
// tslint:disable no-function-expression no-invalid-this
descriptor.value = function () {
var _this = this;
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var cacheObj = cacheMap.get(target.constructor.name + "#" + name);
var key = keyGen(args);
if (cacheObj) {
var _a = cacheMap.get(target.constructor.name + "#" + name), cacheData = _a.cacheData, isPromise = _a.isPromise;
var cached = cacheData.get(key);
if (cached) {
if (isPromise) {
return Promise.resolve(cached);
}
else {
return cached;
}
}
}
var res = orig_1.bind(this).apply(void 0, args);
if (testPromise(res)) {
res.then(function (futureRes) {
if (futureRes) {
getLocalCache(target, name, args, true).put(key, futureRes, expire, function () {
return orig_1.bind(_this).apply(void 0, args);
});
}
return futureRes;
});
}
else {
getLocalCache(target, name, args, false).put(key, res, expire, function () {
return orig_1.bind(_this).apply(void 0, args);
});
}
return res;
};
descriptor.value.clear = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var cacheObj = cacheMap.get(target.constructor.name + "#" + name);
var key = keyGen(args);
if (cacheObj) {
var cacheData = cacheMap.get(target.constructor.name + "#" + name).cacheData;
cacheData.remove(key);
}
};
}
};
}
exports.localCache = localCache;
//# sourceMappingURL=decorators.js.map