UNPKG

@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
"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==