@orbit/coordinator
Version:
A coordinator and set of coordination strategies for managing data flow and keeping @orbit/data sources in sync.
100 lines • 15 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConnectionStrategy = void 0;
const strategy_1 = require("../strategy");
const core_1 = require("@orbit/core");
const { assert } = core_1.Orbit;
class ConnectionStrategy extends strategy_1.Strategy {
constructor(options) {
assert('A `source` must be specified for a ConnectionStrategy', !!options.source);
assert('`source` should be a Source name specified as a string', typeof options.source === 'string');
assert('`on` should be specified as the name of the event a ConnectionStrategy listens for', typeof options.on === 'string');
options.sources = [options.source];
let defaultName = `${options.source}:${options.on}`;
delete options.source;
if (options.target) {
assert('`target` should be a Source name specified as a string', typeof options.target === 'string');
options.sources.push(options.target);
defaultName += ` -> ${options.target}`;
if (typeof options.action === 'string') {
defaultName += `:${options.action}`;
}
delete options.target;
}
options.name = options.name || defaultName;
super(options);
this._event = options.on;
this._action = options.action;
this._catch = options.catch;
this._filter = options.filter;
this._blocking =
typeof options.blocking === 'function'
? options.blocking
: !!options.blocking;
}
get source() {
return this._sources[0];
}
get target() {
return this._sources[1];
}
get blocking() {
return this._blocking;
}
async activate(coordinator, options = {}) {
await super.activate(coordinator, options);
this._listener = this.generateListener();
this.source.on(this._event, this._listener);
}
async deactivate() {
await super.deactivate();
this.source.off(this._event, this._listener);
this._listener = undefined;
}
generateListener() {
return (...args) => this.defaultListener(...args);
}
async defaultListener(...args) {
if (this._filter) {
if (!this._filter.apply(this, args)) {
return;
}
}
let result = this.invokeAction(...args);
if (this._catch && result && result.catch) {
result = result.catch((e) => {
return this._catch.apply(this, [e, ...args]);
});
}
if (result) {
let blocking = false;
if (typeof this._blocking === 'function') {
if (this._blocking(...args)) {
blocking = true;
}
}
else if (this._blocking) {
blocking = true;
}
if (blocking) {
return this.handleBlockingResponse(result, ...args);
}
}
}
invokeAction(...args) {
const target = this.target;
if (typeof this._action === 'string') {
return target[this._action](...args);
}
else {
return this._action.apply(this, args);
}
}
async handleBlockingResponse(result,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
...args) {
await result;
}
}
exports.ConnectionStrategy = ConnectionStrategy;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdHJhdGVnaWVzL2Nvbm5lY3Rpb24tc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMENBQXdEO0FBQ3hELHNDQUE4QztBQUc5QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsWUFBSyxDQUFDO0FBb0R6QixNQUFhLGtCQUFtQixTQUFRLG1CQUFRO0lBUTlDLFlBQVksT0FBa0M7UUFDNUMsTUFBTSxDQUNKLHVEQUF1RCxFQUN2RCxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDakIsQ0FBQztRQUNGLE1BQU0sQ0FDSix3REFBd0QsRUFDeEQsT0FBTyxPQUFPLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FDbkMsQ0FBQztRQUNGLE1BQU0sQ0FDSixvRkFBb0YsRUFDcEYsT0FBTyxPQUFPLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FDL0IsQ0FBQztRQUNGLE9BQU8sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxXQUFXLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNwRCxPQUFRLE9BQWUsQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ2xCLE1BQU0sQ0FDSix3REFBd0QsRUFDeEQsT0FBTyxPQUFPLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FDbkMsQ0FBQztZQUNGLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxXQUFXLElBQUksT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFO2dCQUN0QyxXQUFXLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDckM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDdkI7UUFDRCxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDO1FBQzNDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUztZQUNaLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxVQUFVO2dCQUNwQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVE7Z0JBQ2xCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FDWixXQUF3QixFQUN4QixVQUE2QixFQUFFO1FBRS9CLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDZCxNQUFNLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLE9BQU8sQ0FBQyxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFUyxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBVztRQUM1QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDbkMsT0FBTzthQUNSO1NBQ0Y7UUFFRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFRLENBQUM7UUFFL0MsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ3pDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUU7Z0JBQ2pDLE9BQVEsSUFBSSxDQUFDLE1BQWtCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUQsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRTtnQkFDeEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUU7b0JBQzNCLFFBQVEsR0FBRyxJQUFJLENBQUM7aUJBQ2pCO2FBQ0Y7aUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUN6QixRQUFRLEdBQUcsSUFBSSxDQUFDO2FBQ2pCO1lBRUQsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7YUFDckQ7U0FDRjtJQUNILENBQUM7SUFFUyxZQUFZLENBQUMsR0FBRyxJQUFXO1FBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFhLENBQUM7UUFFbEMsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFO1lBQ3BDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1NBQ3RDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN2QztJQUNILENBQUM7SUFFUyxLQUFLLENBQUMsc0JBQXNCLENBQ3BDLE1BQW9CO0lBQ3BCLDZEQUE2RDtJQUM3RCxHQUFHLElBQVc7UUFFZCxNQUFNLE1BQU0sQ0FBQztJQUNmLENBQUM7Q0FDRjtBQWhJRCxnREFnSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb29yZGluYXRvciwgQWN0aXZhdGlvbk9wdGlvbnMgfSBmcm9tICcuLi9jb29yZGluYXRvcic7XG5pbXBvcnQgeyBTdHJhdGVneSwgU3RyYXRlZ3lPcHRpb25zIH0gZnJvbSAnLi4vc3RyYXRlZ3knO1xuaW1wb3J0IHsgT3JiaXQsIExpc3RlbmVyIH0gZnJvbSAnQG9yYml0L2NvcmUnO1xuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnQG9yYml0L2RhdGEnO1xuXG5jb25zdCB7IGFzc2VydCB9ID0gT3JiaXQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvblN0cmF0ZWd5T3B0aW9ucyBleHRlbmRzIFN0cmF0ZWd5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc291cmNlIHRvIGJlIG9ic2VydmVkLlxuICAgKi9cbiAgc291cmNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBvYnNlcnZlLlxuICAgKi9cbiAgb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSB3aGljaCB3aWxsIGJlIGFjdGVkIHVwb24uXG4gICAqL1xuICB0YXJnZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiBDYW4gYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGBwdWxsYCkgb3IgYSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlXG4gICAqIGludm9rZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBzdHJhdGVneSAoYW5kIHRodXMgd2lsbCBoYXZlIGFjY2VzcyB0b1xuICAgKiBib3RoIGB0aGlzLnNvdXJjZWAgYW5kIGB0aGlzLnRhcmdldGApLlxuICAgKi9cbiAgYWN0aW9uOiBzdHJpbmcgfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bik7XG5cbiAgLyoqXG4gICAqIEEgaGFuZGxlciBmb3IgYW55IGVycm9ycyB0aHJvd24gYXMgYSByZXN1bHQgb2YgcGVyZm9ybWluZyB0aGUgYWN0aW9uLlxuICAgKi9cbiAgY2F0Y2g/OiAoZXJyb3I6IEVycm9yLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEEgZmlsdGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGBhY3Rpb25gIHNob3VsZCBiZSBwZXJmb3JtZWQuXG4gICAqXG4gICAqIGBmaWx0ZXJgIHdpbGwgYmUgaW52b2tlZCBpbiB0aGUgY29udGV4dCBvZiB0aGlzIHN0cmF0ZWd5IChhbmQgdGh1cyB3aWxsXG4gICAqIGhhdmUgYWNjZXNzIHRvIGJvdGggYHRoaXMuc291cmNlYCBhbmQgYHRoaXMudGFyZ2V0YCkuXG4gICAqL1xuICBmaWx0ZXI/OiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgcmVzb2x1dGlvbiBvZiBgYWN0aW9uYCBvbiB0aGUgdGhlIHRhcmdldCBibG9jayB0aGUgY29tcGxldGlvblxuICAgKiBvZiB0aGUgc291cmNlJ3MgZXZlbnQ/XG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGBibG9ja2luZ2AgaXMgZmFsc2UuXG4gICAqL1xuICBibG9ja2luZz86IGJvb2xlYW4gfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYm9vbGVhbik7XG59XG5cbmRlY2xhcmUgdHlwZSBDYXRjaEZuID0gKGVycm9yOiBFcnJvciwgLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkO1xuZGVjbGFyZSB0eXBlIEZpbHRlckZuID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25TdHJhdGVneSBleHRlbmRzIFN0cmF0ZWd5IHtcbiAgcHJvdGVjdGVkIF9ibG9ja2luZzogYm9vbGVhbiB8ICgoLi4uYXJnczogdW5rbm93bltdKSA9PiBib29sZWFuKTtcbiAgcHJvdGVjdGVkIF9ldmVudDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2FjdGlvbjogc3RyaW5nIHwgKCguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pO1xuICBwcm90ZWN0ZWQgX2NhdGNoPzogQ2F0Y2hGbjtcbiAgcHJvdGVjdGVkIF9saXN0ZW5lcj86IExpc3RlbmVyO1xuICBwcm90ZWN0ZWQgX2ZpbHRlcj86IEZpbHRlckZuO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbm5lY3Rpb25TdHJhdGVneU9wdGlvbnMpIHtcbiAgICBhc3NlcnQoXG4gICAgICAnQSBgc291cmNlYCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYSBDb25uZWN0aW9uU3RyYXRlZ3knLFxuICAgICAgISFvcHRpb25zLnNvdXJjZVxuICAgICk7XG4gICAgYXNzZXJ0KFxuICAgICAgJ2Bzb3VyY2VgIHNob3VsZCBiZSBhIFNvdXJjZSBuYW1lIHNwZWNpZmllZCBhcyBhIHN0cmluZycsXG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zb3VyY2UgPT09ICdzdHJpbmcnXG4gICAgKTtcbiAgICBhc3NlcnQoXG4gICAgICAnYG9uYCBzaG91bGQgYmUgc3BlY2lmaWVkIGFzIHRoZSBuYW1lIG9mIHRoZSBldmVudCBhIENvbm5lY3Rpb25TdHJhdGVneSBsaXN0ZW5zIGZvcicsXG4gICAgICB0eXBlb2Ygb3B0aW9ucy5vbiA9PT0gJ3N0cmluZydcbiAgICApO1xuICAgIG9wdGlvbnMuc291cmNlcyA9IFtvcHRpb25zLnNvdXJjZV07XG4gICAgbGV0IGRlZmF1bHROYW1lID0gYCR7b3B0aW9ucy5zb3VyY2V9OiR7b3B0aW9ucy5vbn1gO1xuICAgIGRlbGV0ZSAob3B0aW9ucyBhcyBhbnkpLnNvdXJjZTtcbiAgICBpZiAob3B0aW9ucy50YXJnZXQpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgJ2B0YXJnZXRgIHNob3VsZCBiZSBhIFNvdXJjZSBuYW1lIHNwZWNpZmllZCBhcyBhIHN0cmluZycsXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ3N0cmluZydcbiAgICAgICk7XG4gICAgICBvcHRpb25zLnNvdXJjZXMucHVzaChvcHRpb25zLnRhcmdldCk7XG4gICAgICBkZWZhdWx0TmFtZSArPSBgIC0+ICR7b3B0aW9ucy50YXJnZXR9YDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hY3Rpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlZmF1bHROYW1lICs9IGA6JHtvcHRpb25zLmFjdGlvbn1gO1xuICAgICAgfVxuICAgICAgZGVsZXRlIG9wdGlvbnMudGFyZ2V0O1xuICAgIH1cbiAgICBvcHRpb25zLm5hbWUgPSBvcHRpb25zLm5hbWUgfHwgZGVmYXVsdE5hbWU7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLl9ldmVudCA9IG9wdGlvbnMub247XG4gICAgdGhpcy5fYWN0aW9uID0gb3B0aW9ucy5hY3Rpb247XG4gICAgdGhpcy5fY2F0Y2ggPSBvcHRpb25zLmNhdGNoO1xuICAgIHRoaXMuX2ZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgIHRoaXMuX2Jsb2NraW5nID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLmJsb2NraW5nID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gb3B0aW9ucy5ibG9ja2luZ1xuICAgICAgICA6ICEhb3B0aW9ucy5ibG9ja2luZztcbiAgfVxuXG4gIGdldCBzb3VyY2UoKTogU291cmNlIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlc1swXTtcbiAgfVxuXG4gIGdldCB0YXJnZXQoKTogU291cmNlIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlc1sxXTtcbiAgfVxuXG4gIGdldCBibG9ja2luZygpOiBib29sZWFuIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLl9ibG9ja2luZztcbiAgfVxuXG4gIGFzeW5jIGFjdGl2YXRlKFxuICAgIGNvb3JkaW5hdG9yOiBDb29yZGluYXRvcixcbiAgICBvcHRpb25zOiBBY3RpdmF0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLmFjdGl2YXRlKGNvb3JkaW5hdG9yLCBvcHRpb25zKTtcbiAgICB0aGlzLl9saXN0ZW5lciA9IHRoaXMuZ2VuZXJhdGVMaXN0ZW5lcigpO1xuICAgIHRoaXMuc291cmNlLm9uKHRoaXMuX2V2ZW50LCB0aGlzLl9saXN0ZW5lcik7XG4gIH1cblxuICBhc3luYyBkZWFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLmRlYWN0aXZhdGUoKTtcbiAgICB0aGlzLnNvdXJjZS5vZmYodGhpcy5fZXZlbnQsIHRoaXMuX2xpc3RlbmVyKTtcbiAgICB0aGlzLl9saXN0ZW5lciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZW5lcmF0ZUxpc3RlbmVyKCk6IExpc3RlbmVyIHtcbiAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB0aGlzLmRlZmF1bHRMaXN0ZW5lciguLi5hcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBkZWZhdWx0TGlzdGVuZXIoLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLl9maWx0ZXIpIHtcbiAgICAgIGlmICghdGhpcy5fZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3MpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5pbnZva2VBY3Rpb24oLi4uYXJncykgYXMgYW55O1xuXG4gICAgaWYgKHRoaXMuX2NhdGNoICYmIHJlc3VsdCAmJiByZXN1bHQuY2F0Y2gpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9jYXRjaCBhcyBDYXRjaEZuKS5hcHBseSh0aGlzLCBbZSwgLi4uYXJnc10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgbGV0IGJsb2NraW5nID0gZmFsc2U7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX2Jsb2NraW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmICh0aGlzLl9ibG9ja2luZyguLi5hcmdzKSkge1xuICAgICAgICAgIGJsb2NraW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ibG9ja2luZykge1xuICAgICAgICBibG9ja2luZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChibG9ja2luZykge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVCbG9ja2luZ1Jlc3BvbnNlKHJlc3VsdCwgLi4uYXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGludm9rZUFjdGlvbiguLi5hcmdzOiBhbnlbXSk6IHVua25vd24ge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMudGFyZ2V0IGFzIGFueTtcblxuICAgIGlmICh0eXBlb2YgdGhpcy5fYWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRhcmdldFt0aGlzLl9hY3Rpb25dKC4uLmFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVCbG9ja2luZ1Jlc3BvbnNlKFxuICAgIHJlc3VsdDogUHJvbWlzZTxhbnk+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGF3YWl0IHJlc3VsdDtcbiAgfVxufVxuIl19