@orbit/coordinator
Version:
A coordinator and set of coordination strategies for managing data flow and keeping @orbit/data sources in sync.
132 lines • 16.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Coordinator = exports.LogLevel = void 0;
const core_1 = require("@orbit/core");
const utils_1 = require("@orbit/utils");
const { assert } = core_1.Orbit;
var LogLevel;
(function (LogLevel) {
LogLevel[LogLevel["None"] = 0] = "None";
LogLevel[LogLevel["Errors"] = 1] = "Errors";
LogLevel[LogLevel["Warnings"] = 2] = "Warnings";
LogLevel[LogLevel["Info"] = 3] = "Info";
})(LogLevel = exports.LogLevel || (exports.LogLevel = {}));
/**
* The Coordinator class manages a set of sources to which it applies a set of
* coordination strategies.
*/
class Coordinator {
constructor(options = {}) {
this._sources = {};
this._strategies = {};
if (options.sources) {
options.sources.forEach((source) => this.addSource(source));
}
if (options.strategies) {
options.strategies.forEach((strategy) => this.addStrategy(strategy));
}
this._defaultActivationOptions = options.defaultActivationOptions || {};
if (this._defaultActivationOptions.logLevel === undefined) {
this._defaultActivationOptions.logLevel = LogLevel.Info;
}
}
addSource(source) {
const name = source.name;
if (name) {
assert(`A source named '${name}' has already been added to this coordinator.`, !this._sources[name]);
assert(`A coordinator's sources can not be changed while it is active.`, !this._activated);
this._sources[name] = source;
}
else {
assert(`Sources require a 'name' to be added to a coordinator.`, !!name);
}
}
removeSource(name) {
let source = this._sources[name];
assert(`Source '${name}' has not been added to this coordinator.`, !!source);
assert(`A coordinator's sources can not be changed while it is active.`, !this._activated);
delete this._sources[name];
}
getSource(name) {
return this._sources[name];
}
get sources() {
return (0, utils_1.objectValues)(this._sources);
}
get sourceNames() {
return Object.keys(this._sources);
}
addStrategy(strategy) {
const name = strategy.name;
assert(`A strategy named '${name}' has already been added to this coordinator.`, !this._strategies[name]);
assert(`A coordinator's strategies can not be changed while it is active.`, !this._activated);
this._strategies[name] = strategy;
}
removeStrategy(name) {
let strategy = this._strategies[name];
assert(`Strategy '${name}' has not been added to this coordinator.`, !!strategy);
assert(`A coordinator's strategies can not be changed while it is active.`, !this._activated);
delete this._strategies[name];
}
getStrategy(name) {
return this._strategies[name];
}
get strategies() {
return (0, utils_1.objectValues)(this._strategies);
}
get strategyNames() {
return Object.keys(this._strategies);
}
get activated() {
return this._activated;
}
async activate(options = {}) {
if (!this._activated) {
this._activated = this._activate(options);
}
await this._activated;
}
async deactivate() {
if (this._activated) {
await this._activated;
await this._deactivate();
}
this._activated = undefined;
}
async _activate(options = {}) {
if (options.logLevel === undefined) {
options.logLevel = this._defaultActivationOptions.logLevel;
}
this._currentActivationOptions = options;
for (let strategy of this.strategies) {
await strategy.activate(this, options);
}
for (let strategy of this.strategies) {
await strategy.beforeSourceActivation();
}
for (let source of this.sources) {
await source.activate();
}
for (let strategy of this.strategies) {
await strategy.afterSourceActivation();
}
}
async _deactivate() {
const strategies = this.strategies.reverse();
const sources = this.sources.reverse();
for (let strategy of strategies) {
await strategy.beforeSourceDeactivation();
}
for (let source of sources) {
await source.deactivate();
}
for (let strategy of strategies) {
await strategy.afterSourceDeactivation();
}
for (let strategy of strategies) {
await strategy.deactivate();
}
}
}
exports.Coordinator = Coordinator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29vcmRpbmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29vcmRpbmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0NBQW9DO0FBRXBDLHdDQUFrRDtBQUdsRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsWUFBSyxDQUFDO0FBUXpCLElBQVksUUFLWDtBQUxELFdBQVksUUFBUTtJQUNsQix1Q0FBSSxDQUFBO0lBQ0osMkNBQU0sQ0FBQTtJQUNOLCtDQUFRLENBQUE7SUFDUix1Q0FBSSxDQUFBO0FBQ04sQ0FBQyxFQUxXLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBS25CO0FBTUQ7OztHQUdHO0FBQ0gsTUFBYSxXQUFXO0lBT3RCLFlBQVksVUFBOEIsRUFBRTtRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUV0QixJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDbkIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUM3RDtRQUVELElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRTtZQUN0QixPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsSUFBSSxFQUFFLENBQUM7UUFFeEUsSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUN6RCxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDekQ7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T0FBTyxFQUFFLENBQUM7UUFFdkMsS0FBSyxJQUFJLFFBQVEsSUFBSSxVQUFVLEVBQUU7WUFDL0IsTUFBTSxRQUFRLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztTQUMzQztRQUVELEtBQUssSUFBSSxNQUFNLElBQUksT0FBTyxFQUFFO1lBQzFCLE1BQU0sTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQzNCO1FBRUQsS0FBSyxJQUFJLFFBQVEsSUFBSSxVQUFVLEVBQUU7WUFDL0IsTUFBTSxRQUFRLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztTQUMxQztRQUVELEtBQUssSUFBSSxRQUFRLElBQUksVUFBVSxFQUFFO1lBQy9CLE1BQU0sUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztDQUNGO0FBaExELGtDQWdMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9yYml0IH0gZnJvbSAnQG9yYml0L2NvcmUnO1xuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnQG9yYml0L2RhdGEnO1xuaW1wb3J0IHsgRGljdCwgb2JqZWN0VmFsdWVzIH0gZnJvbSAnQG9yYml0L3V0aWxzJztcbmltcG9ydCB7IFN0cmF0ZWd5IH0gZnJvbSAnLi9zdHJhdGVneSc7XG5cbmNvbnN0IHsgYXNzZXJ0IH0gPSBPcmJpdDtcblxuZXhwb3J0IGludGVyZmFjZSBDb29yZGluYXRvck9wdGlvbnMge1xuICBzb3VyY2VzPzogU291cmNlW107XG4gIHN0cmF0ZWdpZXM/OiBTdHJhdGVneVtdO1xuICBkZWZhdWx0QWN0aXZhdGlvbk9wdGlvbnM/OiBBY3RpdmF0aW9uT3B0aW9ucztcbn1cblxuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICBOb25lLFxuICBFcnJvcnMsXG4gIFdhcm5pbmdzLFxuICBJbmZvXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZhdGlvbk9wdGlvbnMge1xuICBsb2dMZXZlbD86IExvZ0xldmVsO1xufVxuXG4vKipcbiAqIFRoZSBDb29yZGluYXRvciBjbGFzcyBtYW5hZ2VzIGEgc2V0IG9mIHNvdXJjZXMgdG8gd2hpY2ggaXQgYXBwbGllcyBhIHNldCBvZlxuICogY29vcmRpbmF0aW9uIHN0cmF0ZWdpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb29yZGluYXRvciB7XG4gIHByb3RlY3RlZCBfc291cmNlczogRGljdDxTb3VyY2U+O1xuICBwcm90ZWN0ZWQgX3N0cmF0ZWdpZXM6IERpY3Q8U3RyYXRlZ3k+O1xuICBwcm90ZWN0ZWQgX2FjdGl2YXRlZD86IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBfZGVmYXVsdEFjdGl2YXRpb25PcHRpb25zOiBBY3RpdmF0aW9uT3B0aW9ucztcbiAgcHJvdGVjdGVkIF9jdXJyZW50QWN0aXZhdGlvbk9wdGlvbnM/OiBBY3RpdmF0aW9uT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb29yZGluYXRvck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuX3NvdXJjZXMgPSB7fTtcbiAgICB0aGlzLl9zdHJhdGVnaWVzID0ge307XG5cbiAgICBpZiAob3B0aW9ucy5zb3VyY2VzKSB7XG4gICAgICBvcHRpb25zLnNvdXJjZXMuZm9yRWFjaCgoc291cmNlKSA9PiB0aGlzLmFkZFNvdXJjZShzb3VyY2UpKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zdHJhdGVnaWVzKSB7XG4gICAgICBvcHRpb25zLnN0cmF0ZWdpZXMuZm9yRWFjaCgoc3RyYXRlZ3kpID0+IHRoaXMuYWRkU3RyYXRlZ3koc3RyYXRlZ3kpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWZhdWx0QWN0aXZhdGlvbk9wdGlvbnMgPSBvcHRpb25zLmRlZmF1bHRBY3RpdmF0aW9uT3B0aW9ucyB8fCB7fTtcblxuICAgIGlmICh0aGlzLl9kZWZhdWx0QWN0aXZhdGlvbk9wdGlvbnMubG9nTGV2ZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZGVmYXVsdEFjdGl2YXRpb25PcHRpb25zLmxvZ0xldmVsID0gTG9nTGV2ZWwuSW5mbztcbiAgICB9XG4gIH1cblxuICBhZGRTb3VyY2Uoc291cmNlOiBTb3VyY2UpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gc291cmNlLm5hbWU7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgYEEgc291cmNlIG5hbWVkICcke25hbWV9JyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoaXMgY29vcmRpbmF0b3IuYCxcbiAgICAgICAgIXRoaXMuX3NvdXJjZXNbbmFtZV1cbiAgICAgICk7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGBBIGNvb3JkaW5hdG9yJ3Mgc291cmNlcyBjYW4gbm90IGJlIGNoYW5nZWQgd2hpbGUgaXQgaXMgYWN0aXZlLmAsXG4gICAgICAgICF0aGlzLl9hY3RpdmF0ZWRcbiAgICAgICk7XG4gICAgICB0aGlzLl9zb3VyY2VzW25hbWVdID0gc291cmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoYFNvdXJjZXMgcmVxdWlyZSBhICduYW1lJyB0byBiZSBhZGRlZCB0byBhIGNvb3JkaW5hdG9yLmAsICEhbmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlU291cmNlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzW25hbWVdO1xuXG4gICAgYXNzZXJ0KFxuICAgICAgYFNvdXJjZSAnJHtuYW1lfScgaGFzIG5vdCBiZWVuIGFkZGVkIHRvIHRoaXMgY29vcmRpbmF0b3IuYCxcbiAgICAgICEhc291cmNlXG4gICAgKTtcbiAgICBhc3NlcnQoXG4gICAgICBgQSBjb29yZGluYXRvcidzIHNvdXJjZXMgY2FuIG5vdCBiZSBjaGFuZ2VkIHdoaWxlIGl0IGlzIGFjdGl2ZS5gLFxuICAgICAgIXRoaXMuX2FjdGl2YXRlZFxuICAgICk7XG5cbiAgICBkZWxldGUgdGhpcy5fc291cmNlc1tuYW1lXTtcbiAgfVxuXG4gIGdldFNvdXJjZTxUIGV4dGVuZHMgU291cmNlID0gU291cmNlPihuYW1lOiBzdHJpbmcpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlc1tuYW1lXSBhcyBUO1xuICB9XG5cbiAgZ2V0IHNvdXJjZXMoKTogU291cmNlW10ge1xuICAgIHJldHVybiBvYmplY3RWYWx1ZXModGhpcy5fc291cmNlcyk7XG4gIH1cblxuICBnZXQgc291cmNlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzKTtcbiAgfVxuXG4gIGFkZFN0cmF0ZWd5KHN0cmF0ZWd5OiBTdHJhdGVneSk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWUgPSBzdHJhdGVneS5uYW1lO1xuXG4gICAgYXNzZXJ0KFxuICAgICAgYEEgc3RyYXRlZ3kgbmFtZWQgJyR7bmFtZX0nIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhpcyBjb29yZGluYXRvci5gLFxuICAgICAgIXRoaXMuX3N0cmF0ZWdpZXNbbmFtZV1cbiAgICApO1xuICAgIGFzc2VydChcbiAgICAgIGBBIGNvb3JkaW5hdG9yJ3Mgc3RyYXRlZ2llcyBjYW4gbm90IGJlIGNoYW5nZWQgd2hpbGUgaXQgaXMgYWN0aXZlLmAsXG4gICAgICAhdGhpcy5fYWN0aXZhdGVkXG4gICAgKTtcblxuICAgIHRoaXMuX3N0cmF0ZWdpZXNbbmFtZV0gPSBzdHJhdGVneTtcbiAgfVxuXG4gIHJlbW92ZVN0cmF0ZWd5KG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBzdHJhdGVneSA9IHRoaXMuX3N0cmF0ZWdpZXNbbmFtZV07XG5cbiAgICBhc3NlcnQoXG4gICAgICBgU3RyYXRlZ3kgJyR7bmFtZX0nIGhhcyBub3QgYmVlbiBhZGRlZCB0byB0aGlzIGNvb3JkaW5hdG9yLmAsXG4gICAgICAhIXN0cmF0ZWd5XG4gICAgKTtcbiAgICBhc3NlcnQoXG4gICAgICBgQSBjb29yZGluYXRvcidzIHN0cmF0ZWdpZXMgY2FuIG5vdCBiZSBjaGFuZ2VkIHdoaWxlIGl0IGlzIGFjdGl2ZS5gLFxuICAgICAgIXRoaXMuX2FjdGl2YXRlZFxuICAgICk7XG5cbiAgICBkZWxldGUgdGhpcy5fc3RyYXRlZ2llc1tuYW1lXTtcbiAgfVxuXG4gIGdldFN0cmF0ZWd5PFQgZXh0ZW5kcyBTdHJhdGVneSA9IFN0cmF0ZWd5PihuYW1lOiBzdHJpbmcpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyYXRlZ2llc1tuYW1lXSBhcyBUO1xuICB9XG5cbiAgZ2V0IHN0cmF0ZWdpZXMoKTogU3RyYXRlZ3lbXSB7XG4gICAgcmV0dXJuIG9iamVjdFZhbHVlcyh0aGlzLl9zdHJhdGVnaWVzKTtcbiAgfVxuXG4gIGdldCBzdHJhdGVneU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fc3RyYXRlZ2llcyk7XG4gIH1cblxuICBnZXQgYWN0aXZhdGVkKCk6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmF0ZWQ7XG4gIH1cblxuICBhc3luYyBhY3RpdmF0ZShvcHRpb25zOiBBY3RpdmF0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmF0ZWQpIHtcbiAgICAgIHRoaXMuX2FjdGl2YXRlZCA9IHRoaXMuX2FjdGl2YXRlKG9wdGlvbnMpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLl9hY3RpdmF0ZWQ7XG4gIH1cblxuICBhc3luYyBkZWFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmF0ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2FjdGl2YXRlZDtcbiAgICAgIGF3YWl0IHRoaXMuX2RlYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9hY3RpdmF0ZWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX2FjdGl2YXRlKG9wdGlvbnM6IEFjdGl2YXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5sb2dMZXZlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25zLmxvZ0xldmVsID0gdGhpcy5fZGVmYXVsdEFjdGl2YXRpb25PcHRpb25zLmxvZ0xldmVsO1xuICAgIH1cblxuICAgIHRoaXMuX2N1cnJlbnRBY3RpdmF0aW9uT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBmb3IgKGxldCBzdHJhdGVneSBvZiB0aGlzLnN0cmF0ZWdpZXMpIHtcbiAgICAgIGF3YWl0IHN0cmF0ZWd5LmFjdGl2YXRlKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGZvciAobGV0IHN0cmF0ZWd5IG9mIHRoaXMuc3RyYXRlZ2llcykge1xuICAgICAgYXdhaXQgc3RyYXRlZ3kuYmVmb3JlU291cmNlQWN0aXZhdGlvbigpO1xuICAgIH1cblxuICAgIGZvciAobGV0IHNvdXJjZSBvZiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgIGF3YWl0IHNvdXJjZS5hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIGZvciAobGV0IHN0cmF0ZWd5IG9mIHRoaXMuc3RyYXRlZ2llcykge1xuICAgICAgYXdhaXQgc3RyYXRlZ3kuYWZ0ZXJTb3VyY2VBY3RpdmF0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9kZWFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0cmF0ZWdpZXMgPSB0aGlzLnN0cmF0ZWdpZXMucmV2ZXJzZSgpO1xuICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLnNvdXJjZXMucmV2ZXJzZSgpO1xuXG4gICAgZm9yIChsZXQgc3RyYXRlZ3kgb2Ygc3RyYXRlZ2llcykge1xuICAgICAgYXdhaXQgc3RyYXRlZ3kuYmVmb3JlU291cmNlRGVhY3RpdmF0aW9uKCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgIGF3YWl0IHNvdXJjZS5kZWFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgc3RyYXRlZ3kgb2Ygc3RyYXRlZ2llcykge1xuICAgICAgYXdhaXQgc3RyYXRlZ3kuYWZ0ZXJTb3VyY2VEZWFjdGl2YXRpb24oKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBzdHJhdGVneSBvZiBzdHJhdGVnaWVzKSB7XG4gICAgICBhd2FpdCBzdHJhdGVneS5kZWFjdGl2YXRlKCk7XG4gICAgfVxuICB9XG59XG4iXX0=