UNPKG

tsioc

Version:

tsioc is AOP, Ioc container, via typescript decorator

120 lines (118 loc) 5.79 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; Object.defineProperty(exports, "__esModule", { value: true }); var index_1 = require("../../core/index"); var index_2 = require("../joinpoints/index"); var index_3 = require("../joinpoints/index"); var index_4 = require("../../utils/index"); var ProxyMethod = /** @class */ (function () { function ProxyMethod(container) { this.container = container; } Object.defineProperty(ProxyMethod.prototype, "aspectMgr", { get: function () { if (!this._aspectMgr) { this._aspectMgr = this.container.get(index_4.symbols.IAdvisor); } return this._aspectMgr; }, enumerable: true, configurable: true }); Object.defineProperty(ProxyMethod.prototype, "liefScope", { get: function () { if (!this._liefScope) { this._liefScope = this.container.getLifeScope(); } return this._liefScope; }, enumerable: true, configurable: true }); ProxyMethod.prototype.proceed = function (target, targetType, pointcut, provJoinpoint) { var aspectMgr = this.aspectMgr; var fullName = pointcut.fullName; var methodName = pointcut.name; var advices = aspectMgr.getAdvices(fullName); if (advices && pointcut) { if (pointcut.descriptor && (pointcut.descriptor.get || pointcut.descriptor.set)) { if (pointcut.descriptor.get) { var getMethod = pointcut.descriptor.get.bind(target); pointcut.descriptor.get = this.proxy(getMethod, advices, target, targetType, pointcut, provJoinpoint); } if (pointcut.descriptor.set) { var setMethod = pointcut.descriptor.set.bind(target); pointcut.descriptor.set = this.proxy(setMethod, advices, target, targetType, pointcut, provJoinpoint); } Object.defineProperty(target, methodName, pointcut.descriptor); } else if (index_4.isFunction(target[methodName])) { var propertyMethod = target[methodName].bind(target); target[methodName] = this.proxy(propertyMethod, advices, target, targetType, pointcut, provJoinpoint); } } }; ProxyMethod.prototype.proxy = function (propertyMethod, advices, target, targetType, pointcut, provJoinpoint) { var _this = this; var aspectMgr = this.aspectMgr; var fullName = pointcut.fullName; var methodName = pointcut.name; var liefScope = this.liefScope; var container = this.container; return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var joinPoint = _this.container.resolve(index_3.Joinpoint, index_1.Provider.create('options', { name: methodName, fullName: fullName, provJoinpoint: provJoinpoint, annotations: provJoinpoint ? null : liefScope.getMethodMetadatas(targetType, methodName), params: liefScope.getMethodParameters(targetType, target, methodName), args: args, target: target, targetType: targetType })); var adChain = container.resolve(index_4.symbols.IAdvisorChainFactory, { container: container, advices: advices }); adChain.invoaction(joinPoint, index_2.JoinpointState.Before); adChain.invoaction(joinPoint, index_2.JoinpointState.Pointcut); var val, exeErr; try { val = propertyMethod.apply(void 0, joinPoint.args); } catch (err) { exeErr = err; } adChain.invoaction(joinPoint, index_2.JoinpointState.After, val); if (exeErr) { adChain.invoaction(joinPoint, index_2.JoinpointState.AfterThrowing, exeErr); } else { adChain.invoaction(joinPoint, index_2.JoinpointState.AfterReturning, val); return joinPoint.returning; } }; }; ProxyMethod.classAnnations = { "name": "ProxyMethod", "params": { "constructor": ["container"], "proceed": ["target", "targetType", "pointcut", "provJoinpoint"], "proxy": ["propertyMethod", "advices", "target", "targetType", "pointcut", "provJoinpoint"] } }; ProxyMethod = __decorate([ index_1.NonePointcut(), index_1.Singleton(index_4.symbols.IProxyMethod), __param(0, index_1.Inject(index_4.symbols.IContainer)), __metadata("design:paramtypes", [Object]) ], ProxyMethod); return ProxyMethod; }()); exports.ProxyMethod = ProxyMethod; //# sourceMappingURL=../sourcemaps/access/ProxyMethod.js.map