vulcain-corejs
Version:
Vulcain micro-service framework
76 lines (74 loc) • 2.74 kB
JavaScript
"use strict";
const rx = require('rx');
class ChainedDynamicProperty {
constructor(manager, properties, defaultValue) {
this.disposed = false;
if (properties.length < 2)
throw new Error("You must provided at least 2 properties.");
this._propertyChanged = new rx.Subject();
this._propertiesManager = manager;
this._defaultValue = defaultValue;
this._fallbackProperties = properties;
// subscribe to changes
this._reset = this.reset.bind(this);
manager.propertyChanged.subscribe(this._reset);
this.reset();
}
get propertyChanged() {
return this._propertyChanged;
}
get name() {
return this._fallbackProperties[0];
}
// One chained property has changed
reset() {
let old = this._activeProperty;
let tmp;
for (var propertyName of this._fallbackProperties) {
tmp = this._propertiesManager.getProperty(propertyName);
if (tmp) {
break;
}
}
this._activeProperty = tmp;
if (old !== this._activeProperty) {
this.onPropertyChanged();
}
}
onPropertyChanged() {
this._propertyChanged.onNext(this);
this._propertiesManager.onPropertyChanged(this, "changed");
}
/// <summary>
/// Current value
/// </summary>
get value() {
if (this.disposed)
throw new Error("Can not use a disposed property. Do you have call DynamicProperties.reset() ?");
return this._activeProperty ? this._activeProperty.value : this._defaultValue;
}
/// <summary>
/// Update default property value. This value can be overrided by a <see cref="IConfigurationSource"/>.
/// Doesn't update source values.
/// Assigning a value as precedence on all overriding properties
/// Only the main property has precedence so others are ignored
/// </summary>
/// <param name="value">Property value</param>
set(value) {
if (this.disposed)
throw new Error("Can not use a disposed property. Do you have call DynamicProperties.reset() ?");
this._defaultValue = value;
// Assigning a value as precedence on all overriding properties
// Only the main property (the first) has precedence so ignore other one
this._fallbackProperties = [this._fallbackProperties[0]];
this.reset();
}
dispose() {
this.disposed = true;
this.onPropertyChanged();
this._propertyChanged.dispose();
this._propertyChanged = new rx.Subject();
}
}
exports.ChainedDynamicProperty = ChainedDynamicProperty;
//# sourceMappingURL=chainedDynamicProperty.js.map