@orbit/coordinator
Version:
A coordinator and set of coordination strategies for managing data flow and keeping @orbit/data sources in sync.
122 lines • 16 kB
JavaScript
import { LogLevel } from '../coordinator';
import { Strategy } from '../strategy';
import { isPullable, isPushable, isQueryable, isSyncable, isUpdatable } from '@orbit/data';
import { deepGet, deepSet } from '@orbit/utils';
export class EventLoggingStrategy extends 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 (isPullable(source)) {
interfaces.push('pullable');
}
if (isPushable(source)) {
interfaces.push('pushable');
}
if (isQueryable(source)) {
interfaces.push('queryable');
}
if (isSyncable(source)) {
interfaces.push('syncable');
}
if (isUpdatable(source)) {
interfaces.push('updatable');
}
return interfaces;
}
_interfaceEvents(interfaceName) {
if (this._logLevel === 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 > 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);
deepSet(this._eventListeners, [sourceName, event], listener);
source.on(event, listener);
}
_removeListener(source, event) {
const sourceName = this.getSourceName(source);
const listener = deepGet(this._eventListeners, [
sourceName,
event
]);
source.off(event, listener);
deepSet(this._eventListeners, [sourceName, event], undefined);
}
_generateListener(source, event) {
const sourceName = this.getSourceName(source);
return (...args) => {
console.log(this._logPrefix, sourceName, event, ...args);
};
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbG9nZ2luZy1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdHJhdGVnaWVzL2V2ZW50LWxvZ2dpbmctc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQyxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsUUFBUSxFQUFtQixNQUFNLGFBQWEsQ0FBQztBQUV4RCxPQUFPLEVBRUwsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsVUFBVSxFQUNWLFdBQVcsRUFDWixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQVEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVN0RCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsUUFBUTtJQUtoRCxZQUFZLFVBQXVDLEVBQUU7UUFDbkQsS0FBSyxDQUFDO1lBQ0osR0FBRyxPQUFPO1lBQ1YsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksZUFBZTtTQUN0QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQztJQUMxRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FDWixXQUF3QixFQUN4QixVQUE2QixFQUFFO1FBRS9CLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFD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VSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDN0MsVUFBVTtZQUNWLEtBQUs7U0FDTixDQUFhLENBQUM7UUFDZixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRVMsaUJBQWlCLENBQUMsTUFBYyxFQUFFLEtBQWE7UUFDdkQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRTtZQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvb3JkaW5hdG9yLCBBY3RpdmF0aW9uT3B0aW9ucywgTG9nTGV2ZWwgfSBmcm9tICcuLi9jb29yZGluYXRvcic7XG5pbXBvcnQgeyBTdHJhdGVneSwgU3RyYXRlZ3lPcHRpb25zIH0gZnJvbSAnLi4vc3RyYXRlZ3knO1xuaW1wb3J0IHsgTGlzdGVuZXIgfSBmcm9tICdAb3JiaXQvY29yZSc7XG5pbXBvcnQge1xuICBTb3VyY2UsXG4gIGlzUHVsbGFibGUsXG4gIGlzUHVzaGFibGUsXG4gIGlzUXVlcnlhYmxlLFxuICBpc1N5bmNhYmxlLFxuICBpc1VwZGF0YWJsZVxufSBmcm9tICdAb3JiaXQvZGF0YSc7XG5pbXBvcnQgeyBEaWN0LCBkZWVwR2V0LCBkZWVwU2V0IH0gZnJvbSAnQG9yYml0L3V0aWxzJztcblxuZGVjbGFyZSBjb25zdCBjb25zb2xlOiBhbnk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRMb2dnaW5nU3RyYXRlZ3lPcHRpb25zIGV4dGVuZHMgU3RyYXRlZ3lPcHRpb25zIHtcbiAgZXZlbnRzPzogc3RyaW5nW107XG4gIGludGVyZmFjZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50TG9nZ2luZ1N0cmF0ZWd5IGV4dGVuZHMgU3RyYXRlZ3kge1xuICBwcm90ZWN0ZWQgX2V2ZW50cz86IHN0cmluZ1tdO1xuICBwcm90ZWN0ZWQgX2ludGVyZmFjZXM/OiBzdHJpbmdbXTtcbiAgcHJvdGVjdGVkIF9ldmVudExpc3RlbmVycz86IERpY3Q8RGljdDxMaXN0ZW5lcj4+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEV2ZW50TG9nZ2luZ1N0cmF0ZWd5T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSB8fCAnZXZlbnQtbG9nZ2luZydcbiAgICB9KTtcblxuICAgIHRoaXMuX2V2ZW50cyA9IG9wdGlvbnMuZXZlbnRzO1xuICAgIHRoaXMuX2ludGVyZmFjZXMgPSBvcHRpb25zLmludGVyZmFjZXM7XG4gICAgdGhpcy5fbG9nUHJlZml4ID0gb3B0aW9ucy5sb2dQcmVmaXggfHwgJ1tzb3VyY2UtZXZlbnRdJztcbiAgfVxuXG4gIGFzeW5jIGFjdGl2YXRlKFxuICAgIGNvb3JkaW5hdG9yOiBDb29yZGluYXRvcixcbiAgICBvcHRpb25zOiBBY3RpdmF0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLmFjdGl2YXRlKGNvb3JkaW5hdG9yLCBvcHRpb25zKTtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVycyA9IHt9O1xuICAgIHRoaXMuX3NvdXJjZXMuZm9yRWFjaCgoc291cmNlKSA9PiB0aGlzLl9hY3RpdmF0ZVNvdXJjZShzb3VyY2UpKTtcbiAgfVxuXG4gIGFzeW5jIGRlYWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuZGVhY3RpdmF0ZSgpO1xuICAgIHRoaXMuX3NvdXJjZXMuZm9yRWFjaCgoc291cmNlKSA9PiB0aGlzLl9kZWFjdGl2YXRlU291cmNlKHNvdXJjZSkpO1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hY3RpdmF0ZVNvdXJjZShzb3VyY2U6IFNvdXJjZSk6IHZvaWQge1xuICAgIHRoaXMuX3NvdXJjZUV2ZW50cyhzb3VyY2UpLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9hZGRMaXN0ZW5lcihzb3VyY2UsIGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZGVhY3RpdmF0ZVNvdXJjZShzb3VyY2U6IFNvdXJjZSk6IHZvaWQge1xuICAgIHRoaXMuX3NvdXJjZUV2ZW50cyhzb3VyY2UpLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcihzb3VyY2UsIGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc291cmNlRXZlbnRzKHNvdXJjZTogU291cmNlKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLl9ldmVudHMpIHtcbiAgICAgIHJldHVybiB0aGlzLl9ldmVudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBldmVudHM6IHN0cmluZ1tdID0gW107XG4gICAgICBsZXQgaW50ZXJmYWNlcyA9IHRoaXMuX2ludGVyZmFjZXMgfHwgdGhpcy5fc291cmNlSW50ZXJmYWNlcyhzb3VyY2UpO1xuXG4gICAgICBpbnRlcmZhY2VzLmZvckVhY2goKGkpID0+IHtcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZXZlbnRzLCB0aGlzLl9pbnRlcmZhY2VFdmVudHMoaSkpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBldmVudHM7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9zb3VyY2VJbnRlcmZhY2VzKHNvdXJjZTogU291cmNlKTogc3RyaW5nW10ge1xuICAgIGxldCBpbnRlcmZhY2VzID0gWyd0cmFuc2Zvcm1hYmxlJ107XG4gICAgaWYgKGlzUHVsbGFibGUoc291cmNlKSkge1xuICAgICAgaW50ZXJmYWNlcy5wdXNoKCdwdWxsYWJsZScpO1xuICAgIH1cbiAgICBpZiAoaXNQdXNoYWJsZShzb3VyY2UpKSB7XG4gICAgICBpbnRlcmZhY2VzLnB1c2goJ3B1c2hhYmxlJyk7XG4gICAgfVxuICAgIGlmIChpc1F1ZXJ5YWJsZShzb3VyY2UpKSB7XG4gICAgICBpbnRlcmZhY2VzLnB1c2goJ3F1ZXJ5YWJsZScpO1xuICAgIH1cbiAgICBpZiAoaXNTeW5jYWJsZShzb3VyY2UpKSB7XG4gICAgICBpbnRlcmZhY2VzLnB1c2goJ3N5bmNhYmxlJyk7XG4gICAgfVxuICAgIGlmIChpc1VwZGF0YWJsZShzb3VyY2UpKSB7XG4gICAgICBpbnRlcmZhY2VzLnB1c2goJ3VwZGF0YWJsZScpO1xuICAgIH1cbiAgICByZXR1cm4gaW50ZXJmYWNlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBfaW50ZXJmYWNlRXZlbnRzKGludGVyZmFjZU5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPT09IExvZ0xldmVsLkluZm8pIHtcbiAgICAgIHN3aXRjaCAoaW50ZXJmYWNlTmFtZSkge1xuICAgICAgICBjYXNlICdwdWxsYWJsZSc6XG4gICAgICAgICAgcmV0dXJuIFsnYmVmb3JlUHVsbCcsICdwdWxsJywgJ3B1bGxGYWlsJ107XG4gICAgICAgIGNhc2UgJ3B1c2hhYmxlJzpcbiAgICAgICAgICByZXR1cm4gWydiZWZvcmVQdXNoJywgJ3B1c2gnLCAncHVzaEZhaWwnXTtcbiAgICAgICAgY2FzZSAncXVlcnlhYmxlJzpcbiAgICAgICAgICByZXR1cm4gWydiZWZvcmVRdWVyeScsICdxdWVyeScsICdxdWVyeUZhaWwnXTtcbiAgICAgICAgY2FzZSAndXBkYXRhYmxlJzpcbiAgICAgICAgICByZXR1cm4gWydiZWZvcmVVcGRhdGUnLCAndXBkYXRlJywgJ3VwZGF0ZUZhaWwnXTtcbiAgICAgICAgY2FzZSAnc3luY2FibGUnOlxuICAgICAgICAgIHJldHVybiBbJ2JlZm9yZVN5bmMnLCAnc3luYycsICdzeW5jRmFpbCddO1xuICAgICAgICBjYXNlICd0cmFuc2Zvcm1hYmxlJzpcbiAgICAgICAgICByZXR1cm4gWyd0cmFuc2Zvcm0nXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX2xvZ0xldmVsICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fbG9nTGV2ZWwgPiBMb2dMZXZlbC5Ob25lKSB7XG4gICAgICBzd2l0Y2ggKGludGVyZmFjZU5hbWUpIHtcbiAgICAgICAgY2FzZSAncHVsbGFibGUnOlxuICAgICAgICAgIHJldHVybiBbJ3B1bGxGYWlsJ107XG4gICAgICAgIGNhc2UgJ3B1c2hhYmxlJzpcbiAgICAgICAgICByZXR1cm4gWydwdXNoRmFpbCddO1xuICAgICAgICBjYXNlICdxdWVyeWFibGUnOlxuICAgICAgICAgIHJldHVybiBbJ3F1ZXJ5RmFpbCddO1xuICAgICAgICBjYXNlICdzeW5jYWJsZSc6XG4gICAgICAgICAgcmV0dXJuIFsnc3luY0ZhaWwnXTtcbiAgICAgICAgY2FzZSAndXBkYXRhYmxlJzpcbiAgICAgICAgICByZXR1cm4gWyd1cGRhdGVGYWlsJ107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfYWRkTGlzdGVuZXIoc291cmNlOiBTb3VyY2UsIGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuX2dlbmVyYXRlTGlzdGVuZXIoc291cmNlLCBldmVudCk7XG4gICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuZ2V0U291cmNlTmFtZShzb3VyY2UpO1xuICAgIGRlZXBTZXQodGhpcy5fZXZlbnRMaXN0ZW5lcnMsIFtzb3VyY2VOYW1lLCBldmVudF0sIGxpc3RlbmVyKTtcbiAgICBzb3VyY2Uub24oZXZlbnQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfcmVtb3ZlTGlzdGVuZXIoc291cmNlOiBTb3VyY2UsIGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5nZXRTb3VyY2VOYW1lKHNvdXJjZSk7XG4gICAgY29uc3QgbGlzdGVuZXIgPSBkZWVwR2V0KHRoaXMuX2V2ZW50TGlzdGVuZXJzLCBbXG4gICAgICBzb3VyY2VOYW1lLFxuICAgICAgZXZlbnRcbiAgICBdKSBhcyBMaXN0ZW5lcjtcbiAgICBzb3VyY2Uub2ZmKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgZGVlcFNldCh0aGlzLl9ldmVudExpc3RlbmVycywgW3NvdXJjZU5hbWUsIGV2ZW50XSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZ2VuZXJhdGVMaXN0ZW5lcihzb3VyY2U6IFNvdXJjZSwgZXZlbnQ6IHN0cmluZyk6IExpc3RlbmVyIHtcbiAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5nZXRTb3VyY2VOYW1lKHNvdXJjZSk7XG4gICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgY29uc29sZS5sb2codGhpcy5fbG9nUHJlZml4LCBzb3VyY2VOYW1lLCBldmVudCwgLi4uYXJncyk7XG4gICAgfTtcbiAgfVxufVxuIl19