control-freak-ide/server/nodejs/_build/di/agent.js
plastic-hub-dev-node-saturn 538369cff7 latest
2021-05-12 18:35:18 +02:00

97 lines
3.8 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("./core");
const proxy_1 = require("./core/interceptors/proxy");
const utils_1 = require("./core/utils");
const ready_1 = require("./extra/ready");
const reflection_1 = require("./core/reflection");
const metadata_1 = require("./core/metadata");
// ===========================================
// ES2015 or before
if (typeof Reflect !== 'object' || typeof Proxy !== 'function') {
throw new Error('Agent Framework requires ES2016 support');
}
// ===========================================
// ES2016
if (typeof Reflect['metadata'] !== 'function') {
// Install Reflect.metadata for tsc only
// tsc will add following code to the generated js file. in order to utilize these information.
// we create and method of Reflect.metadata to inject these information to Reflection object
// Reflect.metadata("design:type", Function),
// Reflect.metadata("design:paramtypes", []),
// Reflect.metadata("design:returntype", String)
Reflect['metadata'] = function (key, value) {
return function (target, propertyKey, descriptor) {
reflection_1.Reflection.addMetadata(key, value, target, propertyKey, descriptor);
};
};
}
/**
* Define an agent
* @returns {(target:Constructor)=>(void|Constructor)}
*/
function agent(identifier) {
return core_1.decorateClass(new AgentAttribute(identifier));
}
exports.agent = agent;
/**
* AgentAttribute
*/
class AgentAttribute {
constructor(_identifier) {
this._identifier = _identifier;
}
get identifier() {
return this._identifier;
}
getInterceptor() {
return this;
}
intercept(invocation, parameters) {
let originalAgent = invocation.invoke(parameters);
// // NOTE: In order to improve the performance, do not proxy if no field interceptors detected
// // intercept by overloading ES5 prototype (static intercept)
// const interceptorDefinitions = Reflection.metadata.getAll(invocation.target.prototype);
// if (interceptorDefinitions) {
//
// const fieldInterceptors = [...interceptorDefinitions.values()]
// .filter(reflection => !reflection.descriptor)
// .filter(reflection => reflection.hasAttributes());
//
// // do not proxy if no field interceptors detected
// if (fieldInterceptors.length) {
// // Proxy the current agent object
// agent = AddProxyInterceptor(agent);
// }
//
// }
// only proxy one time
if (!Reflect.has(originalAgent, utils_1.ORIGIN_INSTANCE)) {
// intercept by implement ES6 proxy (dynamic intercept)
const domain = Reflect.get(originalAgent, utils_1.AGENT_DOMAIN);
const upgradedAgent = proxy_1.AddProxyInterceptor(originalAgent);
Reflect.set(upgradedAgent, utils_1.ORIGIN_INSTANCE, originalAgent);
Reflect.set(upgradedAgent, utils_1.AGENT_DOMAIN, domain);
const readyList = [];
// find metadata
metadata_1.Metadata.getAll(Reflect.getPrototypeOf(originalAgent)).forEach((reflection, key) => {
if (reflection.getAttributes(ready_1.ReadyAttribute).length) {
readyList.push(key);
}
});
// execute agent hook: -> READY
if (readyList.length) {
readyList.forEach(ready => {
const readyFn = Reflect.get(upgradedAgent, ready);
if (typeof readyFn === 'function') {
Reflect.apply(readyFn, upgradedAgent, []);
}
});
}
return upgradedAgent;
}
return originalAgent;
}
}
exports.AgentAttribute = AgentAttribute;
//# sourceMappingURL=agent.js.map