UNPKG

@orbit/coordinator

Version:

A coordinator and set of coordination strategies for managing data flow and keeping @orbit/data sources in sync.

73 lines 9.61 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LogTruncationStrategy = void 0; const strategy_1 = require("../strategy"); class LogTruncationStrategy extends strategy_1.Strategy { constructor(options = {}) { super({ ...options, name: options.name || 'log-truncation' }); this._transformListeners = {}; } async activate(coordinator, options = {}) { await super.activate(coordinator, options); this._transformListeners = {}; for (let source of this._sources) { this._connectSource(source); } } async deactivate() { await super.deactivate(); for (let source of this._sources) { this._disconnectSource(source); } this._transformListeners = {}; } async _review(source) { let sources = this._sources; let transformId = source.transformLog.head; if (transformId && sources.length > 1) { let match = true; for (let i = 0; i < sources.length; i++) { let s = sources[i]; if (s !== source) { if (!s.requestQueue.empty || !s.syncQueue.empty || !s.transformLog.contains(transformId)) { match = false; break; } } } if (match) { return this._truncateSources(transformId, 0); } } } _truncateSources(transformId, relativePosition) { return this._sources.reduce((chain, source) => { return chain.then(() => source.transformLog.truncate(transformId, relativePosition)); }, Promise.resolve()); } _connectSource(source) { const listener = async () => { if (source.requestQueue.empty && source.syncQueue.empty) { return this._review(source); } }; const sourceName = this.getSourceName(source); this._transformListeners[sourceName] = listener; source.syncQueue.on('complete', listener); source.requestQueue.on('complete', listener); } _disconnectSource(source) { const sourceName = this.getSourceName(source); const listener = this._transformListeners[sourceName]; source.syncQueue.off('complete', listener); source.requestQueue.off('complete', listener); delete this._transformListeners[sourceName]; } } exports.LogTruncationStrategy = LogTruncationStrategy; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLXRydW5jYXRpb24tc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RyYXRlZ2llcy9sb2ctdHJ1bmNhdGlvbi1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwwQ0FBd0Q7QUFJeEQsTUFBYSxxQkFBc0IsU0FBUSxtQkFBUTtJQUtqRCxZQUFZLFVBQTJCLEVBQUU7UUFDdkMsS0FBSyxDQUFDO1lBQ0osR0FBRyxPQUFPO1lBQ1YsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksZ0JBQWdCO1NBQ3ZDLENBQUMsQ0FBQztRQVJLLHdCQUFtQixHQUV6QixFQUFFLENBQUM7SUFPUCxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FDWixXQUF3QixFQUN4QixVQUE2QixFQUFFO1FBRS9CLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixLQUFLLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVTtRQUNkLE1BQU0sS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pCLEtBQUssSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQWM7UUFDMUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM1QixJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUUzQyxJQUFJLFdBQVcsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7WUFFakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLEtBQUssTUFBTSxFQUFFO29CQUNoQixJQUNFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLO3dCQUNyQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSzt3QkFDbEIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFDckM7d0JBQ0EsS0FBSyxHQUFHLEtBQUssQ0FBQzt3QkFDZCxNQUFNO3FCQUNQO2lCQUNGO2FBQ0Y7WUFDRCxJQUFJLEtBQUssRUFBRTtnQkFDVCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDOUM7U0FDRjtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FDZCxXQUFtQixFQUNuQixnQkFBd0I7UUFFeEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM1QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ3JCLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUM1RCxDQUFDO1FBQ0osQ0FBQyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBYztRQUMzQixNQUFNLFFBQVEsR0FBRyxLQUFLLElBQW1CLEVBQUU7WUFDekMsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFDdkQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzdCO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQWM7UUFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUF2RkQsc0RBdUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29vcmRpbmF0b3IsIEFjdGl2YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vY29vcmRpbmF0b3InO1xuaW1wb3J0IHsgU3RyYXRlZ3ksIFN0cmF0ZWd5T3B0aW9ucyB9IGZyb20gJy4uL3N0cmF0ZWd5JztcbmltcG9ydCB7IE9wZXJhdGlvbiwgU291cmNlLCBUcmFuc2Zvcm0gfSBmcm9tICdAb3JiaXQvZGF0YSc7XG5pbXBvcnQgeyBEaWN0IH0gZnJvbSAnQG9yYml0L3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIExvZ1RydW5jYXRpb25TdHJhdGVneSBleHRlbmRzIFN0cmF0ZWd5IHtcbiAgcHJvdGVjdGVkIF90cmFuc2Zvcm1MaXN0ZW5lcnM6IERpY3Q8XG4gICAgKHRyYW5zZm9ybTogVHJhbnNmb3JtPE9wZXJhdGlvbj4pID0+IHZvaWRcbiAgPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFN0cmF0ZWd5T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSB8fCAnbG9nLXRydW5jYXRpb24nXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBhY3RpdmF0ZShcbiAgICBjb29yZGluYXRvcjogQ29vcmRpbmF0b3IsXG4gICAgb3B0aW9uczogQWN0aXZhdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzdXBlci5hY3RpdmF0ZShjb29yZGluYXRvciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fdHJhbnNmb3JtTGlzdGVuZXJzID0ge307XG4gICAgZm9yIChsZXQgc291cmNlIG9mIHRoaXMuX3NvdXJjZXMpIHtcbiAgICAgIHRoaXMuX2Nvbm5lY3RTb3VyY2Uoc291cmNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLmRlYWN0aXZhdGUoKTtcbiAgICBmb3IgKGxldCBzb3VyY2Ugb2YgdGhpcy5fc291cmNlcykge1xuICAgICAgdGhpcy5fZGlzY29ubmVjdFNvdXJjZShzb3VyY2UpO1xuICAgIH1cbiAgICB0aGlzLl90cmFuc2Zvcm1MaXN0ZW5lcnMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIF9yZXZpZXcoc291cmNlOiBTb3VyY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgc291cmNlcyA9IHRoaXMuX3NvdXJjZXM7XG4gICAgbGV0IHRyYW5zZm9ybUlkID0gc291cmNlLnRyYW5zZm9ybUxvZy5oZWFkO1xuXG4gICAgaWYgKHRyYW5zZm9ybUlkICYmIHNvdXJjZXMubGVuZ3RoID4gMSkge1xuICAgICAgbGV0IG1hdGNoID0gdHJ1ZTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzID0gc291cmNlc1tpXTtcbiAgICAgICAgaWYgKHMgIT09IHNvdXJjZSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFzLnJlcXVlc3RRdWV1ZS5lbXB0eSB8fFxuICAgICAgICAgICAgIXMuc3luY1F1ZXVlLmVtcHR5IHx8XG4gICAgICAgICAgICAhcy50cmFuc2Zvcm1Mb2cuY29udGFpbnModHJhbnNmb3JtSWQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RydW5jYXRlU291cmNlcyh0cmFuc2Zvcm1JZCwgMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3RydW5jYXRlU291cmNlcyhcbiAgICB0cmFuc2Zvcm1JZDogc3RyaW5nLFxuICAgIHJlbGF0aXZlUG9zaXRpb246IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlcy5yZWR1Y2UoKGNoYWluLCBzb3VyY2UpID0+IHtcbiAgICAgIHJldHVybiBjaGFpbi50aGVuKCgpID0+XG4gICAgICAgIHNvdXJjZS50cmFuc2Zvcm1Mb2cudHJ1bmNhdGUodHJhbnNmb3JtSWQsIHJlbGF0aXZlUG9zaXRpb24pXG4gICAgICApO1xuICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKTtcbiAgfVxuXG4gIF9jb25uZWN0U291cmNlKHNvdXJjZTogU291cmNlKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdGVuZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoc291cmNlLnJlcXVlc3RRdWV1ZS5lbXB0eSAmJiBzb3VyY2Uuc3luY1F1ZXVlLmVtcHR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXZpZXcoc291cmNlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHNvdXJjZU5hbWUgPSB0aGlzLmdldFNvdXJjZU5hbWUoc291cmNlKTtcbiAgICB0aGlzLl90cmFuc2Zvcm1MaXN0ZW5lcnNbc291cmNlTmFtZV0gPSBsaXN0ZW5lcjtcbiAgICBzb3VyY2Uuc3luY1F1ZXVlLm9uKCdjb21wbGV0ZScsIGxpc3RlbmVyKTtcbiAgICBzb3VyY2UucmVxdWVzdFF1ZXVlLm9uKCdjb21wbGV0ZScsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIF9kaXNjb25uZWN0U291cmNlKHNvdXJjZTogU291cmNlKTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuZ2V0U291cmNlTmFtZShzb3VyY2UpO1xuICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5fdHJhbnNmb3JtTGlzdGVuZXJzW3NvdXJjZU5hbWVdO1xuICAgIHNvdXJjZS5zeW5jUXVldWUub2ZmKCdjb21wbGV0ZScsIGxpc3RlbmVyKTtcbiAgICBzb3VyY2UucmVxdWVzdFF1ZXVlLm9mZignY29tcGxldGUnLCBsaXN0ZW5lcik7XG4gICAgZGVsZXRlIHRoaXMuX3RyYW5zZm9ybUxpc3RlbmVyc1tzb3VyY2VOYW1lXTtcbiAgfVxufVxuIl19