@orbit/coordinator
Version:
A coordinator and set of coordination strategies for managing data flow and keeping @orbit/data sources in sync.
126 lines • 16.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventLoggingStrategy = void 0;
const coordinator_1 = require("../coordinator");
const strategy_1 = require("../strategy");
const data_1 = require("@orbit/data");
const utils_1 = require("@orbit/utils");
class EventLoggingStrategy extends strategy_1.Strategy {
constructor(options = {}) {
super({
...options,
name: options.name || 'event-logging'
});
this._events = options.events;
this._interfaces = options.interfaces;
this._logPrefix = options.logPrefix || '[source-event]';
}
async activate(coordinator, options = {}) {
await super.activate(coordinator, options);
this._eventListeners = {};
this._sources.forEach((source) => this._activateSource(source));
}
async deactivate() {
await super.deactivate();
this._sources.forEach((source) => this._deactivateSource(source));
this._eventListeners = undefined;
}
_activateSource(source) {
this._sourceEvents(source).forEach((event) => {
this._addListener(source, event);
});
}
_deactivateSource(source) {
this._sourceEvents(source).forEach((event) => {
this._removeListener(source, event);
});
}
_sourceEvents(source) {
if (this._events) {
return this._events;
}
else {
let events = [];
let interfaces = this._interfaces || this._sourceInterfaces(source);
interfaces.forEach((i) => {
Array.prototype.push.apply(events, this._interfaceEvents(i));
});
return events;
}
}
_sourceInterfaces(source) {
let interfaces = ['transformable'];
if ((0, data_1.isPullable)(source)) {
interfaces.push('pullable');
}
if ((0, data_1.isPushable)(source)) {
interfaces.push('pushable');
}
if ((0, data_1.isQueryable)(source)) {
interfaces.push('queryable');
}
if ((0, data_1.isSyncable)(source)) {
interfaces.push('syncable');
}
if ((0, data_1.isUpdatable)(source)) {
interfaces.push('updatable');
}
return interfaces;
}
_interfaceEvents(interfaceName) {
if (this._logLevel === coordinator_1.LogLevel.Info) {
switch (interfaceName) {
case 'pullable':
return ['beforePull', 'pull', 'pullFail'];
case 'pushable':
return ['beforePush', 'push', 'pushFail'];
case 'queryable':
return ['beforeQuery', 'query', 'queryFail'];
case 'updatable':
return ['beforeUpdate', 'update', 'updateFail'];
case 'syncable':
return ['beforeSync', 'sync', 'syncFail'];
case 'transformable':
return ['transform'];
}
}
else if (this._logLevel !== undefined && this._logLevel > coordinator_1.LogLevel.None) {
switch (interfaceName) {
case 'pullable':
return ['pullFail'];
case 'pushable':
return ['pushFail'];
case 'queryable':
return ['queryFail'];
case 'syncable':
return ['syncFail'];
case 'updatable':
return ['updateFail'];
}
}
return [];
}
_addListener(source, event) {
const listener = this._generateListener(source, event);
const sourceName = this.getSourceName(source);
(0, utils_1.deepSet)(this._eventListeners, [sourceName, event], listener);
source.on(event, listener);
}
_removeListener(source, event) {
const sourceName = this.getSourceName(source);
const listener = (0, utils_1.deepGet)(this._eventListeners, [
sourceName,
event
]);
source.off(event, listener);
(0, utils_1.deepSet)(this._eventListeners, [sourceName, event], undefined);
}
_generateListener(source, event) {
const sourceName = this.getSourceName(source);
return (...args) => {
console.log(this._logPrefix, sourceName, event, ...args);
};
}
}
exports.EventLoggingStrategy = EventLoggingStrategy;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbG9nZ2luZy1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdHJhdGVnaWVzL2V2ZW50LWxvZ2dpbmctc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQTBFO0FBQzFFLDBDQUF3RDtBQUV4RCxzQ0FPcUI7QUFDckIsd0NBQXNEO0FBU3RELE1BQWEsb0JBQXFCLFNBQVEsbUJBQVE7SUFLaEQsWUFBWSxVQUF1QyxFQUFFO1FBQ25ELEtBQUssQ0FBQztZQUNKLEdBQUcsT0FBTztZQUNWLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLGVBQWU7U0FDdEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksZ0JBQWdCLENBQUM7SUFDMUQsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQ1osV0FBd0IsRUFDeEIsVUFBNkIsRUFBRTtRQUUvQixNQUFNLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVO1FBQ2QsTUFBTSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENB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QUFDO1FBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUIsSUFBQSxlQUFPLEVBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRVMsaUJBQWlCLENBQUMsTUFBYyxFQUFFLEtBQWE7UUFDdkQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRTtZQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXRJRCxvREFzSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb29yZGluYXRvciwgQWN0aXZhdGlvbk9wdGlvbnMsIExvZ0xldmVsIH0gZnJvbSAnLi4vY29vcmRpbmF0b3InO1xuaW1wb3J0IHsgU3RyYXRlZ3ksIFN0cmF0ZWd5T3B0aW9ucyB9IGZyb20gJy4uL3N0cmF0ZWd5JztcbmltcG9ydCB7IExpc3RlbmVyIH0gZnJvbSAnQG9yYml0L2NvcmUnO1xuaW1wb3J0IHtcbiAgU291cmNlLFxuICBpc1B1bGxhYmxlLFxuICBpc1B1c2hhYmxlLFxuICBpc1F1ZXJ5YWJsZSxcbiAgaXNTeW5jYWJsZSxcbiAgaXNVcGRhdGFibGVcbn0gZnJvbSAnQG9yYml0L2RhdGEnO1xuaW1wb3J0IHsgRGljdCwgZGVlcEdldCwgZGVlcFNldCB9IGZyb20gJ0BvcmJpdC91dGlscyc7XG5cbmRlY2xhcmUgY29uc3QgY29uc29sZTogYW55O1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50TG9nZ2luZ1N0cmF0ZWd5T3B0aW9ucyBleHRlbmRzIFN0cmF0ZWd5T3B0aW9ucyB7XG4gIGV2ZW50cz86IHN0cmluZ1tdO1xuICBpbnRlcmZhY2VzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudExvZ2dpbmdTdHJhdGVneSBleHRlbmRzIFN0cmF0ZWd5IHtcbiAgcHJvdGVjdGVkIF9ldmVudHM/OiBzdHJpbmdbXTtcbiAgcHJvdGVjdGVkIF9pbnRlcmZhY2VzPzogc3RyaW5nW107XG4gIHByb3RlY3RlZCBfZXZlbnRMaXN0ZW5lcnM/OiBEaWN0PERpY3Q8TGlzdGVuZXI+PjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFdmVudExvZ2dpbmdTdHJhdGVneU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBuYW1lOiBvcHRpb25zLm5hbWUgfHwgJ2V2ZW50LWxvZ2dpbmcnXG4gICAgfSk7XG5cbiAgICB0aGlzLl9ldmVudHMgPSBvcHRpb25zLmV2ZW50cztcbiAgICB0aGlzLl9pbnRlcmZhY2VzID0gb3B0aW9ucy5pbnRlcmZhY2VzO1xuICAgIHRoaXMuX2xvZ1ByZWZpeCA9IG9wdGlvbnMubG9nUHJlZml4IHx8ICdbc291cmNlLWV2ZW50XSc7XG4gIH1cblxuICBhc3luYyBhY3RpdmF0ZShcbiAgICBjb29yZGluYXRvcjogQ29vcmRpbmF0b3IsXG4gICAgb3B0aW9uczogQWN0aXZhdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzdXBlci5hY3RpdmF0ZShjb29yZGluYXRvciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgICB0aGlzLl9zb3VyY2VzLmZvckVhY2goKHNvdXJjZSkgPT4gdGhpcy5fYWN0aXZhdGVTb3VyY2Uoc291cmNlKSk7XG4gIH1cblxuICBhc3luYyBkZWFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLmRlYWN0aXZhdGUoKTtcbiAgICB0aGlzLl9zb3VyY2VzLmZvckVhY2goKHNvdXJjZSkgPT4gdGhpcy5fZGVhY3RpdmF0ZVNvdXJjZShzb3VyY2UpKTtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVycyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfYWN0aXZhdGVTb3VyY2Uoc291cmNlOiBTb3VyY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9zb3VyY2VFdmVudHMoc291cmNlKS5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgdGhpcy5fYWRkTGlzdGVuZXIoc291cmNlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2RlYWN0aXZhdGVTb3VyY2Uoc291cmNlOiBTb3VyY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9zb3VyY2VFdmVudHMoc291cmNlKS5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXIoc291cmNlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NvdXJjZUV2ZW50cyhzb3VyY2U6IFNvdXJjZSk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5fZXZlbnRzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXZlbnRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZXZlbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IGludGVyZmFjZXMgPSB0aGlzLl9pbnRlcmZhY2VzIHx8IHRoaXMuX3NvdXJjZUludGVyZmFjZXMoc291cmNlKTtcblxuICAgICAgaW50ZXJmYWNlcy5mb3JFYWNoKChpKSA9PiB7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGV2ZW50cywgdGhpcy5faW50ZXJmYWNlRXZlbnRzKGkpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZXZlbnRzO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfc291cmNlSW50ZXJmYWNlcyhzb3VyY2U6IFNvdXJjZSk6IHN0cmluZ1tdIHtcbiAgICBsZXQgaW50ZXJmYWNlcyA9IFsndHJhbnNmb3JtYWJsZSddO1xuICAgIGlmIChpc1B1bGxhYmxlKHNvdXJjZSkpIHtcbiAgICAgIGludGVyZmFjZXMucHVzaCgncHVsbGFibGUnKTtcbiAgICB9XG4gICAgaWYgKGlzUHVzaGFibGUoc291cmNlKSkge1xuICAgICAgaW50ZXJmYWNlcy5wdXNoKCdwdXNoYWJsZScpO1xuICAgIH1cbiAgICBpZiAoaXNRdWVyeWFibGUoc291cmNlKSkge1xuICAgICAgaW50ZXJmYWNlcy5wdXNoKCdxdWVyeWFibGUnKTtcbiAgICB9XG4gICAgaWYgKGlzU3luY2FibGUoc291cmNlKSkge1xuICAgICAgaW50ZXJmYWNlcy5wdXNoKCdzeW5jYWJsZScpO1xuICAgIH1cbiAgICBpZiAoaXNVcGRhdGFibGUoc291cmNlKSkge1xuICAgICAgaW50ZXJmYWNlcy5wdXNoKCd1cGRhdGFibGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGludGVyZmFjZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2ludGVyZmFjZUV2ZW50cyhpbnRlcmZhY2VOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsID09PSBMb2dMZXZlbC5JbmZvKSB7XG4gICAgICBzd2l0Y2ggKGludGVyZmFjZU5hbWUpIHtcbiAgICAgICAgY2FzZSAncHVsbGFibGUnOlxuICAgICAgICAgIHJldHVybiBbJ2JlZm9yZVB1bGwnLCAncHVsbCcsICdwdWxsRmFpbCddO1xuICAgICAgICBjYXNlICdwdXNoYWJsZSc6XG4gICAgICAgICAgcmV0dXJuIFsnYmVmb3JlUHVzaCcsICdwdXNoJywgJ3B1c2hGYWlsJ107XG4gICAgICAgIGNhc2UgJ3F1ZXJ5YWJsZSc6XG4gICAgICAgICAgcmV0dXJuIFsnYmVmb3JlUXVlcnknLCAncXVlcnknLCAncXVlcnlGYWlsJ107XG4gICAgICAgIGNhc2UgJ3VwZGF0YWJsZSc6XG4gICAgICAgICAgcmV0dXJuIFsnYmVmb3JlVXBkYXRlJywgJ3VwZGF0ZScsICd1cGRhdGVGYWlsJ107XG4gICAgICAgIGNhc2UgJ3N5bmNhYmxlJzpcbiAgICAgICAgICByZXR1cm4gWydiZWZvcmVTeW5jJywgJ3N5bmMnLCAnc3luY0ZhaWwnXTtcbiAgICAgICAgY2FzZSAndHJhbnNmb3JtYWJsZSc6XG4gICAgICAgICAgcmV0dXJuIFsndHJhbnNmb3JtJ107XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLl9sb2dMZXZlbCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX2xvZ0xldmVsID4gTG9nTGV2ZWwuTm9uZSkge1xuICAgICAgc3dpdGNoIChpbnRlcmZhY2VOYW1lKSB7XG4gICAgICAgIGNhc2UgJ3B1bGxhYmxlJzpcbiAgICAgICAgICByZXR1cm4gWydwdWxsRmFpbCddO1xuICAgICAgICBjYXNlICdwdXNoYWJsZSc6XG4gICAgICAgICAgcmV0dXJuIFsncHVzaEZhaWwnXTtcbiAgICAgICAgY2FzZSAncXVlcnlhYmxlJzpcbiAgICAgICAgICByZXR1cm4gWydxdWVyeUZhaWwnXTtcbiAgICAgICAgY2FzZSAnc3luY2FibGUnOlxuICAgICAgICAgIHJldHVybiBbJ3N5bmNGYWlsJ107XG4gICAgICAgIGNhc2UgJ3VwZGF0YWJsZSc6XG4gICAgICAgICAgcmV0dXJuIFsndXBkYXRlRmFpbCddO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwcm90ZWN0ZWQgX2FkZExpc3RlbmVyKHNvdXJjZTogU291cmNlLCBldmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdGVuZXIgPSB0aGlzLl9nZW5lcmF0ZUxpc3RlbmVyKHNvdXJjZSwgZXZlbnQpO1xuICAgIGNvbnN0IHNvdXJjZU5hbWUgPSB0aGlzLmdldFNvdXJjZU5hbWUoc291cmNlKTtcbiAgICBkZWVwU2V0KHRoaXMuX2V2ZW50TGlzdGVuZXJzLCBbc291cmNlTmFtZSwgZXZlbnRdLCBsaXN0ZW5lcik7XG4gICAgc291cmNlLm9uKGV2ZW50LCBsaXN0ZW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3JlbW92ZUxpc3RlbmVyKHNvdXJjZTogU291cmNlLCBldmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuZ2V0U291cmNlTmFtZShzb3VyY2UpO1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZGVlcEdldCh0aGlzLl9ldmVudExpc3RlbmVycywgW1xuICAgICAgc291cmNlTmFtZSxcbiAgICAgIGV2ZW50XG4gICAgXSkgYXMgTGlzdGVuZXI7XG4gICAgc291cmNlLm9mZihldmVudCwgbGlzdGVuZXIpO1xuICAgIGRlZXBTZXQodGhpcy5fZXZlbnRMaXN0ZW5lcnMsIFtzb3VyY2VOYW1lLCBldmVudF0sIHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2dlbmVyYXRlTGlzdGVuZXIoc291cmNlOiBTb3VyY2UsIGV2ZW50OiBzdHJpbmcpOiBMaXN0ZW5lciB7XG4gICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuZ2V0U291cmNlTmFtZShzb3VyY2UpO1xuICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuX2xvZ1ByZWZpeCwgc291cmNlTmFtZSwgZXZlbnQsIC4uLmFyZ3MpO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==