vulcain-corejs
Version:
Vulcain micro-service framework
81 lines (79 loc) • 3.74 kB
JavaScript
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments)).next());
});
};
const annotations_1 = require("../di/annotations");
const annotations_2 = require("../di/annotations");
const system_1 = require("../configurations/globals/system");
let ProviderFactory = class ProviderFactory {
constructor(maxPoolSize = 20) {
this.maxPoolSize = maxPoolSize;
this.pool = new Map();
}
addToPool(key, item) {
system_1.System.log.info(null, "Adding a new provider pool item : " + key);
if (this.pool.size >= this.maxPoolSize) {
// remove the least used
let keyToRemove;
let min = 0;
for (const [key, value] of this.pool.entries()) {
if (!keyToRemove || value.count < min) {
keyToRemove = key;
min = value.count;
}
}
let item = this.pool.get(keyToRemove);
item.dispose && item.dispose();
this.pool.delete(keyToRemove);
system_1.System.log.info(null, "Ejecting " + keyToRemove + " from provider pool item.");
}
item.count = 1;
this.pool.set(key, item);
}
getFromPool(key) {
let item = this.pool.get(key);
if (item) {
item.count++;
return item.provider;
}
}
getProviderAsync(context, tenant, providerName = annotations_2.DefaultServiceNames.Provider) {
return __awaiter(this, void 0, void 0, function* () {
tenant = tenant || context.tenant;
let poolKey = providerName + "!" + tenant;
let provider = this.getFromPool(poolKey);
if (provider) {
return provider;
}
else {
provider = context.container.get(providerName, false, annotations_1.LifeTime.Transient);
let item = { provider };
item.dispose = yield provider.initializeTenantAsync(tenant);
if (item.dispose) {
this.addToPool(poolKey, item);
}
}
return provider;
});
}
};
ProviderFactory = __decorate([
annotations_1.Injectable(annotations_1.LifeTime.Singleton, annotations_2.DefaultServiceNames.ProviderFactory),
__metadata("design:paramtypes", [Object])
], ProviderFactory);
exports.ProviderFactory = ProviderFactory;
//# sourceMappingURL=providerFactory.js.map
;