@orbit/coordinator
Version:
A coordinator and set of coordination strategies for managing data flow and keeping @orbit/data sources in sync.
69 lines • 9.45 kB
JavaScript
import { Strategy } from '../strategy';
export class LogTruncationStrategy extends 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];
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLXRydW5jYXRpb24tc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RyYXRlZ2llcy9sb2ctdHJ1bmNhdGlvbi1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFtQixNQUFNLGFBQWEsQ0FBQztBQUl4RCxNQUFNLE9BQU8scUJBQXNCLFNBQVEsUUFBUTtJQUtqRCxZQUFZLFVBQTJCLEVBQUU7UUFDdkMsS0FBSyxDQUFDO1lBQ0osR0FBRyxPQUFPO1lBQ1YsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksZ0JBQWdCO1NBQ3ZDLENBQUMsQ0FBQztRQVJLLHdCQUFtQixHQUV6QixFQUFFLENBQUM7SUFPUCxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FDWixXQUF3QixFQUN4QixVQUE2QixFQUFFO1FBRS9CLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixLQUFLLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVTtRQUNkLE1BQU0sS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pCLEtBQUssSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQWM7UUFDMUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM1QixJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUUzQyxJQUFJLFdBQVcsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7WUFFakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLEtBQUssTUFBTSxFQUFFO29CQUNoQixJQUNFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLO3dCQUNyQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSzt3QkFDbEIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFDckM7d0JBQ0EsS0FBSyxHQUFHLEtBQUssQ0FBQzt3QkFDZCxNQUFNO3FCQUNQO2lCQUNGO2FBQ0Y7WUFDRCxJQUFJLEtBQUssRUFBRTtnQkFDVCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDOUM7U0FDRjtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FDZCxXQUFtQixFQUNuQixnQkFBd0I7UUFFeEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM1QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ3JCLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUM1RCxDQUFDO1FBQ0osQ0FBQyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBYztRQUMzQixNQUFNLFFBQVEsR0FBRyxLQUFLLElBQW1CLEVBQUU7WUFDekMsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFDdkQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzdCO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQWM7UUFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb29yZGluYXRvciwgQWN0aXZhdGlvbk9wdGlvbnMgfSBmcm9tICcuLi9jb29yZGluYXRvcic7XG5pbXBvcnQgeyBTdHJhdGVneSwgU3RyYXRlZ3lPcHRpb25zIH0gZnJvbSAnLi4vc3RyYXRlZ3knO1xuaW1wb3J0IHsgT3BlcmF0aW9uLCBTb3VyY2UsIFRyYW5zZm9ybSB9IGZyb20gJ0BvcmJpdC9kYXRhJztcbmltcG9ydCB7IERpY3QgfSBmcm9tICdAb3JiaXQvdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgTG9nVHJ1bmNhdGlvblN0cmF0ZWd5IGV4dGVuZHMgU3RyYXRlZ3kge1xuICBwcm90ZWN0ZWQgX3RyYW5zZm9ybUxpc3RlbmVyczogRGljdDxcbiAgICAodHJhbnNmb3JtOiBUcmFuc2Zvcm08T3BlcmF0aW9uPikgPT4gdm9pZFxuICA+ID0ge307XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU3RyYXRlZ3lPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbmFtZTogb3B0aW9ucy5uYW1lIHx8ICdsb2ctdHJ1bmNhdGlvbidcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGFjdGl2YXRlKFxuICAgIGNvb3JkaW5hdG9yOiBDb29yZGluYXRvcixcbiAgICBvcHRpb25zOiBBY3RpdmF0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLmFjdGl2YXRlKGNvb3JkaW5hdG9yLCBvcHRpb25zKTtcbiAgICB0aGlzLl90cmFuc2Zvcm1MaXN0ZW5lcnMgPSB7fTtcbiAgICBmb3IgKGxldCBzb3VyY2Ugb2YgdGhpcy5fc291cmNlcykge1xuICAgICAgdGhpcy5fY29ubmVjdFNvdXJjZShzb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlYWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuZGVhY3RpdmF0ZSgpO1xuICAgIGZvciAobGV0IHNvdXJjZSBvZiB0aGlzLl9zb3VyY2VzKSB7XG4gICAgICB0aGlzLl9kaXNjb25uZWN0U291cmNlKHNvdXJjZSk7XG4gICAgfVxuICAgIHRoaXMuX3RyYW5zZm9ybUxpc3RlbmVycyA9IHt9O1xuICB9XG5cbiAgYXN5bmMgX3Jldmlldyhzb3VyY2U6IFNvdXJjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBzb3VyY2VzID0gdGhpcy5fc291cmNlcztcbiAgICBsZXQgdHJhbnNmb3JtSWQgPSBzb3VyY2UudHJhbnNmb3JtTG9nLmhlYWQ7XG5cbiAgICBpZiAodHJhbnNmb3JtSWQgJiYgc291cmNlcy5sZW5ndGggPiAxKSB7XG4gICAgICBsZXQgbWF0Y2ggPSB0cnVlO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHMgPSBzb3VyY2VzW2ldO1xuICAgICAgICBpZiAocyAhPT0gc291cmNlKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXMucmVxdWVzdFF1ZXVlLmVtcHR5IHx8XG4gICAgICAgICAgICAhcy5zeW5jUXVldWUuZW1wdHkgfHxcbiAgICAgICAgICAgICFzLnRyYW5zZm9ybUxvZy5jb250YWlucyh0cmFuc2Zvcm1JZClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJ1bmNhdGVTb3VyY2VzKHRyYW5zZm9ybUlkLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfdHJ1bmNhdGVTb3VyY2VzKFxuICAgIHRyYW5zZm9ybUlkOiBzdHJpbmcsXG4gICAgcmVsYXRpdmVQb3NpdGlvbjogbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2VzLnJlZHVjZSgoY2hhaW4sIHNvdXJjZSkgPT4ge1xuICAgICAgcmV0dXJuIGNoYWluLnRoZW4oKCkgPT5cbiAgICAgICAgc291cmNlLnRyYW5zZm9ybUxvZy50cnVuY2F0ZSh0cmFuc2Zvcm1JZCwgcmVsYXRpdmVQb3NpdGlvbilcbiAgICAgICk7XG4gICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpO1xuICB9XG5cbiAgX2Nvbm5lY3RTb3VyY2Uoc291cmNlOiBTb3VyY2UpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmIChzb3VyY2UucmVxdWVzdFF1ZXVlLmVtcHR5ICYmIHNvdXJjZS5zeW5jUXVldWUuZW1wdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jldmlldyhzb3VyY2UpO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuZ2V0U291cmNlTmFtZShzb3VyY2UpO1xuICAgIHRoaXMuX3RyYW5zZm9ybUxpc3RlbmVyc1tzb3VyY2VOYW1lXSA9IGxpc3RlbmVyO1xuICAgIHNvdXJjZS5zeW5jUXVldWUub24oJ2NvbXBsZXRlJywgbGlzdGVuZXIpO1xuICAgIHNvdXJjZS5yZXF1ZXN0UXVldWUub24oJ2NvbXBsZXRlJywgbGlzdGVuZXIpO1xuICB9XG5cbiAgX2Rpc2Nvbm5lY3RTb3VyY2Uoc291cmNlOiBTb3VyY2UpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5nZXRTb3VyY2VOYW1lKHNvdXJjZSk7XG4gICAgY29uc3QgbGlzdGVuZXIgPSB0aGlzLl90cmFuc2Zvcm1MaXN0ZW5lcnNbc291cmNlTmFtZV07XG4gICAgc291cmNlLnN5bmNRdWV1ZS5vZmYoJ2NvbXBsZXRlJywgbGlzdGVuZXIpO1xuICAgIHNvdXJjZS5yZXF1ZXN0UXVldWUub2ZmKCdjb21wbGV0ZScsIGxpc3RlbmVyKTtcbiAgICBkZWxldGUgdGhpcy5fdHJhbnNmb3JtTGlzdGVuZXJzW3NvdXJjZU5hbWVdO1xuICB9XG59XG4iXX0=