vulcain-corejs
Version:
Vulcain micro-service framework
54 lines • 1.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const system_1 = require("../../globals/system");
const provider_1 = require("./provider");
class MemoryProviderFactory {
constructor(dataFolder, maxPoolSize = 20) {
this.dataFolder = dataFolder;
this.maxPoolSize = maxPoolSize;
this.pool = new Map();
}
addToPool(context, key, item) {
system_1.Service.log.info(context, () => `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.Service.log.info(context, () => `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;
}
}
getConnection(context, tenant) {
tenant = tenant || context.user.tenant;
let poolKey = tenant;
let provider = this.getFromPool(poolKey);
if (!provider) {
provider = new provider_1.MemoryProvider(this.dataFolder);
let item = { provider };
item.dispose = provider.initialize(tenant);
if (item.dispose) {
this.addToPool(context, poolKey, item);
}
}
return provider;
}
}
exports.MemoryProviderFactory = MemoryProviderFactory;
//# sourceMappingURL=providerFactory.js.map