UNPKG

data-transport

Version:
217 lines 28.4 kB
import { __assign, __awaiter, __extends, __generator, __rest } from "tslib"; import { callbackKey, prefixKey } from '../constant'; import { getAction, Transport } from '../transport'; var connectEventName = 'sharedworker-connect'; var disconnectEventName = 'sharedworker-disconnect'; var SharedWorkerClientTransport = /** @class */ (function (_super) { __extends(SharedWorkerClientTransport, _super); function SharedWorkerClientTransport(_options) { var _this = this; var worker = _options.worker, _a = _options.listener, listener = _a === void 0 ? function (callback) { var handler = function (_a) { var data = _a.data; callback(data); }; worker.port.addEventListener('message', handler); worker.port.start(); return function () { worker.port.removeEventListener('message', handler); }; } : _a, _b = _options.sender, sender = _b === void 0 ? function (message) { var _a; var transfer = (_a = message.transfer) !== null && _a !== void 0 ? _a : []; delete message.transfer; worker.port.postMessage(message, transfer); } : _b, options = __rest(_options, ["worker", "listener", "sender"]); _this = _super.call(this, __assign(__assign({}, options), { listener: listener, sender: sender })) || this; _this._connected = false; _this._onConnectCallback = new Set(); // do not use `unload` event // https://developer.chrome.com/docs/web-platform/deprecating-unload window.addEventListener('pagehide', function () { // @ts-ignore _this.emit({ name: disconnectEventName, respond: false }, _this.id); }); // @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._handleConnect(); }); return [2 /*return*/, this.id]; }); }); }); // ensure the connect event is sent when the client connect to the worker // @ts-ignore _this.emit({ name: connectEventName, respond: false, silent: true }); return _this; } SharedWorkerClientTransport.prototype._handleConnect = function () { if (this._connected) return; this._connected = true; this._onConnectCallback.forEach(function (callback) { callback(); }); }; SharedWorkerClientTransport.prototype.onConnect = function (callback) { var _this = this; this._onConnectCallback.add(callback); return function () { _this._onConnectCallback.delete(callback); }; }; return SharedWorkerClientTransport; }(Transport)); export { SharedWorkerClientTransport }; var SharedWorkerInternalTransport = /** @class */ (function (_super) { __extends(SharedWorkerInternalTransport, _super); function SharedWorkerInternalTransport(_options) { if (_options === void 0) { _options = {}; } var _this = this; var _a = _options.listener, listener = _a === void 0 ? function (callback) { var _this = this; this[callbackKey] = callback; return function () { _this.ports.forEach(function (port) { port._handler && port.removeEventListener('message', port._handler); delete port._handler; }); self.close(); }; } : _a, _b = _options.sender, sender = _b === void 0 ? function (message) { var _a, _b; var transfer = (_a = message.transfer) !== null && _a !== void 0 ? _a : []; delete message.transfer; var port = (_b = message._extra) === null || _b === void 0 ? void 0 : _b._port; // pick a client port for sender. if (port) { delete message._extra._port; port.postMessage(message, transfer); } 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, transfer); } else { _this.ports.forEach(function (port) { try { port.postMessage(message, transfer); } catch (error) { console.error(error); } }); _this.tempPorts.forEach(function (port) { try { port.postMessage(message, transfer); } catch (error) { console.error(error); } }); } } : _b, options = __rest(_options, ["listener", "sender"]); _this = _super.call(this, __assign(__assign({}, options), { listener: listener, sender: sender })) || this; _this.ports = new Map(); _this.tempPorts = new Set(); _this._onConnectCallback = new Set(); _this._onDisconnectCallback = new Set(); var disconnectAction = getAction(_this[prefixKey], disconnectEventName); var connectEvent = getAction(_this[prefixKey], connectEventName); self.addEventListener('connect', function (e) { return __awaiter(_this, void 0, void 0, function () { var port, id, err_1; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: port = e.ports[0]; port._handler = function (_a) { var _b; var data = _a.data; if (data.hasRespond) { data._extra = (_b = data._extra) !== null && _b !== void 0 ? _b : {}; data._extra._port = port; } if (data.action === disconnectAction && _this.ports.has(data.requestId)) { // clear port and clientId when the port's client is disconnected. _this.ports.delete(data.requestId); _this._onDisconnectCallback.forEach(function (callback) { callback(data.requestId); }); } if (data.type === 'request' && data.action === connectEvent) { _this.emit({ // @ts-ignore name: connectEventName, _extra: { _port: port }, silent: true, respond: false, }); _this._handleConnect(data.requestId, port); } _this[callbackKey](data); }; port.addEventListener('message', port._handler); port.start(); this.tempPorts.add(port); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, this.emit({ // @ts-ignore name: connectEventName, _extra: { _port: port }, silent: true, })]; case 2: id = _a.sent(); this._handleConnect(id, port); return [3 /*break*/, 4]; case 3: err_1 = _a.sent(); this.tempPorts.delete(port); console.error(err_1); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }); return _this; } SharedWorkerInternalTransport.prototype.onConnect = function (callback) { var _this = this; this._onConnectCallback.add(callback); return function () { _this._onConnectCallback.delete(callback); }; }; SharedWorkerInternalTransport.prototype._handleConnect = function (id, port) { if (id && !this.ports.has(id)) { this.ports.set(id, port); this.tempPorts.delete(port); this._onConnectCallback.forEach(function (callback) { callback(id); }); } }; SharedWorkerInternalTransport.prototype.onDisconnect = function (callback) { var _this = this; this._onDisconnectCallback.add(callback); return function () { _this._onDisconnectCallback.delete(callback); }; }; return SharedWorkerInternalTransport; }(Transport)); export { SharedWorkerInternalTransport }; export var SharedWorkerTransport = { Client: SharedWorkerClientTransport, Worker: SharedWorkerInternalTransport, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkV29ya2VyVHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydHMvc2hhcmVkV29ya2VyVHJhbnNwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVFyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQWtCcEQsSUFBTSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQztBQUNoRCxJQUFNLG1CQUFtQixHQUFHLHlCQUF5QixDQUFDO0FBS3REO0lBRVUsK0NBQVk7SUFDcEIscUNBQVksUUFBNEM7UUFBeEQsaUJBMkNDO1FBekNHLElBQUEsTUFBTSxHQW1CSixRQUFRLE9BbkJKLEVBQ04sS0FrQkUsUUFBUSxTQVBULEVBWEQsUUFBUSxtQkFBRyxVQUFDLFFBQVE7WUFDbEIsSUFBTSxPQUFPLEdBQUcsVUFBQyxFQUVtQztvQkFEbEQsSUFBSSxVQUFBO2dCQUVKLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQixDQUFDLENBQUM7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BCLE9BQU87Z0JBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxLQUFBLEVBQ0QsS0FNRSxRQUFRLE9BRlQsRUFKRCxNQUFNLG1CQUFHLFVBQUMsT0FBTzs7WUFDZixJQUFNLFFBQVEsR0FBRyxNQUFBLE9BQU8sQ0FBQyxRQUFRLG1DQUFJLEVBQUUsQ0FBQztZQUN4QyxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDeEIsTUFBTSxDQUFD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TUFBTSxFQUFFLDJCQUEyQjtJQUNuQyxNQUFNLEVBQUUsNkJBQTZCO0NBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjYWxsYmFja0tleSwgcHJlZml4S2V5IH0gZnJvbSAnLi4vY29uc3RhbnQnO1xuaW1wb3J0IHsgbGlzdGVuIH0gZnJvbSAnLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBUcmFuc3BvcnRPcHRpb25zLFxuICBUcmFuc2ZlcmFibGVXb3JrZXIsXG4gIExpc3RlbmVyT3B0aW9ucyxcbiAgQmFzZUludGVyYWN0aW9uLFxufSBmcm9tICcuLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0QWN0aW9uLCBUcmFuc3BvcnQgfSBmcm9tICcuLi90cmFuc3BvcnQnO1xuXG5kZWNsYXJlIHZhciBzZWxmOiBTaGFyZWRXb3JrZXJHbG9iYWxTY29wZTtcbmludGVyZmFjZSBTaGFyZWRXb3JrZXJQb3J0IGV4dGVuZHMgVHJhbnNmZXJhYmxlV29ya2VyIHtcbiAgX3BvcnQ/OiBNZXNzYWdlUG9ydDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZWRXb3JrZXJDbGllbnRUcmFuc3BvcnRPcHRpb25zXG4gIGV4dGVuZHMgUGFydGlhbDxUcmFuc3BvcnRPcHRpb25zPFRyYW5zZmVyYWJsZVdvcmtlcj4+IHtcbiAgLyoqXG4gICAqIFBhc3MgYSBzaGFyZWQgd29ya2VyIGluc3RhbmNlIGZvciBkYXRhIHRyYW5zcG9ydC5cbiAgICovXG4gIHdvcmtlcjogU2hhcmVkV29ya2VyO1xufVxuXG50eXBlIENsaWVudENhbGxiYWNrID0gKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG50eXBlIFdvcmtlckNhbGxiYWNrID0gKGNsaWVudElkOiBzdHJpbmcpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG5jb25zdCBjb25uZWN0RXZlbnROYW1lID0gJ3NoYXJlZHdvcmtlci1jb25uZWN0JztcbmNvbnN0IGRpc2Nvbm5lY3RFdmVudE5hbWUgPSAnc2hhcmVkd29ya2VyLWRpc2Nvbm5lY3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZFdvcmtlckludGVybmFsVHJhbnNwb3J0T3B0aW9uc1xuICBleHRlbmRzIFBhcnRpYWw8VHJhbnNwb3J0T3B0aW9uczxTaGFyZWRXb3JrZXJQb3J0Pj4ge31cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYXJlZFdvcmtlckNsaWVudFRyYW5zcG9ydDxcbiAgVCBleHRlbmRzIEJhc2VJbnRlcmFjdGlvbiA9IGFueVxuPiBleHRlbmRzIFRyYW5zcG9ydDxUPiB7XG4gIGNvbnN0cnVjdG9yKF9vcHRpb25zOiBTaGFyZWRXb3JrZXJDbGllbnRUcmFuc3BvcnRPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgd29ya2VyLFxuICAgICAgbGlzdGVuZXIgPSAoY2FsbGJhY2spID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9ICh7XG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgfTogTWVzc2FnZUV2ZW50PExpc3RlbmVyT3B0aW9uczxUcmFuc2ZlcmFibGVXb3JrZXI+PikgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICB9O1xuICAgICAgICB3b3JrZXIucG9ydC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgIHdvcmtlci5wb3J0LnN0YXJ0KCk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgd29ya2VyLnBvcnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHNlbmRlciA9IChtZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyID0gbWVzc2FnZS50cmFuc2ZlciA/PyBbXTtcbiAgICAgICAgZGVsZXRlIG1lc3NhZ2UudHJhbnNmZXI7XG4gICAgICAgIHdvcmtlci5wb3J0LnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVyKTtcbiAgICAgIH0sXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSA9IF9vcHRpb25zO1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBsaXN0ZW5lcixcbiAgICAgIHNlbmRlcixcbiAgICB9KTtcbiAgICAvLyBkbyBub3QgdXNlIGB1bmxvYWRgIGV2ZW50XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kb2NzL3dlYi1wbGF0Zm9ybS9kZXByZWNhdGluZy11bmxvYWRcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCAoKSA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLmVtaXQoeyBuYW1lOiBkaXNjb25uZWN0RXZlbnROYW1lLCByZXNwb25kOiBmYWxzZSB9LCB0aGlzLmlkKTtcbiAgICB9KTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5saXN0ZW4oY29ubmVjdEV2ZW50TmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2hhbmRsZUNvbm5lY3QoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfSk7XG4gICAgLy8gZW5zdXJlIHRoZSBjb25uZWN0IGV2ZW50IGlzIHNlbnQgd2hlbiB0aGUgY2xpZW50IGNvbm5lY3QgdG8gdGhlIHdvcmtlclxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmVtaXQoeyBuYW1lOiBjb25uZWN0RXZlbnROYW1lLCByZXNwb25kOiBmYWxzZSwgc2lsZW50OiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ29ubmVjdCgpIHtcbiAgICBpZiAodGhpcy5fY29ubmVjdGVkKSByZXR1cm47XG4gICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9vbkNvbm5lY3RDYWxsYmFjay5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2Nvbm5lY3RlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX29uQ29ubmVjdENhbGxiYWNrID0gbmV3IFNldDxDbGllbnRDYWxsYmFjaz4oKTtcblxuICBvbkNvbm5lY3QoY2FsbGJhY2s6IENsaWVudENhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25Db25uZWN0Q2FsbGJhY2suYWRkKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5fb25Db25uZWN0Q2FsbGJhY2suZGVsZXRlKGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG59XG5cbmludGVyZmFjZSBTaGFyZWRXb3JrZXJUcmFuc3BvcnRQb3J0IGV4dGVuZHMgTWVzc2FnZVBvcnQge1xuICBfaGFuZGxlcj86IChvcHRpb25zOiBNZXNzYWdlRXZlbnQ8TGlzdGVuZXJPcHRpb25zPFNoYXJlZFdvcmtlclBvcnQ+PikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNoYXJlZFdvcmtlckludGVybmFsVHJhbnNwb3J0PFxuICBUIGV4dGVuZHMgQmFzZUludGVyYWN0aW9uID0gYW55XG4+IGV4dGVuZHMgVHJhbnNwb3J0PFQ+IHtcbiAgcHJvdGVjdGVkIHBvcnRzID0gbmV3IE1hcDxzdHJpbmcsIE1lc3NhZ2VQb3J0PigpO1xuICBwcm90ZWN0ZWQgdGVtcFBvcnRzID0gbmV3IFNldDxNZXNzYWdlUG9ydD4oKTtcbiAgcHJpdmF0ZSBbY2FsbGJhY2tLZXldITogKG9wdGlvbnM6IExpc3RlbmVyT3B0aW9uczxTaGFyZWRXb3JrZXJQb3J0PikgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3Rvcihfb3B0aW9uczogU2hhcmVkV29ya2VySW50ZXJuYWxUcmFuc3BvcnRPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBsaXN0ZW5lciA9IGZ1bmN0aW9uICh0aGlzOiBTaGFyZWRXb3JrZXJJbnRlcm5hbFRyYW5zcG9ydCwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpc1tjYWxsYmFja0tleV0gPSBjYWxsYmFjaztcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICB0aGlzLnBvcnRzLmZvckVhY2goKHBvcnQ6IFNoYXJlZFdvcmtlclRyYW5zcG9ydFBvcnQpID0+IHtcbiAgICAgICAgICAgIHBvcnQuX2hhbmRsZXIgJiYgcG9ydC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcG9ydC5faGFuZGxlcik7XG4gICAgICAgICAgICBkZWxldGUgcG9ydC5faGFuZGxlcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZWxmLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgc2VuZGVyID0gKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXIgPSBtZXNzYWdlLnRyYW5zZmVyID8/IFtdO1xuICAgICAgICBkZWxldGUgbWVzc2FnZS50cmFuc2ZlcjtcbiAgICAgICAgY29uc3QgcG9ydCA9IG1lc3NhZ2UuX2V4dHJhPy5fcG9ydDtcbiAgICAgICAgLy8gcGljayBhIGNsaWVudCBwb3J0IGZvciBzZW5kZXIuXG4gICAgICAgIGlmIChwb3J0KSB7XG4gICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuX2V4dHJhIS5fcG9ydDtcbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBtZXNzYWdlLnR5cGUgPT09ICdyZXNwb25zZScgJiZcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgdGhpcy5wb3J0cy5oYXMobWVzc2FnZS5yZXF1ZXN0SWQpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdCBwb3J0ID0gdGhpcy5wb3J0cy5nZXQobWVzc2FnZS5yZXF1ZXN0SWQpITtcbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBvcnRzLmZvckVhY2goKHBvcnQpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy50ZW1wUG9ydHMuZm9yRWFjaCgocG9ydCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZShtZXNzYWdlLCB0cmFuc2Zlcik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9ID0gX29wdGlvbnM7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgc2VuZGVyLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGlzY29ubmVjdEFjdGlvbiA9IGdldEFjdGlvbih0aGlzW3ByZWZpeEtleV0hLCBkaXNjb25uZWN0RXZlbnROYW1lKTtcbiAgICBjb25zdCBjb25uZWN0RXZlbnQgPSBnZXRBY3Rpb24odGhpc1twcmVmaXhLZXldISwgY29ubmVjdEV2ZW50TmFtZSk7XG4gICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdjb25uZWN0JywgYXN5bmMgKGUpID0+IHtcbiAgICAgIGNvbnN0IHBvcnQ6IFNoYXJlZFdvcmtlclRyYW5zcG9ydFBvcnQgPSBlLnBvcnRzWzBdO1xuICAgICAgcG9ydC5faGFuZGxlciA9ICh7XG4gICAgICAgIGRhdGEsXG4gICAgICB9OiBNZXNzYWdlRXZlbnQ8TGlzdGVuZXJPcHRpb25zPFNoYXJlZFdvcmtlclBvcnQ+PikgPT4ge1xuICAgICAgICBpZiAoZGF0YS5oYXNSZXNwb25kKSB7XG4gICAgICAgICAgZGF0YS5fZXh0cmEgPSBkYXRhLl9leHRyYSA/PyB7fTtcbiAgICAgICAgICBkYXRhLl9leHRyYS5fcG9ydCA9IHBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEuYWN0aW9uID09PSBkaXNjb25uZWN0QWN0aW9uICYmXG4gICAgICAgICAgdGhpcy5wb3J0cy5oYXMoZGF0YS5yZXF1ZXN0SWQpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGNsZWFyIHBvcnQgYW5kIGNsaWVudElkIHdoZW4gdGhlIHBvcnQncyBjbGllbnQgaXMgZGlzY29ubmVjdGVkLlxuICAgICAgICAgIHRoaXMucG9ydHMuZGVsZXRlKGRhdGEucmVxdWVzdElkKTtcbiAgICAgICAgICB0aGlzLl9vbkRpc2Nvbm5lY3RDYWxsYmFjay5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZGF0YS5yZXF1ZXN0SWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdyZXF1ZXN0JyAmJiBkYXRhLmFjdGlvbiA9PT0gY29ubmVjdEV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5lbWl0KHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5hbWU6IGNvbm5lY3RFdmVudE5hbWUsXG4gICAgICAgICAgICBfZXh0cmE6IHsgX3BvcnQ6IHBvcnQgfSxcbiAgICAgICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3BvbmQ6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX2hhbmRsZUNvbm5lY3QoZGF0YS5yZXF1ZXN0SWQsIHBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXNbY2FsbGJhY2tLZXldKGRhdGEpO1xuICAgICAgfTtcbiAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHBvcnQuX2hhbmRsZXIpO1xuICAgICAgcG9ydC5zdGFydCgpO1xuICAgICAgdGhpcy50ZW1wUG9ydHMuYWRkKHBvcnQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gYmVjYXVzZSBwYXJhbWV0ZXJzIGlzIHVua25vd25cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gYXdhaXQgdGhpcy5lbWl0KHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgbmFtZTogY29ubmVjdEV2ZW50TmFtZSxcbiAgICAgICAgICBfZXh0cmE6IHsgX3BvcnQ6IHBvcnQgfSxcbiAgICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9oYW5kbGVDb25uZWN0KGlkLCBwb3J0KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLnRlbXBQb3J0cy5kZWxldGUocG9ydCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQ29ubmVjdENhbGxiYWNrID0gbmV3IFNldDxXb3JrZXJDYWxsYmFjaz4oKTtcblxuICBvbkNvbm5lY3QoY2FsbGJhY2s6IFdvcmtlckNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25Db25uZWN0Q2FsbGJhY2suYWRkKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5fb25Db25uZWN0Q2FsbGJhY2suZGVsZXRlKGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ29ubmVjdChpZDogc3RyaW5nLCBwb3J0OiBNZXNzYWdlUG9ydCkge1xuICAgIGlmIChpZCAmJiAhdGhpcy5wb3J0cy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLnBvcnRzLnNldChpZCwgcG9ydCk7XG4gICAgICB0aGlzLnRlbXBQb3J0cy5kZWxldGUocG9ydCk7XG4gICAgICB0aGlzLl9vbkNvbm5lY3RDYWxsYmFjay5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICBjYWxsYmFjayhpZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9vbkRpc2Nvbm5lY3RDYWxsYmFjayA9IG5ldyBTZXQ8V29ya2VyQ2FsbGJhY2s+KCk7XG5cbiAgb25EaXNjb25uZWN0KGNhbGxiYWNrOiBXb3JrZXJDYWxsYmFjaykge1xuICAgIHRoaXMuX29uRGlzY29ubmVjdENhbGxiYWNrLmFkZChjYWxsYmFjayk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuX29uRGlzY29ubmVjdENhbGxiYWNrLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU2hhcmVkV29ya2VyVHJhbnNwb3J0ID0ge1xuICBDbGllbnQ6IFNoYXJlZFdvcmtlckNsaWVudFRyYW5zcG9ydCxcbiAgV29ya2VyOiBTaGFyZWRXb3JrZXJJbnRlcm5hbFRyYW5zcG9ydCxcbn07XG4iXX0=