data-transport
Version:
A simple and responsive transport
191 lines • 26.6 kB
JavaScript
import { __assign, __awaiter, __extends, __generator, __rest } from "tslib";
import { callbackKey } from '../constant';
import { global } from '../global';
import { Transport } from '../transport';
var transportName = '__DATA_TRANSPORT_BROWSER_EXTENSIONS__';
var BrowserExtensionsGenericTransport = /** @class */ (function (_super) {
__extends(BrowserExtensionsGenericTransport, _super);
function BrowserExtensionsGenericTransport(_options) {
if (_options === void 0) { _options = {}; }
var _a;
var _b = _options.browser, browser = _b === void 0 ? (_a = global.browser) !== null && _a !== void 0 ? _a : global.chrome : _b, _c = _options.listener, listener = _c === void 0 ? function (callback) {
this[callbackKey] = callback;
var handler = function (data, sender, sendResponse) {
data._sendResponse = sendResponse;
callback(data);
// https://developer.chrome.com/docs/extensions/develop/concepts/messaging#simple
// support async callback
return true;
};
browser.runtime.onMessage.addListener(handler);
return function () {
browser.runtime.onMessage.removeListener(handler);
};
} : _c, _d = _options.sender, sender = _d === void 0 ? function (message) {
if (message._sendResponse) {
var sendResponse = message._sendResponse;
delete message._sendResponse;
sendResponse(message);
}
else {
// @ts-ignore
browser.runtime.sendMessage(message, {}, this[callbackKey]);
}
} : _d, options = __rest(_options, ["browser", "listener", "sender"]);
return _super.call(this, __assign(__assign({}, options), { listener: listener, sender: sender })) || this;
}
return BrowserExtensionsGenericTransport;
}(Transport));
export { BrowserExtensionsGenericTransport };
var connectEventName = 'sharedworker-connect';
var BrowserExtensionsMainTransport = /** @class */ (function (_super) {
__extends(BrowserExtensionsMainTransport, _super);
function BrowserExtensionsMainTransport(_options) {
if (_options === void 0) { _options = {}; }
var _this = this;
var _a;
var _b = _options.browser, browser = _b === void 0 ? (_a = global.browser) !== null && _a !== void 0 ? _a : global.chrome : _b, _c = _options.listener, listener = _c === void 0 ? function (callback) {
var _this = this;
this[callbackKey] = callback;
return function () {
_this.ports.forEach(function (port) {
port.disconnect();
});
};
} : _c, _d = _options.sender, sender = _d === void 0 ? function (message) {
var _a;
var port = (_a = message._extra) === null || _a === void 0 ? void 0 : _a._port;
if (port) {
delete message._port;
port.postMessage(message);
}
else if (message.type === 'response' &&
// @ts-ignore
this.ports.has(message.requestId)) {
// @ts-ignore
var port_1 = this.ports.get(message.requestId);
port_1.postMessage(message);
}
else {
this.ports.forEach(function (port) {
try {
port.postMessage(message);
}
catch (error) {
console.error(error);
}
});
}
} : _d, options = __rest(_options, ["browser", "listener", "sender"]);
_this = _super.call(this, __assign(__assign({}, options), { listener: listener, sender: sender })) || this;
_this.ports = new Map();
_this._onConnectCallback = new Set();
_this._onDisconnectCallback = new Set();
browser.runtime.onConnect.addListener(function (port) { return __awaiter(_this, void 0, void 0, function () {
var handler_1, id_1;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!(port.name === transportName)) return [3 /*break*/, 2];
handler_1 = function (data) {
var _a;
data._extra = (_a = data._extra) !== null && _a !== void 0 ? _a : {};
data._extra._port = port;
_this[callbackKey](data);
};
port.onMessage.addListener(handler_1);
port.onDisconnect.addListener(function () {
port.onMessage.removeListener(handler_1);
_this.ports.forEach(function (_port, id) {
if (_port === port) {
_this.ports.delete(id);
}
});
_this._onDisconnectCallback.forEach(function (callback) {
callback(id_1);
});
});
return [4 /*yield*/, this.emit({
// @ts-ignore
name: connectEventName,
_extra: { _port: port },
})];
case 1:
id_1 = _a.sent();
this.ports.set(id_1, port);
this._onConnectCallback.forEach(function (callback) {
callback(id_1);
});
_a.label = 2;
case 2: return [2 /*return*/];
}
});
}); });
return _this;
}
BrowserExtensionsMainTransport.prototype.onConnect = function (callback) {
var _this = this;
this._onConnectCallback.add(callback);
return function () {
_this._onConnectCallback.delete(callback);
};
};
BrowserExtensionsMainTransport.prototype.onDisconnect = function (callback) {
var _this = this;
this._onDisconnectCallback.add(callback);
return function () {
_this._onDisconnectCallback.delete(callback);
};
};
return BrowserExtensionsMainTransport;
}(Transport));
export { BrowserExtensionsMainTransport };
var BrowserExtensionsClientTransport = /** @class */ (function (_super) {
__extends(BrowserExtensionsClientTransport, _super);
function BrowserExtensionsClientTransport(_options) {
if (_options === void 0) { _options = {}; }
var _this = this;
var _a;
var _b = _options.browser, browser = _b === void 0 ? (_a = global.browser) !== null && _a !== void 0 ? _a : global.chrome : _b, _c = _options.port, port = _c === void 0 ? browser.runtime.connect({ name: transportName }) : _c, _d = _options.listener, listener = _d === void 0 ? function (callback) {
var handler = function (options) {
callback(options);
};
port.onMessage.addListener(handler);
return function () {
port.onMessage.removeListener(handler);
};
} : _d, _e = _options.sender, sender = _e === void 0 ? function (message) {
port.postMessage(message);
} : _e, options = __rest(_options, ["browser", "port", "listener", "sender"]);
_this = _super.call(this, __assign(__assign({}, options), { listener: listener, sender: sender })) || this;
_this._onConnectCallback = new Set();
// @ts-ignore
_this.listen(connectEventName, function () { return __awaiter(_this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
Promise.resolve().then(function () {
_this._onConnectCallback.forEach(function (callback) {
callback();
});
});
return [2 /*return*/, this.id];
});
}); });
return _this;
}
BrowserExtensionsClientTransport.prototype.onConnect = function (callback) {
var _this = this;
this._onConnectCallback.add(callback);
return function () {
_this._onConnectCallback.delete(callback);
};
};
return BrowserExtensionsClientTransport;
}(Transport));
export { BrowserExtensionsClientTransport };
export var BrowserExtensionsTransport = {
Main: BrowserExtensionsMainTransport,
Client: BrowserExtensionsClientTransport,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3NlckV4dGVuc2lvbnNUcmFuc3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhbnNwb3J0cy9icm93c2VyRXh0ZW5zaW9uc1RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBUW5DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekMsSUFBTSxhQUFhLEdBQUcsdUNBQXVDLENBQUM7QUE2QzlEO0lBRVUscURBQVk7SUFHcEIsMkNBQVksUUFBdUQ7UUFBdkQseUJBQUEsRUFBQSxhQUF1RDs7UUFFL0QsSUFBQSxLQWtDRSxRQUFRLFFBbEMrQixFQUF6QyxPQUFPLG1CQUFHLE1BQUEsTUFBTSxDQUFDLE9BQU8sbUNBQUksTUFBTSxDQUFDLE1BQU0sS0FBQSxFQUN6QyxLQWlDRSxRQUFRLFNBaEJULEVBakJELFFBQVEsbUJBQUcsVUFBbUQsUUFBUTtZQUNwRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBQzdCLElBQU0sT0FBTyxHQUFHLFVBQ2QsSUFBbUMsRUFDbkMsTUFBb0UsRUFDcEUsWUFBNEQ7Z0JBRTVELElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO2dCQUNsQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2YsaUZBQWlGO2dCQUNqRix5QkFBeUI7Z0JBQ3pCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQyxDQUFDO1lBQ0YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLE9BQU87Z0JBQ0wsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQztRQUNKLENB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a0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLE9BQU87WUFDTCxLQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFDSCx1Q0FBQztBQUFELENBQUMsQUE3Q0QsQ0FFVSxTQUFTLEdBMkNsQjs7QUFFRCxNQUFNLENBQUMsSUFBTSwwQkFBMEIsR0FBRztJQUN4QyxJQUFJLEVBQUUsOEJBQThCO0lBQ3BDLE1BQU0sRUFBRSxnQ0FBZ0M7Q0FDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhbGxiYWNrS2V5IH0gZnJvbSAnLi4vY29uc3RhbnQnO1xuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSAnLi4vZ2xvYmFsJztcbmltcG9ydCB0eXBlIHtcbiAgQmFzZUludGVyYWN0aW9uLFxuICBJUmVxdWVzdCxcbiAgTGlzdGVuZXJPcHRpb25zLFxuICBTZW5kT3B0aW9ucyxcbiAgVHJhbnNwb3J0T3B0aW9ucyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFRyYW5zcG9ydCB9IGZyb20gJy4uL3RyYW5zcG9ydCc7XG5cbmNvbnN0IHRyYW5zcG9ydE5hbWUgPSAnX19EQVRBX1RSQU5TUE9SVF9CUk9XU0VSX0VYVEVOU0lPTlNfXyc7XG5cbnR5cGUgQnJvd3NlciA9IHR5cGVvZiBnbG9iYWwuYnJvd3NlciB8IHR5cGVvZiBnbG9iYWwuY2hyb21lO1xuXG50eXBlIFBvcnQgPSBicm93c2VyLnJ1bnRpbWUuUG9ydCB8IGNocm9tZS5ydW50aW1lLlBvcnQ7XG5cbmludGVyZmFjZSBTZW5kUmVzcG9uc2Uge1xuICBfc2VuZFJlc3BvbnNlPzogKHJlc3BvbnNlPzogU2VuZE9wdGlvbnM8U2VuZFJlc3BvbnNlPikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCcm93c2VyRXh0ZW5zaW9uc0dlbmVyaWNUcmFuc3BvcnRPcHRpb25zXG4gIGV4dGVuZHMgUGFydGlhbDxUcmFuc3BvcnRPcHRpb25zPFNlbmRSZXNwb25zZT4+IHtcbiAgLyoqXG4gICAqIGJyb3dzZXIgZXh0ZW5zaW9uIEFQSS5cbiAgICovXG4gIGJyb3dzZXI/OiBCcm93c2VyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJyb3dzZXJFeHRlbnNpb25zTWFpblRyYW5zcG9ydE9wdGlvbnNcbiAgZXh0ZW5kcyBQYXJ0aWFsPFRyYW5zcG9ydE9wdGlvbnM8QnJvd3NlckV4dGVuc2lvbnNNYWluUG9ydD4+IHtcbiAgLyoqXG4gICAqIGJyb3dzZXIgZXh0ZW5zaW9uIEFQSS5cbiAgICovXG4gIGJyb3dzZXI/OiBCcm93c2VyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJyb3dzZXJFeHRlbnNpb25zQ2xpZW50VHJhbnNwb3J0T3B0aW9uc1xuICBleHRlbmRzIFBhcnRpYWw8VHJhbnNwb3J0T3B0aW9ucz4ge1xuICAvKipcbiAgICogYnJvd3NlciBleHRlbnNpb24gQVBJLlxuICAgKi9cbiAgYnJvd3Nlcj86IEJyb3dzZXI7XG4gIC8qKlxuICAgKiBicm93c2VyIGV4dGVuc2lvbiBjbGllbnQgcG9ydC5cbiAgICovXG4gIHBvcnQ/OiBQb3J0O1xufVxuXG5pbnRlcmZhY2UgQnJvd3NlckV4dGVuc2lvbnNNYWluUG9ydCB7XG4gIF9wb3J0PzogUG9ydDtcbn1cblxudHlwZSBDbGllbnRDYWxsYmFjayA9ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xudHlwZSBNYWluQ2FsbGJhY2sgPSAoY2xpZW50SWQ6IHN0cmluZykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCcm93c2VyRXh0ZW5zaW9uc0dlbmVyaWNUcmFuc3BvcnQ8XG4gIFQgZXh0ZW5kcyBCYXNlSW50ZXJhY3Rpb24gPSBhbnlcbj4gZXh0ZW5kcyBUcmFuc3BvcnQ8VD4ge1xuICBwcml2YXRlIFtjYWxsYmFja0tleV0hOiAob3B0aW9uczogTGlzdGVuZXJPcHRpb25zPFNlbmRSZXNwb25zZT4pID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoX29wdGlvbnM6IEJyb3dzZXJFeHRlbnNpb25zR2VuZXJpY1RyYW5zcG9ydE9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGJyb3dzZXIgPSBnbG9iYWwuYnJvd3NlciA/PyBnbG9iYWwuY2hyb21lLFxuICAgICAgbGlzdGVuZXIgPSBmdW5jdGlvbiAodGhpczogQnJvd3NlckV4dGVuc2lvbnNHZW5lcmljVHJhbnNwb3J0LCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzW2NhbGxiYWNrS2V5XSA9IGNhbGxiYWNrO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gKFxuICAgICAgICAgIGRhdGE6IExpc3RlbmVyT3B0aW9uczxTZW5kUmVzcG9uc2U+LFxuICAgICAgICAgIHNlbmRlcjogYnJvd3Nlci5ydW50aW1lLk1lc3NhZ2VTZW5kZXIgfCBjaHJvbWUucnVudGltZS5NZXNzYWdlU2VuZGVyLFxuICAgICAgICAgIHNlbmRSZXNwb25zZTogKHJlc3BvbnNlPzogU2VuZE9wdGlvbnM8U2VuZFJlc3BvbnNlPikgPT4gdm9pZFxuICAgICAgICApID0+IHtcbiAgICAgICAgICBkYXRhLl9zZW5kUmVzcG9uc2UgPSBzZW5kUmVzcG9uc2U7XG4gICAgICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kb2NzL2V4dGVuc2lvbnMvZGV2ZWxvcC9jb25jZXB0cy9tZXNzYWdpbmcjc2ltcGxlXG4gICAgICAgICAgLy8gc3VwcG9ydCBhc3luYyBjYWxsYmFja1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBicm93c2VyLnJ1bnRpbWUub25NZXNzYWdlLmFkZExpc3RlbmVyKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGJyb3dzZXIucnVudGltZS5vbk1lc3NhZ2UucmVtb3ZlTGlzdGVuZXIoaGFuZGxlcik7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgc2VuZGVyID0gZnVuY3Rpb24gKHRoaXM6IEJyb3dzZXJFeHRlbnNpb25zR2VuZXJpY1RyYW5zcG9ydCwgbWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZS5fc2VuZFJlc3BvbnNlKSB7XG4gICAgICAgICAgY29uc3Qgc2VuZFJlc3BvbnNlID0gbWVzc2FnZS5fc2VuZFJlc3BvbnNlO1xuICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLl9zZW5kUmVzcG9uc2U7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKG1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBicm93c2VyLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB0aGlzW2NhbGxiYWNrS2V5XSBhcyAocmVzcG9uc2U6IElSZXF1ZXN0PFNlbmRSZXNwb25zZT4pID0+IHZvaWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSBfb3B0aW9ucztcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbGlzdGVuZXIsXG4gICAgICBzZW5kZXIsXG4gICAgfSk7XG4gIH1cbn1cblxuY29uc3QgY29ubmVjdEV2ZW50TmFtZSA9ICdzaGFyZWR3b3JrZXItY29ubmVjdCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCcm93c2VyRXh0ZW5zaW9uc01haW5UcmFuc3BvcnQ8XG4gIFQgZXh0ZW5kcyBCYXNlSW50ZXJhY3Rpb24gPSBhbnlcbj4gZXh0ZW5kcyBUcmFuc3BvcnQ8VD4ge1xuICBwcm90ZWN0ZWQgcG9ydHMgPSBuZXcgTWFwPHN0cmluZywgUG9ydD4oKTtcblxuICBwcml2YXRlIFtjYWxsYmFja0tleV0hOiAoXG4gICAgb3B0aW9uczogTGlzdGVuZXJPcHRpb25zPEJyb3dzZXJFeHRlbnNpb25zTWFpblBvcnQ+XG4gICkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3Rvcihfb3B0aW9uczogQnJvd3NlckV4dGVuc2lvbnNNYWluVHJhbnNwb3J0T3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgYnJvd3NlciA9IGdsb2JhbC5icm93c2VyID8/IGdsb2JhbC5jaHJvbWUsXG4gICAgICBsaXN0ZW5lciA9IGZ1bmN0aW9uICh0aGlzOiBCcm93c2VyRXh0ZW5zaW9uc01haW5UcmFuc3BvcnQsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXNbY2FsbGJhY2tLZXldID0gY2FsbGJhY2s7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wb3J0cy5mb3JFYWNoKChwb3J0KSA9PiB7XG4gICAgICAgICAgICBwb3J0LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBzZW5kZXIgPSBmdW5jdGlvbiAodGhpczogQnJvd3NlckV4dGVuc2lvbnNNYWluVHJhbnNwb3J0LCBtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBtZXNzYWdlLl9leHRyYT8uX3BvcnQ7XG4gICAgICAgIGlmIChwb3J0KSB7XG4gICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuX3BvcnQ7XG4gICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBtZXNzYWdlLnR5cGUgPT09ICdyZXNwb25zZScgJiZcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgdGhpcy5wb3J0cy5oYXMobWVzc2FnZS5yZXF1ZXN0SWQpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdCBwb3J0ID0gdGhpcy5wb3J0cy5nZXQobWVzc2FnZS5yZXF1ZXN0SWQpITtcbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucG9ydHMuZm9yRWFjaCgocG9ydCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSBfb3B0aW9ucztcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbGlzdGVuZXIsXG4gICAgICBzZW5kZXIsXG4gICAgfSk7XG4gICAgYnJvd3Nlci5ydW50aW1lLm9uQ29ubmVjdC5hZGRMaXN0ZW5lcihhc3luYyAocG9ydDogUG9ydCkgPT4ge1xuICAgICAgaWYgKHBvcnQubmFtZSA9PT0gdHJhbnNwb3J0TmFtZSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGRhdGEuX2V4dHJhID0gZGF0YS5fZXh0cmEgPz8ge307XG4gICAgICAgICAgZGF0YS5fZXh0cmEuX3BvcnQgPSBwb3J0O1xuICAgICAgICAgIHRoaXNbY2FsbGJhY2tLZXldKGRhdGEgYXMgTGlzdGVuZXJPcHRpb25zPEJyb3dzZXJFeHRlbnNpb25zTWFpblBvcnQ+KTtcbiAgICAgICAgfTtcbiAgICAgICAgcG9ydC5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIoaGFuZGxlcik7XG4gICAgICAgIHBvcnQub25EaXNjb25uZWN0LmFkZExpc3RlbmVyKCgpID0+IHtcbiAgICAgICAgICBwb3J0Lm9uTWVzc2FnZS5yZW1vdmVMaXN0ZW5lcihoYW5kbGVyKTtcbiAgICAgICAgICB0aGlzLnBvcnRzLmZvckVhY2goKF9wb3J0LCBpZCkgPT4ge1xuICAgICAgICAgICAgaWYgKF9wb3J0ID09PSBwb3J0KSB7XG4gICAgICAgICAgICAgIHRoaXMucG9ydHMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9vbkRpc2Nvbm5lY3RDYWxsYmFjay5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soaWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGlkOiBzdHJpbmcgPSBhd2FpdCB0aGlzLmVtaXQoe1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBuYW1lOiBjb25uZWN0RXZlbnROYW1lLFxuICAgICAgICAgIF9leHRyYTogeyBfcG9ydDogcG9ydCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3J0cy5zZXQoaWQsIHBvcnQpO1xuICAgICAgICB0aGlzLl9vbkNvbm5lY3RDYWxsYmFjay5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKGlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbkNvbm5lY3RDYWxsYmFjayA9IG5ldyBTZXQ8TWFpbkNhbGxiYWNrPigpO1xuXG4gIG9uQ29ubmVjdChjYWxsYmFjazogTWFpbkNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25Db25uZWN0Q2FsbGJhY2suYWRkKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5fb25Db25uZWN0Q2FsbGJhY2suZGVsZXRlKGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfb25EaXNjb25uZWN0Q2FsbGJhY2sgPSBuZXcgU2V0PE1haW5DYWxsYmFjaz4oKTtcblxuICBvbkRpc2Nvbm5lY3QoY2FsbGJhY2s6IE1haW5DYWxsYmFjaykge1xuICAgIHRoaXMuX29uRGlzY29ubmVjdENhbGxiYWNrLmFkZChjYWxsYmFjayk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuX29uRGlzY29ubmVjdENhbGxiYWNrLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnJvd3NlckV4dGVuc2lvbnNDbGllbnRUcmFuc3BvcnQ8XG4gIFQgZXh0ZW5kcyBCYXNlSW50ZXJhY3Rpb24gPSBhbnlcbj4gZXh0ZW5kcyBUcmFuc3BvcnQ8VD4ge1xuICBjb25zdHJ1Y3Rvcihfb3B0aW9uczogQnJvd3NlckV4dGVuc2lvbnNDbGllbnRUcmFuc3BvcnRPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBicm93c2VyID0gZ2xvYmFsLmJyb3dzZXIgPz8gZ2xvYmFsLmNocm9tZSxcbiAgICAgIHBvcnQgPSBicm93c2VyLnJ1bnRpbWUuY29ubmVjdCh7IG5hbWU6IHRyYW5zcG9ydE5hbWUgfSksXG4gICAgICBsaXN0ZW5lciA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gKG9wdGlvbnM6IG9iamVjdCkgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMgYXMgTGlzdGVuZXJPcHRpb25zPHt9Pik7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQub25NZXNzYWdlLmFkZExpc3RlbmVyKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIHBvcnQub25NZXNzYWdlLnJlbW92ZUxpc3RlbmVyKGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHNlbmRlciA9IChtZXNzYWdlKSA9PiB7XG4gICAgICAgIHBvcnQucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSBfb3B0aW9ucztcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbGlzdGVuZXIsXG4gICAgICBzZW5kZXIsXG4gICAgfSk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMubGlzdGVuKGNvbm5lY3RFdmVudE5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9vbkNvbm5lY3RDYWxsYmFjay5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQ29ubmVjdENhbGxiYWNrID0gbmV3IFNldDxDbGllbnRDYWxsYmFjaz4oKTtcblxuICBvbkNvbm5lY3QoY2FsbGJhY2s6IENsaWVudENhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25Db25uZWN0Q2FsbGJhY2suYWRkKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5fb25Db25uZWN0Q2FsbGJhY2suZGVsZXRlKGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBCcm93c2VyRXh0ZW5zaW9uc1RyYW5zcG9ydCA9IHtcbiAgTWFpbjogQnJvd3NlckV4dGVuc2lvbnNNYWluVHJhbnNwb3J0LFxuICBDbGllbnQ6IEJyb3dzZXJFeHRlbnNpb25zQ2xpZW50VHJhbnNwb3J0LFxufTtcbiJdfQ==