UNPKG

use-stomp

Version:

react provider, class decorator, and a hook for websockets using the stomp protocol

393 lines (313 loc) 38.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); require("core-js/modules/es.array.concat"); require("core-js/modules/es.array.filter"); require("core-js/modules/es.array.for-each"); require("core-js/modules/es.array.includes"); require("core-js/modules/es.array.map"); require("core-js/modules/es.object.get-own-property-descriptor"); require("core-js/modules/es.string.includes"); require("core-js/modules/web.dom-collections.for-each"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper")); var _uuid = require("uuid"); var _webSocketConfigs = require("./webSocketConfigs"); 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) { (0, _defineProperty2.default)(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 = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(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; } } var WebSocketWorker = /*#__PURE__*/function (_SharedWorker) { (0, _inherits2.default)(WebSocketWorker, _SharedWorker); var _super = _createSuper(WebSocketWorker); function WebSocketWorker(_props) { var _this$_workerEvents; var _this; (0, _classCallCheck2.default)(this, WebSocketWorker); _this = _super.call(this, 'webSocketWorkerInstance.js'); _this._channels = {}; _this._connected = false; _this._id = (0, _uuid.v4)(); _this._onConnected = function () {}; _this._onDisconnected = function () {}; _this._onSyncState = function (state) {}; _this._syncChannels = {}; _this._syncMessages = {}; _this.connect = function () { _this.port.postMessage({ type: _webSocketConfigs.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: _webSocketConfigs.Events.DISCONNECT }); }; _this.testDisconnect = function () { _this.port.postMessage({ type: _webSocketConfigs.Events.TEST_DISCONNECT }); }; _this.dismiss = function (channel, id) { _this.port.postMessage({ type: _webSocketConfigs.Events.DISMISS_SYNC, payload: { channel: channel, id: id } }); }; _this.send = function (channel, message) { _this.port.postMessage({ type: _webSocketConfigs.Events.SEND_MESSAGE, payload: { channel: channel, message: message } }); }; _this.setAuthHeader = function (authHeader) { _this.port.postMessage({ type: _webSocketConfigs.Events.SET_AUTH_HEADER, payload: authHeader }); }; _this.setHeader = function (header) { _this.port.postMessage({ type: _webSocketConfigs.Events.SET_HEADER, payload: header }); }; _this.setUrl = function (url) { _this.port.postMessage({ type: _webSocketConfigs.Events.SET_URL, payload: url }); }; _this.subscribe = function (channel, callback) { if (!(_this._channels[channel] || []).length) { _this._channels[channel] = [callback]; _this.port.postMessage({ type: _webSocketConfigs.Events.SUBSCRIBE, payload: { id: _this._id, channel: channel } }); } else { _this._channels[channel] = [].concat((0, _toConsumableArray2.default)(_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: _webSocketConfigs.Events.SUBSCRIBE_SYNC, payload: { id: _this._id, channel: channel } }); } else { _this._syncChannels[channel] = [].concat((0, _toConsumableArray2.default)(_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: _webSocketConfigs.Events.UNSUBSCRIBE, payload: { id: _this._id, channel: channel } }); }; _this.unsubscribeSync = function (channel) { _this.port.postMessage({ type: _webSocketConfigs.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: _webSocketConfigs.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: _webSocketConfigs.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 = (0, _objectWithoutProperties2.default)(_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 _webSocketConfigs.States.CONNECTED: _this._connected = true; break; case _webSocketConfigs.States.CONNECTING: _this._connected = false; break; case _webSocketConfigs.States.DISCONNECTED: _this._connected = false; break; case _webSocketConfigs.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: _webSocketConfigs.Events.UNREGISTER, payload: { id: _this._id } }); }; _this._workerEvents = (_this$_workerEvents = {}, (0, _defineProperty2.default)(_this$_workerEvents, _webSocketConfigs.Events.CONNECTION, _this._setConnection), (0, _defineProperty2.default)(_this$_workerEvents, _webSocketConfigs.Events.ERROR, _this._setError), (0, _defineProperty2.default)(_this$_workerEvents, _webSocketConfigs.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__*/(0, _wrapNativeSuper2.default)(SharedWorker)); exports.default = WebSocketWorker; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJTb2NrZXRXb3JrZXIudHMiXSwibmFtZXMiOlsiV2ViU29ja2V0V29ya2VyIiwicHJvcHMiLCJfY2hhbm5lbHMiLCJfY29ubmVjdGVkIiwiX2lkIiwiX29uQ29ubmVjdGVkIiwiX29uRGlzY29ubmVjdGVkIiwiX29uU3luY1N0YXRlIiwic3RhdGUiLCJfc3luY0NoYW5uZWxzIiwiX3N5bmNNZXNzYWdlcyIsImNvbm5lY3QiLCJwb3J0IiwicG9zdE1lc3NhZ2UiLCJ0eXBlIiwiRXZlbnRzIiwiQ09OTkVDVCIsImRlc3Ryb3kiLCJfdW5yZWdpc3RlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJfb25NZXNzYWdlIiwiZG9jdW1lbnQiLCJfc2V0VmlzaWJpbGl0eSIsIndpbmRvdyIsImRpc2Nvbm5lY3QiLCJESVNDT05ORUNUIiwidGVzdERpc2Nvbm5lY3QiLCJURVNUX0RJU0NPTk5FQ1QiLCJkaXNtaXNzIiwiY2hhbm5lbCIsImlkIiwiRElTTUlTU19TWU5DIiwicGF5bG9hZCIsInNlbmQiLCJtZXNzYWdlIiwiU0VORF9NRVNTQUdFIiwic2V0QXV0aEhlYWRlciIsImF1dGhIZWFkZXIiLCJTRVRfQVVUSF9IRUFERVIiLCJzZXRIZWFkZXIiLCJoZWFkZXIiLCJTRVRfSEVBREVSIiwic2V0VXJsIiwidXJsIiwiU0VUX1VSTCIsInN1YnNjcmliZSIsImNhbGxiYWNrIiwibGVuZ3RoIiwiU1VCU0NSSUJFIiwiZmlsdGVyIiwiZm4iLCJ1bnN1YnNjcmliZSIsInN1YnNjcmliZVN5bmMiLCJtZXNzYWdlcyIsIm9sZE1lc3NhZ2VzIiwib2xkSWRzIiwibWFwIiwibXNnIiwibmV3SWRzIiwiYWRkIiwiaW5jbHVkZXMiLCJyZW1vdmUiLCJTVUJTQ1JJQkVfU1lOQyIsInVuc3Vic2NyaWJlU3luYyIsIlVOU1VCU0NSSUJFIiwiVU5TVUJTQ1JJQkVfU1lOQyIsImV2ZW50IiwiX3dvcmtlckV2ZW50cyIsImRhdGEiLCJfcmVnaXN0ZXIiLCJSRUdJU1RFUiIsInJlY29ubmVjdEludGVydmFsIiwicmVjb25uZWN0TWF4QXR0ZW1wdHMiLCJ2aXNpYmlsaXR5IiwidmlzaWJpbGl0eVN0YXRlIiwiX3NldEVycm9yIiwiY29uc29sZSIsImVycm9yIiwiU0VUX1ZJU0lCSUxJVFkiLCJfc2V0TWVzc2FnZSIsImZvckVhY2giLCJpdGVtIiwiY29udGVudCIsIl9zZXRDb25uZWN0aW9uIiwid2FzQ29ubmVjdGVkIiwiU3RhdGVzIiwiQ09OTkVDVEVEIiwiQ09OTkVDVElORyIsIkRJU0NPTk5FQ1RFRCIsIkRJU0NPTk5FQ1RJTkciLCJVTlJFR0lTVEVSIiwiQ09OTkVDVElPTiIsIkVSUk9SIiwiTUVTU0FHRSIsIm9uQ29ubmVjdGVkIiwib25EaXNjb25uZWN0ZWQiLCJvblN5bmNTdGF0ZSIsInN0YXJ0IiwiYWRkRXZlbnRMaXN0ZW5lciIsIlNoYXJlZFdvcmtlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFHQTs7Ozs7Ozs7OztJQVdxQkEsZTs7Ozs7QUFpQmpCLDJCQUFZQyxNQUFaLEVBQTBDO0FBQUE7O0FBQUE7O0FBQUE7QUFDdEMsOEJBQU0sNEJBQU47QUFEc0MsVUFoQjFDQyxTQWdCMEMsR0FoQjlCLEVBZ0I4QjtBQUFBLFVBZDFDQyxVQWMwQyxHQWQ3QixLQWM2QjtBQUFBLFVBWjFDQyxHQVkwQyxHQVpwQyxlQVlvQzs7QUFBQSxVQVYxQ0MsWUFVMEMsR0FWM0IsWUFBTSxDQUFFLENBVW1COztBQUFBLFVBUjFDQyxlQVEwQyxHQVJ4QixZQUFNLENBQUUsQ0FRZ0I7O0FBQUEsVUFOMUNDLFlBTTBDLEdBTjNCLFVBQUNDLEtBQUQsRUFBZ0IsQ0FBRSxDQU1TOztBQUFBLFVBSjFDQyxhQUkwQyxHQUoxQixFQUkwQjtBQUFBLFVBRjFDQyxhQUUwQyxHQUYxQixFQUUwQjs7QUFBQSxVQWdDMUNDLE9BaEMwQyxHQWdDaEMsWUFBTTtBQUNaLFlBQUtDLElBQUwsQ0FBVUMsV0FBVixDQUFzQjtBQUNsQkMs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LGNBQVgsRUFBMkI7QUFDdkIsWUFBS3pGLGVBQUwsR0FBdUJMLE1BQUssQ0FBQzhGLGNBQTdCO0FBQ0g7O0FBRUQsUUFBSTlGLE1BQUosYUFBSUEsTUFBSixlQUFJQSxNQUFLLENBQUUrRixXQUFYLEVBQXdCO0FBQ3BCLFlBQUt6RixZQUFMLEdBQW9CTixNQUFLLENBQUMrRixXQUExQjtBQUNIOztBQUVELFVBQUtwRixJQUFMLENBQVVxRixLQUFWOztBQUVBLFVBQUtyRixJQUFMLENBQVVzRixnQkFBVixDQUEyQixTQUEzQixFQUFzQyxNQUFLOUUsVUFBM0M7O0FBRUEsVUFBS2lELFNBQUwsQ0FBZTtBQUNYRyxNQUFBQSxvQkFBb0IsRUFBRXZFLE1BQUssQ0FBQ3VFLG9CQUFOLElBQThCLEVBRHpDO0FBRVhELE1BQUFBLGlCQUFpQixFQUFFdEUsTUFBSyxDQUFDc0UsaUJBQU4sSUFBMkI7QUFGbkMsS0FBZjs7QUFLQSxRQUFJdEUsTUFBSyxDQUFDMEMsR0FBVixFQUFlO0FBQ1gsWUFBS0QsTUFBTCxDQUFZekMsTUFBSyxDQUFDMEMsR0FBbEI7QUFDSDs7QUFFRHRCLElBQUFBLFFBQVEsQ0FBQzZFLGdCQUFULENBQTBCLGtCQUExQixFQUE4QyxNQUFLNUUsY0FBbkQ7QUFDQUMsSUFBQUEsTUFBTSxDQUFDMkUsZ0JBQVAsQ0FBd0IsY0FBeEIsRUFBd0MsTUFBS2hGLFdBQTdDO0FBN0JzQztBQThCekM7OzsrQ0EvQ3dDaUYsWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7djR9IGZyb20gJ3V1aWQnO1xuXG5pbXBvcnQge1N0b21wTm90aWZpY2F0aW9ufSBmcm9tICcuL3VzZVN0b21wTm90aWZpY2F0aW9ucyc7XG5pbXBvcnQge0V2ZW50cywgU3RhdGVzfSBmcm9tICcuL3dlYlNvY2tldENvbmZpZ3MnO1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRXb3JrZXJQcm9wcyA9IHtcbiAgICBvbkNvbm5lY3RlZD8oKTogdm9pZDtcbiAgICBvbkRpc2Nvbm5lY3RlZD8oKTogdm9pZDtcbiAgICBvblN5bmNTdGF0ZT8oc3RhdGU6IGFueSk6IHZvaWQ7XG4gICAgcmVjb25uZWN0TWF4QXR0ZW1wdHM/OiBudW1iZXI7XG4gICAgcmVjb25uZWN0SW50ZXJ2YWw/OiBudW1iZXI7XG4gICAgdXJsPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViU29ja2V0V29ya2VyIGV4dGVuZHMgU2hhcmVkV29ya2VyIHtcbiAgICBfY2hhbm5lbHMgPSB7fTtcblxuICAgIF9jb25uZWN0ZWQgPSBmYWxzZTtcblxuICAgIF9pZCA9IHY0KCk7XG5cbiAgICBfb25Db25uZWN0ZWQgPSAoKSA9PiB7fTtcblxuICAgIF9vbkRpc2Nvbm5lY3RlZCA9ICgpID0+IHt9O1xuXG4gICAgX29uU3luY1N0YXRlID0gKHN0YXRlOiBhbnkpID0+IHt9O1xuXG4gICAgX3N5bmNDaGFubmVscyA9IHt9O1xuXG4gICAgX3N5bmNNZXNzYWdlcyA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJvcHM/OiBXZWJTb2NrZXRXb3JrZXJQcm9wcykge1xuICAgICAgICBzdXBlcignd2ViU29ja2V0V29ya2VySW5zdGFuY2UuanMnKTtcblxuICAgICAgICBpZiAocHJvcHM/Lm9uQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNvbm5lY3RlZCA9IHByb3BzLm9uQ29ubmVjdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BzPy5vbkRpc2Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5fb25EaXNjb25uZWN0ZWQgPSBwcm9wcy5vbkRpc2Nvbm5lY3RlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wcz8ub25TeW5jU3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX29uU3luY1N0YXRlID0gcHJvcHMub25TeW5jU3RhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvcnQuc3RhcnQoKTtcblxuICAgICAgICB0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX29uTWVzc2FnZSk7XG5cbiAgICAgICAgdGhpcy5fcmVnaXN0ZXIoe1xuICAgICAgICAgICAgcmVjb25uZWN0TWF4QXR0ZW1wdHM6IHByb3BzLnJlY29ubmVjdE1heEF0dGVtcHRzIHx8IDEwLFxuICAgICAgICAgICAgcmVjb25uZWN0SW50ZXJ2YWw6IHByb3BzLnJlY29ubmVjdEludGVydmFsIHx8IDEwMDAwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwcm9wcy51cmwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VXJsKHByb3BzLnVybCk7XG4gICAgICAgIH1cblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5fc2V0VmlzaWJpbGl0eSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLl91bnJlZ2lzdGVyKTtcbiAgICB9XG5cbiAgICBjb25uZWN0ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLkNPTk5FQ1RcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VucmVnaXN0ZXIoKTtcblxuICAgICAgICB0aGlzLnBvcnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX29uTWVzc2FnZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLl9zZXRWaXNpYmlsaXR5KTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHRoaXMuX3VucmVnaXN0ZXIpO1xuICAgIH07XG5cbiAgICBkaXNjb25uZWN0ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLkRJU0NPTk5FQ1RcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRlc3REaXNjb25uZWN0ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLlRFU1RfRElTQ09OTkVDVFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZGlzbWlzcyA9IChjaGFubmVsLCBpZCkgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLkRJU01JU1NfU1lOQyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBzZW5kID0gKGNoYW5uZWw6IHN0cmluZywgbWVzc2FnZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBFdmVudHMuU0VORF9NRVNTQUdFLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgc2V0QXV0aEhlYWRlciA9IChhdXRoSGVhZGVyKSA9PiB7XG4gICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBFdmVudHMuU0VUX0FVVEhfSEVBREVSLFxuICAgICAgICAgICAgcGF5bG9hZDogYXV0aEhlYWRlclxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgc2V0SGVhZGVyID0gKGhlYWRlcikgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLlNFVF9IRUFERVIsXG4gICAgICAgICAgICBwYXlsb2FkOiBoZWFkZXJcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldFVybCA9ICh1cmwpID0+IHtcbiAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50cy5TRVRfVVJMLFxuICAgICAgICAgICAgcGF5bG9hZDogdXJsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBzdWJzY3JpYmUgPSAoXG4gICAgICAgIGNoYW5uZWw6IHN0cmluZyxcbiAgICAgICAgY2FsbGJhY2s6IChtZXNzYWdlOiBhbnkpID0+IHZvaWRcbiAgICApOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBpZiAoISh0aGlzLl9jaGFubmVsc1tjaGFubmVsXSB8fCBbXSkubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFubmVsc1tjaGFubmVsXSA9IFtjYWxsYmFja107XG5cbiAgICAgICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogRXZlbnRzLlNVQlNDUklCRSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLl9pZCxcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY2hhbm5lbHNbY2hhbm5lbF0gPSBbLi4udGhpcy5fY2hhbm5lbHNbY2hhbm5lbF0sIGNhbGxiYWNrXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jaGFubmVsc1tjaGFubmVsXSA9ICh0aGlzLl9jaGFubmVsc1tjaGFubmVsXSB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChmbikgPT4gZm4gIT09IGNhbGxiYWNrXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NoYW5uZWxzW2NoYW5uZWxdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoY2hhbm5lbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIHN1YnNjcmliZVN5bmMgPSAoXG4gICAgICAgIGNoYW5uZWw6IHN0cmluZyxcbiAgICAgICAgY2FsbGJhY2s6IChcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBTdG9tcE5vdGlmaWNhdGlvbjxhbnk+W10sXG4gICAgICAgICAgICBhZGQ6IFN0b21wTm90aWZpY2F0aW9uPGFueT5bXSxcbiAgICAgICAgICAgIHJlbW92ZTogU3RvbXBOb3RpZmljYXRpb248YW55PltdXG4gICAgICAgICkgPT4gdm9pZFxuICAgICk6ICgoKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgIGNvbnN0IGZuID0gKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRNZXNzYWdlcyA9IHRoaXMuX3N5bmNNZXNzYWdlc1tjaGFubmVsXSB8fCBbXTtcblxuICAgICAgICAgICAgY29uc3Qgb2xkSWRzID0gb2xkTWVzc2FnZXMubWFwKChtc2cpID0+IG1zZy5pZCk7XG5cbiAgICAgICAgICAgIHRoaXMuX3N5bmNNZXNzYWdlc1tjaGFubmVsXSA9IG1lc3NhZ2VzO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdJZHMgPSAodGhpcy5fc3luY01lc3NhZ2VzW2NoYW5uZWxdIHx8IFtdKS5tYXAoXG4gICAgICAgICAgICAgICAgKG1zZykgPT4gbXNnLmlkXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBhZGQgPSBtZXNzYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHtpZH0pID0+ICFvbGRJZHMuaW5jbHVkZXMoaWQpICYmIG5ld0lkcy5pbmNsdWRlcyhpZClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZSA9IG9sZE1lc3NhZ2VzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoe2lkfSkgPT4gIW5ld0lkcy5pbmNsdWRlcyhpZCkgJiYgb2xkSWRzLmluY2x1ZGVzKGlkKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY2FsbGJhY2sobWVzc2FnZXMsIGFkZCwgcmVtb3ZlKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoISh0aGlzLl9zeW5jQ2hhbm5lbHNbY2hhbm5lbF0gfHwgW10pLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fc3luY0NoYW5uZWxzW2NoYW5uZWxdID0gW2ZuXTtcblxuICAgICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBFdmVudHMuU1VCU0NSSUJFX1NZTkMsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5faWQsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3N5bmNDaGFubmVsc1tjaGFubmVsXSA9IFsuLi50aGlzLl9zeW5jQ2hhbm5lbHNbY2hhbm5lbF0sIGZuXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zeW5jQ2hhbm5lbHNbY2hhbm5lbF0gPSAoXG4gICAgICAgICAgICAgICAgdGhpcy5fc3luY0NoYW5uZWxzW2NoYW5uZWxdIHx8IFtdXG4gICAgICAgICAgICApLmZpbHRlcigoY2FsbGJhY2spID0+IGNhbGxiYWNrICE9PSBmbik7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fc3luY0NoYW5uZWxzW2NoYW5uZWxdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmVTeW5jKGNoYW5uZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICB1bnN1YnNjcmliZSA9IChjaGFubmVsKSA9PiB7XG4gICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBFdmVudHMuVU5TVUJTQ1JJQkUsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuX2lkLFxuICAgICAgICAgICAgICAgIGNoYW5uZWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHVuc3Vic2NyaWJlU3luYyA9IChjaGFubmVsKSA9PiB7XG4gICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBFdmVudHMuVU5TVUJTQ1JJQkVfU1lOQyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5faWQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgX29uTWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fd29ya2VyRXZlbnRzW2V2ZW50LmRhdGEudHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlckV2ZW50c1tldmVudC5kYXRhLnR5cGVdKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBfcmVnaXN0ZXIgPSAoXG4gICAgICAgIHByb3BzOiBQaWNrPFxuICAgICAgICAgICAgV2ViU29ja2V0V29ya2VyUHJvcHMsXG4gICAgICAgICAgICAncmVjb25uZWN0TWF4QXR0ZW1wdHMnIHwgJ3JlY29ubmVjdEludGVydmFsJ1xuICAgICAgICA+XG4gICAgKSA9PiB7XG4gICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBFdmVudHMuUkVHSVNURVIsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuX2lkLFxuICAgICAgICAgICAgICAgIHJlY29ubmVjdEludGVydmFsOiBwcm9wcy5yZWNvbm5lY3RJbnRlcnZhbCxcbiAgICAgICAgICAgICAgICByZWNvbm5lY3RNYXhBdHRlbXB0czogcHJvcHMucmVjb25uZWN0TWF4QXR0ZW1wdHMsXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9zZXRFcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlLXN0b21wXScsIGV2ZW50LmRhdGEucGF5bG9hZCk7XG4gICAgfTtcblxuICAgIF9zZXRWaXNpYmlsaXR5ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogRXZlbnRzLlNFVF9WSVNJQklMSVRZLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLl9pZCxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3NldE1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2NoYW5uZWxzW2V2ZW50LmRhdGEucGF5bG9hZC5jaGFubmVsXSkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbm5lbHNbZXZlbnQuZGF0YS5wYXlsb2FkLmNoYW5uZWxdLmZvckVhY2goKGZuKSA9PlxuICAgICAgICAgICAgICAgIGZuKGV2ZW50LmRhdGEucGF5bG9hZC5tZXNzYWdlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zeW5jQ2hhbm5lbHNbZXZlbnQuZGF0YS5wYXlsb2FkLmNoYW5uZWxdKSB7XG4gICAgICAgICAgICB0aGlzLl9zeW5jQ2hhbm5lbHNbZXZlbnQuZGF0YS5wYXlsb2FkLmNoYW5uZWxdLmZvckVhY2goKGZuKSA9PiB7XG4gICAgICAgICAgICAgICAgZm4oXG4gICAgICAgICAgICAgICAgICAgIChldmVudC5kYXRhLnBheWxvYWQubWVzc2FnZSB8fCBbXSkubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHttZXNzYWdlLCAuLi5pdGVtfSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzczogKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNtaXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5wYXlsb2FkLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgX3NldENvbm5lY3Rpb24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgd2FzQ29ubmVjdGVkID0gISF0aGlzLl9jb25uZWN0ZWQ7XG5cbiAgICAgICAgc3dpdGNoIChldmVudC5kYXRhLnBheWxvYWQpIHtcbiAgICAgICAgICAgIGNhc2UgU3RhdGVzLkNPTk5FQ1RFRDpcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdGF0ZXMuQ09OTkVDVElORzpcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3RhdGVzLkRJU0NPTk5FQ1RFRDpcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3RhdGVzLkRJU0NPTk5FQ1RJTkc6XG4gICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXdhc0Nvbm5lY3RlZCAmJiB0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ29ubmVjdGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod2FzQ29ubmVjdGVkICYmICF0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRGlzY29ubmVjdGVkKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgX3VucmVnaXN0ZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBFdmVudHMuVU5SRUdJU1RFUixcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5faWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIF93b3JrZXJFdmVudHMgPSB7XG4gICAgICAgIFtFdmVudHMuQ09OTkVDVElPTl06IHRoaXMuX3NldENvbm5lY3Rpb24sXG4gICAgICAgIFtFdmVudHMuRVJST1JdOiB0aGlzLl9zZXRFcnJvcixcbiAgICAgICAgW0V2ZW50cy5NRVNTQUdFXTogdGhpcy5fc2V0TWVzc2FnZVxuICAgIH07XG59XG4iXX0=