UNPKG

@nexex/orderbook

Version:
95 lines 3.71 kB
"use strict"; 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