use-stomp
Version:
react provider, class decorator, and a hook for websockets using the stomp protocol
393 lines (313 loc) • 38.7 kB
JavaScript
;
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=