vulcain-corejs
Version:
Vulcain micro-service framework
141 lines • 5.01 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const annotations_1 = require("./annotations");
var BusUsage;
(function (BusUsage) {
BusUsage[BusUsage["all"] = 0] = "all";
BusUsage[BusUsage["commandOnly"] = 1] = "commandOnly";
BusUsage[BusUsage["eventOnly"] = 2] = "eventOnly";
})(BusUsage = exports.BusUsage || (exports.BusUsage = {}));
/**
* Register direct route
* @param verb Http verb in uppercase
* @param path Path to compare
* @param handler Request
*/
class NativeEndpoint {
}
exports.NativeEndpoint = NativeEndpoint;
class InstanceResolver {
constructor(instance) {
this.instance = instance;
this.lifeTime = annotations_1.LifeTime.Singleton;
}
resolve(container, name) {
return this.instance;
}
}
exports.InstanceResolver = InstanceResolver;
class Resolver {
constructor(fn, lifeTime, args) {
this.fn = fn;
this.lifeTime = lifeTime;
this.args = args;
}
resolve(container, name) {
let params = [];
this.injectArguments(container, name, params);
if (this.args) {
this.args.forEach(a => {
params.push(a);
});
}
let component = invoke(this.fn, params);
component._id = Resolver.nb++;
this.injectProperties(container, name, component);
component.onInjectionCompleted && component.onInjectionCompleted();
return component;
}
injectProperties(container, name, component) {
let injects = [];
let target = this.fn.prototype;
while (target) {
try {
let tmp = Reflect.getMetadata(Symbol.for("di:props_injects"), target);
if (tmp) {
injects = injects.concat(tmp);
}
}
catch (e) { }
target = Object.getPrototypeOf(target);
}
for (let inject in injects) {
let info = injects[inject];
try {
// Do not inject if property is already set
component[info.property] = component[info.property] || container.get(info.name, info.optional);
}
catch (e) {
throw new Error(`Error when instantiating component ${name} on injected property ${info.property} : ${e.message}`);
}
}
}
injectArguments(container, name, params) {
let injects;
try {
injects = Reflect.getMetadata(Symbol.for("di:ctor_injects"), this.fn);
}
catch (e) { }
if (injects) {
try {
for (let inject in injects) {
let info = injects[inject];
params.push(container.get(info.name, info.optional));
}
}
catch (e) {
throw new Error(`Error when instantiating component ${name} on injected parameter : ${e.message}`);
}
}
}
}
Resolver.nb = 0;
exports.Resolver = Resolver;
class SingletonResolver extends Resolver {
constructor(fn, args) {
super(fn, annotations_1.LifeTime.Singleton, args);
}
resolve(container, name, parentContainer) {
let instance = name && container.scope.getInstance(name);
if (!instance) {
instance = super.resolve(container, name);
// Add instance in the container where the resolver was defined
if (name && instance)
parentContainer.scope.set(name, instance);
}
return instance;
}
}
exports.SingletonResolver = SingletonResolver;
class ScopedResolver extends Resolver {
constructor(fn, args) {
super(fn, annotations_1.LifeTime.Scoped, args);
}
resolve(container, name) {
let instance = name && container.scope.getInstance(name);
if (!instance) {
instance = super.resolve(container, name);
// Add instance in the current scope
if (name && instance)
container.scope.set(name, instance);
}
instance.context = container.scope.context;
return instance;
}
}
exports.ScopedResolver = ScopedResolver;
function invoke(fn, args) {
switch (args.length) {
case 0: return new fn();
case 1: return new fn(args[0]);
case 2: return new fn(args[0], args[1]);
case 3: return new fn(args[0], args[1], args[2]);
case 4: return new fn(args[0], args[1], args[2], args[3]);
case 5: return new fn(args[0], args[1], args[2], args[3], args[4]);
case 6: return new fn(args[0], args[1], args[2], args[3], args[4], args[5]);
case 7: return new fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
default:
return Reflect.construct(fn, args);
}
}
//# sourceMappingURL=resolvers.js.map