vulcain-corejs
Version:
Vulcain micro-service framework
115 lines • 4.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const configurationManager_1 = require("./configurationManager");
const configurationSourceBuilder_1 = require("./configurationSourceBuilder");
const system_1 = require("../globals/system");
/**
*
* Provides dynamic properties updated when config change.
* Accessing a dynamic property is very fast. The last value is cached and updated on the fly
* from a <b>ConfigurationSource</b> at fixed interval.
* Updates are made using polling requests on a list of sources.
* <p>
* Dynamic properties are read only. You can set a value but it will be valid only as a default value.
* </p>
* <code>
* DynamicConfiguration.init().addRest("http....").startPolling();
* let i:number = DynamicConfiguration.getProperty("prop1");
* let i2:number = DynamicConfiguration.getOrDefaultProperty("prop1", 1);
* </code>
*/
class DynamicConfiguration {
/**
* subscribe for a global property changed
*/
static get propertyChanged() {
return DynamicConfiguration.manager.propertyChanged;
}
/**
* Get a property
*/
static getProperty(name, value) {
let p = DynamicConfiguration.manager.getProperty(name);
if (!p) {
p = DynamicConfiguration.manager.createDynamicProperty(name, value);
}
return p;
}
static getChainedProperty(name, defaultValue, ...fallbackPropertyNames) {
let p = DynamicConfiguration.manager.getProperty(name);
if (!p) {
p = DynamicConfiguration.manager.createChainedDynamicProperty(name, fallbackPropertyNames, defaultValue);
}
return p;
}
/**
* get a chained property for the current service.
* Properties chain is: service.version.name->service.name->domain.name->name
* @param name property name
* @param defaultValue
* @returns {IDynamicProperty<T>}
*/
static getChainedConfigurationProperty(name, defaultValue, commandName) {
let fullName = commandName ? commandName + "." + name : name;
let p = DynamicConfiguration.manager.getProperty(fullName);
if (p)
return p;
let chain = [
system_1.Service.serviceName + "." + system_1.Service.serviceVersion + "." + fullName,
system_1.Service.serviceName + "." + fullName,
];
if (commandName) {
chain.push(fullName);
}
if (system_1.Service.domainName)
chain.push(system_1.Service.domainName + "." + fullName);
chain.push(name);
return DynamicConfiguration.getChainedProperty(fullName, defaultValue, ...chain);
}
/**
* Get a property value by name
*
* @static
* @template T
* @param {string} name
* @returns
*
* @memberOf DynamicConfiguration
*/
static getPropertyValue(name) {
let p = this.getProperty(name);
return p.value;
}
/// <summary>
/// Initialize dynamic properties configuration. Can be call only once and before any call to DynamicProperties.instance.
/// </summary>
/// <param name="pollingIntervalInSeconds">Polling interval in seconds (default 60)</param>
/// <param name="sourceTimeoutInMs">Max time allowed to a source to retrieve new values (Cancel the request but doesn't raise an error)</param>
/// <returns>ConfigurationSourceBuilder</returns>
static init(pollingIntervalInSeconds, sourceTimeoutInMs) {
if (pollingIntervalInSeconds)
DynamicConfiguration.manager.pollingIntervalInSeconds = pollingIntervalInSeconds;
if (sourceTimeoutInMs)
DynamicConfiguration.manager.sourceTimeoutInMs = sourceTimeoutInMs;
if (!DynamicConfiguration._builder) {
DynamicConfiguration._builder = new configurationSourceBuilder_1.ConfigurationSourceBuilder(DynamicConfiguration.manager);
}
return DynamicConfiguration._builder;
}
/**
*
* @param pollingIntervalInSeconds For test only
*/
static reset(pollingIntervalInSeconds) {
DynamicConfiguration.manager = new configurationManager_1.ConfigurationManager();
if (pollingIntervalInSeconds)
DynamicConfiguration.manager.pollingIntervalInSeconds = pollingIntervalInSeconds;
return DynamicConfiguration.manager;
}
}
/**
* For test only - Do not use directly
*/
DynamicConfiguration.manager = new configurationManager_1.ConfigurationManager();
exports.DynamicConfiguration = DynamicConfiguration;
//# sourceMappingURL=dynamicConfiguration.js.map