use-stomp
Version:
react provider, class decorator, and a hook for websockets using the stomp protocol
370 lines (307 loc) • 37.9 kB
JavaScript
import "core-js/modules/es.array.concat";
import "core-js/modules/es.array.filter";
import "core-js/modules/es.array.for-each";
import "core-js/modules/es.array.includes";
import "core-js/modules/es.array.map";
import "core-js/modules/es.object.get-own-property-descriptor";
import "core-js/modules/es.string.includes";
import "core-js/modules/web.dom-collections.for-each";
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
import _inherits from "@babel/runtime/helpers/inherits";
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
import _wrapNativeSuper from "@babel/runtime/helpers/wrapNativeSuper";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
import { v4 } from 'uuid';
import { Events, States } from './webSocketConfigs';
var WebSocketWorker = /*#__PURE__*/function (_SharedWorker) {
_inherits(WebSocketWorker, _SharedWorker);
var _super = _createSuper(WebSocketWorker);
function WebSocketWorker(_props) {
var _this$_workerEvents;
var _this;
_classCallCheck(this, WebSocketWorker);
_this = _super.call(this, 'webSocketWorkerInstance.js');
_this._channels = {};
_this._connected = false;
_this._id = v4();
_this._onConnected = function () {};
_this._onDisconnected = function () {};
_this._onSyncState = function (state) {};
_this._syncChannels = {};
_this._syncMessages = {};
_this.connect = function () {
_this.port.postMessage({
type: Events.CONNECT
});
};
_this.destroy = function () {
_this._unregister();
_this.port.removeEventListener('message', _this._onMessage);
document.removeEventListener('visibilitychange', _this._setVisibility);
window.removeEventListener('beforeunload', _this._unregister);
};
_this.disconnect = function () {
_this.port.postMessage({
type: Events.DISCONNECT
});
};
_this.testDisconnect = function () {
_this.port.postMessage({
type: Events.TEST_DISCONNECT
});
};
_this.dismiss = function (channel, id) {
_this.port.postMessage({
type: Events.DISMISS_SYNC,
payload: {
channel: channel,
id: id
}
});
};
_this.send = function (channel, message) {
_this.port.postMessage({
type: Events.SEND_MESSAGE,
payload: {
channel: channel,
message: message
}
});
};
_this.setAuthHeader = function (authHeader) {
_this.port.postMessage({
type: Events.SET_AUTH_HEADER,
payload: authHeader
});
};
_this.setHeader = function (header) {
_this.port.postMessage({
type: Events.SET_HEADER,
payload: header
});
};
_this.setUrl = function (url) {
_this.port.postMessage({
type: Events.SET_URL,
payload: url
});
};
_this.subscribe = function (channel, callback) {
if (!(_this._channels[channel] || []).length) {
_this._channels[channel] = [callback];
_this.port.postMessage({
type: Events.SUBSCRIBE,
payload: {
id: _this._id,
channel: channel
}
});
} else {
_this._channels[channel] = [].concat(_toConsumableArray(_this._channels[channel]), [callback]);
}
return function () {
_this._channels[channel] = (_this._channels[channel] || []).filter(function (fn) {
return fn !== callback;
});
if (!_this._channels[channel].length) {
_this.unsubscribe(channel);
}
};
};
_this.subscribeSync = function (channel, callback) {
var fn = function fn(messages) {
var oldMessages = _this._syncMessages[channel] || [];
var oldIds = oldMessages.map(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("oldIds", function (msg) {
return msg.id;
}));
_this._syncMessages[channel] = messages;
var newIds = (_this._syncMessages[channel] || []).map(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("newIds", function (msg) {
return msg.id;
}));
var add = messages.filter(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("add", function (_ref) {
var id = _ref.id;
return !oldIds.includes(id) && newIds.includes(id);
}));
var remove = oldMessages.filter(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("remove", function (_ref2) {
var id = _ref2.id;
return !newIds.includes(id) && oldIds.includes(id);
}));
callback(messages, add, remove);
};
if (!(_this._syncChannels[channel] || []).length) {
_this._syncChannels[channel] = [fn];
_this.port.postMessage({
type: Events.SUBSCRIBE_SYNC,
payload: {
id: _this._id,
channel: channel
}
});
} else {
_this._syncChannels[channel] = [].concat(_toConsumableArray(_this._syncChannels[channel]), [fn]);
}
return function () {
_this._syncChannels[channel] = (_this._syncChannels[channel] || []).filter(function (callback) {
return callback !== fn;
});
if (!_this._syncChannels[channel].length) {
_this.unsubscribeSync(channel);
}
};
};
_this.unsubscribe = function (channel) {
_this.port.postMessage({
type: Events.UNSUBSCRIBE,
payload: {
id: _this._id,
channel: channel
}
});
};
_this.unsubscribeSync = function (channel) {
_this.port.postMessage({
type: Events.UNSUBSCRIBE_SYNC,
payload: {
id: _this._id,
channel: channel
}
});
};
_this._onMessage = function (event) {
if (_this._workerEvents[event.data.type]) {
_this._workerEvents[event.data.type](event);
}
};
_this._register = function (props) {
_this.port.postMessage({
type: Events.REGISTER,
payload: {
id: _this._id,
reconnectInterval: props.reconnectInterval,
reconnectMaxAttempts: props.reconnectMaxAttempts,
visibility: document.visibilityState === 'visible'
}
});
};
_this._setError = function (event) {
console.error('[use-stomp]', event.data.payload);
};
_this._setVisibility = function () {
_this.port.postMessage({
type: Events.SET_VISIBILITY,
payload: {
id: _this._id,
visibility: document.visibilityState === 'visible'
}
});
};
_this._setMessage = function (event) {
if (_this._channels[event.data.payload.channel]) {
_this._channels[event.data.payload.channel].forEach(function (fn) {
return fn(event.data.payload.message);
});
}
if (_this._syncChannels[event.data.payload.channel]) {
_this._syncChannels[event.data.payload.channel].forEach(function (fn) {
fn((event.data.payload.message || []).map(function (_ref3) {
var message = _ref3.message,
item = _objectWithoutProperties(_ref3, ["message"]);
return _objectSpread(_objectSpread({}, item), {}, {
content: message,
dismiss: function dismiss() {
return _this.dismiss(event.data.payload.channel, item.id);
}
});
}));
});
}
};
_this._setConnection = function (event) {
var wasConnected = !!_this._connected;
switch (event.data.payload) {
case States.CONNECTED:
_this._connected = true;
break;
case States.CONNECTING:
_this._connected = false;
break;
case States.DISCONNECTED:
_this._connected = false;
break;
case States.DISCONNECTING:
_this._connected = false;
break;
}
if (!wasConnected && _this._connected) {
_this._onConnected();
}
if (wasConnected && !_this._connected) {
_this._onDisconnected();
}
};
_this._unregister = function () {
_this.port.postMessage({
type: Events.UNREGISTER,
payload: {
id: _this._id
}
});
};
_this._workerEvents = (_this$_workerEvents = {}, _defineProperty(_this$_workerEvents, Events.CONNECTION, _this._setConnection), _defineProperty(_this$_workerEvents, Events.ERROR, _this._setError), _defineProperty(_this$_workerEvents, Events.MESSAGE, _this._setMessage), _this$_workerEvents);
if (_props !== null && _props !== void 0 && _props.onConnected) {
_this._onConnected = _props.onConnected;
}
if (_props !== null && _props !== void 0 && _props.onDisconnected) {
_this._onDisconnected = _props.onDisconnected;
}
if (_props !== null && _props !== void 0 && _props.onSyncState) {
_this._onSyncState = _props.onSyncState;
}
_this.port.start();
_this.port.addEventListener('message', _this._onMessage);
_this._register({
reconnectMaxAttempts: _props.reconnectMaxAttempts || 10,
reconnectInterval: _props.reconnectInterval || 10000
});
if (_props.url) {
_this.setUrl(_props.url);
}
document.addEventListener('visibilitychange', _this._setVisibility);
window.addEventListener('beforeunload', _this._unregister);
return _this;
}
return WebSocketWorker;
}( /*#__PURE__*/_wrapNativeSuper(SharedWorker));
export { WebSocketWorker as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJTb2NrZXRXb3JrZXIudHMiXSwibmFtZXMiOlsidjQiLCJFdmVudHMiLCJTdGF0ZXMiLCJXZWJTb2NrZXRXb3JrZXIiLCJwcm9wcyIsIl9jaGFubmVscyIsIl9jb25uZWN0ZWQiLCJfaWQiLCJfb25Db25uZWN0ZWQiLCJfb25EaXNjb25uZWN0ZWQiLCJfb25TeW5jU3RhdGUiLCJzdGF0ZSIsIl9zeW5jQ2hhbm5lbHMiLCJfc3luY01lc3NhZ2VzIiwiY29ubmVjdCIsInBvcnQiLCJwb3N0TWVzc2FnZSIsInR5cGUiLCJDT05ORUNUIiwiZGVzdHJveSIsIl91bnJlZ2lzdGVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9vbk1lc3NhZ2UiLCJkb2N1bWVudCIsIl9zZXRWaXNpYmlsaXR5Iiwid2luZG93IiwiZGlzY29ubmVjdCIsIkRJU0NPTk5FQ1QiLCJ0ZXN0RGlzY29ubmVjdCIsIlRFU1RfRElTQ09OTkVDVCIsImRpc21pc3MiLCJjaGFubmVsIiwiaWQiLCJESVNNSVNTX1NZTkMiLCJwYXlsb2FkIiwic2VuZCIsIm1lc3NhZ2UiLCJTRU5EX01FU1NBR0UiLCJzZXRBdXRoSGVhZGVyIiwiYXV0aEhlYWRlciIsIlNFVF9BVVRIX0hFQURFUiIsInNldEhlYWRlciIsImhlYWRlciIsIlNFVF9IRUFERVIiLCJzZXRVcmwiLCJ1cmwiLCJTRVRfVVJMIiwic3Vic2NyaWJlIiwiY2FsbGJhY2siLCJsZW5ndGgiLCJTVUJTQ1JJQkUiLCJmaWx0ZXIiLCJmbiIsInVuc3Vic2NyaWJlIiwic3Vic2NyaWJlU3luYyIsIm1lc3NhZ2VzIiwib2xkTWVzc2FnZXMiLCJvbGRJZHMiLCJtYXAiLCJtc2ciLCJuZXdJZHMiLCJhZGQiLCJpbmNsdWRlcyIsInJlbW92ZSIsIlNVQlNDUklCRV9TWU5DIiwidW5zdWJzY3JpYmVTeW5jIiwiVU5TVUJTQ1JJQkUiLCJVTlNVQlNDUklCRV9TWU5DIiwiZXZlbnQiLCJfd29ya2VyRXZlbnRzIiwiZGF0YSIsIl9yZWdpc3RlciIsIlJFR0lTVEVSIiwicmVjb25uZWN0SW50ZXJ2YWwiLCJyZWNvbm5lY3RNYXhBdHRlbXB0cyIsInZpc2liaWxpdHkiLCJ2aXNpYmlsaXR5U3RhdGUiLCJfc2V0RXJyb3IiLCJjb25zb2xlIiwiZXJyb3IiLCJTRVRfVklTSUJJTElUWSIsIl9zZXRNZXNzYWdlIiwiZm9yRWFjaCIsIml0ZW0iLCJjb250ZW50IiwiX3NldENvbm5lY3Rpb24iLCJ3YXNDb25uZWN0ZWQiLCJDT05ORUNURUQiLCJDT05ORUNUSU5HIiwiRElTQ09OTkVDVEVEIiwiRElTQ09OTkVDVElORyIsIlVOUkVHSVNURVIiLCJDT05ORUNUSU9OIiwiRVJST1IiLCJNRVNTQUdFIiwib25Db25uZWN0ZWQiLCJvbkRpc2Nvbm5lY3RlZCIsIm9uU3luY1N0YXRlIiwic3RhcnQiLCJhZGRFdmVudExpc3RlbmVyIiwiU2hhcmVkV29ya2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBUUEsRUFBUixRQUFpQixNQUFqQjtBQUdBLFNBQVFDLE1BQVIsRUFBZ0JDLE1BQWhCLFFBQTZCLG9CQUE3Qjs7SUFXcUJDLGU7Ozs7O0FBaUJqQiwyQkFBWUMsTUFBWixFQUEwQztBQUFBOztBQUFBOztBQUFBOztBQUN0Qyw4QkFBTSw0QkFBTjtBQURzQyxVQWhCMUNDLFNBZ0IwQyxHQWhCOUIsRUFnQjhCO0FBQUEsVUFkMUNDLFVBYzBDLEdBZDdCLEtBYzZCO0FBQUEsVUFaMUNDLEdBWTBDLEdBWnBDUCxFQUFFLEVBWWtDOztBQUFBLFVBVjFDUSxZQVUwQyxHQVYzQixZQUFNLENBQUUsQ0FVbUI7O0FBQUEsVUFSMUNDLGVBUTBDLEdBUnhCLFlBQU0sQ0FBRSxDQVFnQjs7QUFBQSxVQU4xQ0MsWUFNMEMsR0FOM0IsVUFBQ0MsS0FBRCxFQUFnQixDQUFFLENBTVM7O0FBQUEsVUFKMUNDLGFBSTBDLEdBSjFCLEVBSTBCO0FBQUEsVUFGMUNDLGFBRTBDLEdBRjFCLEVBRTBCOztBQUFBLFVBZ0MxQ0MsT0FoQzBDLEdBZ0No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ZTs7QUFHdEMsUUFBSTdFLE1BQUosYUFBSUEsTUFBSixlQUFJQSxNQUFLLENBQUUyRixXQUFYLEVBQXdCO0FBQ3BCLFlBQUt2RixZQUFMLEdBQW9CSixNQUFLLENBQUMyRixXQUExQjtBQUNIOztBQUVELFFBQUkzRixNQUFKLGFBQUlBLE1BQUosZUFBSUEsTUFBSyxDQUFFNEYsY0FBWCxFQUEyQjtBQUN2QixZQUFLdkYsZUFBTCxHQUF1QkwsTUFBSyxDQUFDNEYsY0FBN0I7QUFDSDs7QUFFRCxRQUFJNUYsTUFBSixhQUFJQSxNQUFKLGVBQUlBLE1BQUssQ0FBRTZGLFdBQVgsRUFBd0I7QUFDcEIsWUFBS3ZGLFlBQUwsR0FBb0JOLE1BQUssQ0FBQzZGLFdBQTFCO0FBQ0g7O0FBRUQsVUFBS2xGLElBQUwsQ0FBVW1GLEtBQVY7O0FBRUEsVUFBS25GLElBQUwsQ0FBVW9GLGdCQUFWLENBQTJCLFNBQTNCLEVBQXNDLE1BQUs3RSxVQUEzQzs7QUFFQSxVQUFLaUQsU0FBTCxDQUFlO0FBQ1hHLE1BQUFBLG9CQUFvQixFQUFFdEUsTUFBSyxDQUFDc0Usb0JBQU4sSUFBOEIsRUFEekM7QUFFWEQsTUFBQUEsaUJBQWlCLEVBQUVyRSxNQUFLLENBQUNxRSxpQkFBTixJQUEyQjtBQUZuQyxLQUFmOztBQUtBLFFBQUlyRSxNQUFLLENBQUN5QyxHQUFWLEVBQWU7QUFDWCxZQUFLRCxNQUFMLENBQVl4QyxNQUFLLENBQUN5QyxHQUFsQjtBQUNIOztBQUVEdEIsSUFBQUEsUUFBUSxDQUFDNEUsZ0JBQVQsQ0FBMEIsa0JBQTFCLEVBQThDLE1BQUszRSxjQUFuRDtBQUNBQyxJQUFBQSxNQUFNLENBQUMwRSxnQkFBUCxDQUF3QixjQUF4QixFQUF3QyxNQUFLL0UsV0FBN0M7QUE3QnNDO0FBOEJ6Qzs7O2lDQS9Dd0NnRixZOztTQUF4QmpHLGUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3Y0fSBmcm9tICd1dWlkJztcblxuaW1wb3J0IHtTdG9tcE5vdGlmaWNhdGlvbn0gZnJvbSAnLi91c2VTdG9tcE5vdGlmaWNhdGlvbnMnO1xuaW1wb3J0IHtFdmVudHMsIFN0YXRlc30gZnJvbSAnLi93ZWJTb2NrZXRDb25maWdzJztcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0V29ya2VyUHJvcHMgPSB7XG4gICAgb25Db25uZWN0ZWQ/KCk6IHZvaWQ7XG4gICAgb25EaXNjb25uZWN0ZWQ/KCk6IHZvaWQ7XG4gICAgb25TeW5jU3RhdGU/KHN0YXRlOiBhbnkpOiB2b2lkO1xuICAgIHJlY29ubmVjdE1heEF0dGVtcHRzPzogbnVtYmVyO1xuICAgIHJlY29ubmVjdEludGVydmFsPzogbnVtYmVyO1xuICAgIHVybD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYlNvY2tldFdvcmtlciBleHRlbmRzIFNoYXJlZFdvcmtlciB7XG4gICAgX2NoYW5uZWxzID0ge307XG5cbiAgICBfY29ubmVjdGVkID0gZmFsc2U7XG5cbiAgICBfaWQgPSB2NCgpO1xuXG4gICAgX29uQ29ubmVjdGVkID0gKCkgPT4ge307XG5cbiAgICBfb25EaXNjb25uZWN0ZWQgPSAoKSA9PiB7fTtcblxuICAgIF9vblN5bmNTdGF0ZSA9IChzdGF0ZTogYW55KSA9PiB7fTtcblxuICAgIF9zeW5jQ2hhbm5lbHMgPSB7fTtcblxuICAgIF9zeW5jTWVzc2FnZXMgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzPzogV2ViU29ja2V0V29ya2VyUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlNvY2tldFdvcmtlckluc3RhbmNlLmpzJyk7XG5cbiAgICAgICAgaWYgKHByb3BzPy5vbkNvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5fb25Db25uZWN0ZWQgPSBwcm9wcy5vbkNvbm5lY3RlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wcz8ub25EaXNjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRGlzY29ubmVjdGVkID0gcHJvcHMub25EaXNjb25uZWN0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHM/Lm9uU3luY1N0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9vblN5bmNTdGF0ZSA9IHByb3BzLm9uU3luY1N0YXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3J0LnN0YXJ0KCk7XG5cbiAgICAgICAgdGhpcy5wb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9vbk1lc3NhZ2UpO1xuXG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyKHtcbiAgICAgICAgICAgIHJlY29ubmVjdE1heEF0dGVtcHRzOiBwcm9wcy5yZWNvbm5lY3RNYXhBdHRlbXB0cyB8fCAxMCxcbiAgICAgICAgICAgIHJlY29ubmVjdEludGVydmFsOiBwcm9wcy5yZWNvbm5lY3RJbnRlcnZhbCB8fCAxMDAwMFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocHJvcHMudXJsKSB7XG4gICAgICAgICAgICB0aGlzLnNldFVybChwcm9wcy51cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMuX3NldFZpc2liaWxpdHkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgdGhpcy5fdW5yZWdpc3Rlcik7XG4gICAgfVxuXG4gICAgY29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50cy5DT05ORUNUXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLl91bnJlZ2lzdGVyKCk7XG5cbiAgICAgICAgdGhpcy5wb3J0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9vbk1lc3NhZ2UpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5fc2V0VmlzaWJpbGl0eSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLl91bnJlZ2lzdGVyKTtcbiAgICB9O1xuXG4gICAgZGlzY29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50cy5ESVNDT05ORUNUXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0ZXN0RGlzY29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50cy5URVNUX0RJU0NPTk5FQ1RcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGRpc21pc3MgPSAoY2hhbm5lbCwgaWQpID0+IHtcbiAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50cy5ESVNNSVNTX1NZTkMsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgc2VuZCA9IChjaGFubmVsOiBzdHJpbmcsIG1lc3NhZ2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLlNFTkRfTUVTU0FHRSxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldEF1dGhIZWFkZXIgPSAoYXV0aEhlYWRlcikgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLlNFVF9BVVRIX0hFQURFUixcbiAgICAgICAgICAgIHBheWxvYWQ6IGF1dGhIZWFkZXJcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldEhlYWRlciA9IChoZWFkZXIpID0+IHtcbiAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50cy5TRVRfSEVBREVSLFxuICAgICAgICAgICAgcGF5bG9hZDogaGVhZGVyXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBzZXRVcmwgPSAodXJsKSA9PiB7XG4gICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBFdmVudHMuU0VUX1VSTCxcbiAgICAgICAgICAgIHBheWxvYWQ6IHVybFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgc3Vic2NyaWJlID0gKFxuICAgICAgICBjaGFubmVsOiBzdHJpbmcsXG4gICAgICAgIGNhbGxiYWNrOiAobWVzc2FnZTogYW55KSA9PiB2b2lkXG4gICAgKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgaWYgKCEodGhpcy5fY2hhbm5lbHNbY2hhbm5lbF0gfHwgW10pLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbm5lbHNbY2hhbm5lbF0gPSBbY2FsbGJhY2tdO1xuXG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHR5cGU6IEV2ZW50cy5TVUJTQ1JJQkUsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5faWQsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5uZWxzW2NoYW5uZWxdID0gWy4uLnRoaXMuX2NoYW5uZWxzW2NoYW5uZWxdLCBjYWxsYmFja107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY2hhbm5lbHNbY2hhbm5lbF0gPSAodGhpcy5fY2hhbm5lbHNbY2hhbm5lbF0gfHwgW10pLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoZm4pID0+IGZuICE9PSBjYWxsYmFja1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9jaGFubmVsc1tjaGFubmVsXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKGNoYW5uZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBzdWJzY3JpYmVTeW5jID0gKFxuICAgICAgICBjaGFubmVsOiBzdHJpbmcsXG4gICAgICAgIGNhbGxiYWNrOiAoXG4gICAgICAgICAgICBtZXNzYWdlczogU3RvbXBOb3RpZmljYXRpb248YW55PltdLFxuICAgICAgICAgICAgYWRkOiBTdG9tcE5vdGlmaWNhdGlvbjxhbnk+W10sXG4gICAgICAgICAgICByZW1vdmU6IFN0b21wTm90aWZpY2F0aW9uPGFueT5bXVxuICAgICAgICApID0+IHZvaWRcbiAgICApOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBjb25zdCBmbiA9IChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2xkTWVzc2FnZXMgPSB0aGlzLl9zeW5jTWVzc2FnZXNbY2hhbm5lbF0gfHwgW107XG5cbiAgICAgICAgICAgIGNvbnN0IG9sZElkcyA9IG9sZE1lc3NhZ2VzLm1hcCgobXNnKSA9PiBtc2cuaWQpO1xuXG4gICAgICAgICAgICB0aGlzLl9zeW5jTWVzc2FnZXNbY2hhbm5lbF0gPSBtZXNzYWdlcztcblxuICAgICAgICAgICAgY29uc3QgbmV3SWRzID0gKHRoaXMuX3N5bmNNZXNzYWdlc1tjaGFubmVsXSB8fCBbXSkubWFwKFxuICAgICAgICAgICAgICAgIChtc2cpID0+IG1zZy5pZFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgYWRkID0gbWVzc2FnZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICh7aWR9KSA9PiAhb2xkSWRzLmluY2x1ZGVzKGlkKSAmJiBuZXdJZHMuaW5jbHVkZXMoaWQpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCByZW1vdmUgPSBvbGRNZXNzYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHtpZH0pID0+ICFuZXdJZHMuaW5jbHVkZXMoaWQpICYmIG9sZElkcy5pbmNsdWRlcyhpZClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG1lc3NhZ2VzLCBhZGQsIHJlbW92ZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCEodGhpcy5fc3luY0NoYW5uZWxzW2NoYW5uZWxdIHx8IFtdKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3N5bmNDaGFubmVsc1tjaGFubmVsXSA9IFtmbl07XG5cbiAgICAgICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogRXZlbnRzLlNVQlNDUklCRV9TWU5DLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuX2lkLFxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zeW5jQ2hhbm5lbHNbY2hhbm5lbF0gPSBbLi4udGhpcy5fc3luY0NoYW5uZWxzW2NoYW5uZWxdLCBmbl07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3luY0NoYW5uZWxzW2NoYW5uZWxdID0gKFxuICAgICAgICAgICAgICAgIHRoaXMuX3N5bmNDaGFubmVsc1tjaGFubmVsXSB8fCBbXVxuICAgICAgICAgICAgKS5maWx0ZXIoKGNhbGxiYWNrKSA9PiBjYWxsYmFjayAhPT0gZm4pO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3N5bmNDaGFubmVsc1tjaGFubmVsXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlU3luYyhjaGFubmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgdW5zdWJzY3JpYmUgPSAoY2hhbm5lbCkgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLlVOU1VCU0NSSUJFLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLl9pZCxcbiAgICAgICAgICAgICAgICBjaGFubmVsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB1bnN1YnNjcmliZVN5bmMgPSAoY2hhbm5lbCkgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLlVOU1VCU0NSSUJFX1NZTkMsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuX2lkLFxuICAgICAgICAgICAgICAgIGNoYW5uZWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9vbk1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlckV2ZW50c1tldmVudC5kYXRhLnR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXJFdmVudHNbZXZlbnQuZGF0YS50eXBlXShldmVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgX3JlZ2lzdGVyID0gKFxuICAgICAgICBwcm9wczogUGljazxcbiAgICAgICAgICAgIFdlYlNvY2tldFdvcmtlclByb3BzLFxuICAgICAgICAgICAgJ3JlY29ubmVjdE1heEF0dGVtcHRzJyB8ICdyZWNvbm5lY3RJbnRlcnZhbCdcbiAgICAgICAgPlxuICAgICkgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLlJFR0lTVEVSLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLl9pZCxcbiAgICAgICAgICAgICAgICByZWNvbm5lY3RJbnRlcnZhbDogcHJvcHMucmVjb25uZWN0SW50ZXJ2YWwsXG4gICAgICAgICAgICAgICAgcmVjb25uZWN0TWF4QXR0ZW1wdHM6IHByb3BzLnJlY29ubmVjdE1heEF0dGVtcHRzLFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6IGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfc2V0RXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW3VzZS1zdG9tcF0nLCBldmVudC5kYXRhLnBheWxvYWQpO1xuICAgIH07XG5cbiAgICBfc2V0VmlzaWJpbGl0eSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50cy5TRVRfVklTSUJJTElUWSxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5faWQsXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9zZXRNZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9jaGFubmVsc1tldmVudC5kYXRhLnBheWxvYWQuY2hhbm5lbF0pIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5uZWxzW2V2ZW50LmRhdGEucGF5bG9hZC5jaGFubmVsXS5mb3JFYWNoKChmbikgPT5cbiAgICAgICAgICAgICAgICBmbihldmVudC5kYXRhLnBheWxvYWQubWVzc2FnZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc3luY0NoYW5uZWxzW2V2ZW50LmRhdGEucGF5bG9hZC5jaGFubmVsXSkge1xuICAgICAgICAgICAgdGhpcy5fc3luY0NoYW5uZWxzW2V2ZW50LmRhdGEucGF5bG9hZC5jaGFubmVsXS5mb3JFYWNoKChmbikgPT4ge1xuICAgICAgICAgICAgICAgIGZuKFxuICAgICAgICAgICAgICAgICAgICAoZXZlbnQuZGF0YS5wYXlsb2FkLm1lc3NhZ2UgfHwgW10pLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICh7bWVzc2FnZSwgLi4uaXRlbX0pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc21pc3M6ICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzbWlzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEucGF5bG9hZC5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIF9zZXRDb25uZWN0aW9uID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHdhc0Nvbm5lY3RlZCA9ICEhdGhpcy5fY29ubmVjdGVkO1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQuZGF0YS5wYXlsb2FkKSB7XG4gICAgICAgICAgICBjYXNlIFN0YXRlcy5DT05ORUNURUQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3RhdGVzLkNPTk5FQ1RJTkc6XG4gICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN0YXRlcy5ESVNDT05ORUNURUQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN0YXRlcy5ESVNDT05ORUNUSU5HOlxuICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF3YXNDb25uZWN0ZWQgJiYgdGhpcy5fY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNvbm5lY3RlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdhc0Nvbm5lY3RlZCAmJiAhdGhpcy5fY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkRpc2Nvbm5lY3RlZCgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIF91bnJlZ2lzdGVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLlVOUkVHSVNURVIsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuX2lkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfd29ya2VyRXZlbnRzID0ge1xuICAgICAgICBbRXZlbnRzLkNPTk5FQ1RJT05dOiB0aGlzLl9zZXRDb25uZWN0aW9uLFxuICAgICAgICBbRXZlbnRzLkVSUk9SXTogdGhpcy5fc2V0RXJyb3IsXG4gICAgICAgIFtFdmVudHMuTUVTU0FHRV06IHRoaXMuX3NldE1lc3NhZ2VcbiAgICB9O1xufVxuIl19