use-stomp
Version:
react provider, class decorator, and a hook for websockets using the stomp protocol
181 lines (157 loc) • 20.9 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
require("core-js/modules/es.object.get-own-property-descriptor");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _sockjsClient = _interopRequireDefault(require("sockjs-client"));
var _context = _interopRequireDefault(require("./context"));
var _stomp = _interopRequireDefault(require("./stomp"));
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; }
var _default = /*#__PURE__*/_react.default.memo(function (props) {
var _client$current, _client$current2;
var client = (0, _react.useRef)(null);
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
connected = _useState2[0],
setConnected = _useState2[1];
var packageMessage = (0, _react.useCallback)(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("packageMessage", function (channel, msg, optHeaders) {
if (props.packageMessage) {
return props.packageMessage(channel, msg, optHeaders);
}
try {
return (0, _typeof2.default)(msg) === 'object' && msg !== null ? JSON.stringify(msg) : msg;
} catch (e) {
return msg;
}
}), [props.packageMessage]);
var parseMessage = (0, _react.useCallback)(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("parseMessage", function (channel, msg) {
if (props.parseMessage) {
return props.parseMessage(channel, msg);
}
try {
var parsed = JSON.parse(msg);
return (0, _typeof2.default)(parsed) === 'object' && parsed !== null && parsed.content ? parsed.content : parsed;
} catch (e) {
return msg;
}
}), [props.parseMessage]);
var onConnected = (0, _react.useCallback)(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("onConnected", function () {
console.log('%c[use-stomp::connected]', 'color: rgb(95,153,63);');
setConnected(function () {
return true;
});
}), []);
var onDisconnected = (0, _react.useCallback)(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("onDisconnected", function () {
console.log('%c[use-stomp::disconnected]', 'color: rgb(170,34,23);');
setConnected(function () {
return false;
});
client.current = null;
}), []);
var onError = (0, _react.useCallback)(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("onError", function (error) {
console.error('[use-stomp::error]', error);
}), []);
var send = (0, _react.useCallback)(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("send", function (channel, msg) {
var optHeaders = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (connected) {
client.current.send(channel, optHeaders, packageMessage(channel, msg, optHeaders));
} else {
console.warn('[use-stomp::send]', 'cannot send when websocket is not connected');
}
}), [client.current, connected, packageMessage]);
var subscribe = (0, _react.useCallback)(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("subscribe", function (channel, callback) {
try {
return client.current.subscribe(channel, function (msg) {
var body = parseMessage(channel, msg.body);
callback(body, msg.headers.destination);
if (body && body.status === 'END') {
client.current.disconnect();
}
}, props.subscribeHeaders).unsubscribe;
} catch (e) {
throw Error(e);
}
}), [(_client$current = client.current) === null || _client$current === void 0 ? void 0 : _client$current.disconnect, (_client$current2 = client.current) === null || _client$current2 === void 0 ? void 0 : _client$current2.subscribe, parseMessage, props.subscribeHeaders]);
(0, _react.useEffect)(function () {
var hasHeaders = props.headers || props.authHeader;
if (hasHeaders && props.url && !connected) {
client.current = _stomp.default.over(new _sockjsClient.default(props.url, null, props.options), !!props.debug);
client.current.connect(props.authHeader ? {
Authorization: props.authHeader
} : props.headers, onConnected, onDisconnected, onError);
}
return function () {
if (connected && client.current) {
client.current.disconnect();
}
};
}, [connected, props.authHeader, props.headers, props.url]);
var ctx = (0, _react.useMemo)(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("ctx", function () {
return {
send: send,
subscribe: subscribe,
connected: connected
};
}), [connected, send, subscribe]);
return /*#__PURE__*/_react.default.createElement(_context.default.Provider, {
value: ctx
}, props.children);
});
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91c2VTdG9tcFByb3ZpZGVyLnRzeCJdLCJuYW1lcyI6WyJSZWFjdCIsIm1lbW8iLCJwcm9wcyIsImNsaWVudCIsImNvbm5lY3RlZCIsInNldENvbm5lY3RlZCIsInBhY2thZ2VNZXNzYWdlIiwiY2hhbm5lbCIsIm1zZyIsIm9wdEhlYWRlcnMiLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsInBhcnNlTWVzc2FnZSIsInBhcnNlZCIsInBhcnNlIiwiY29udGVudCIsIm9uQ29ubmVjdGVkIiwiY29uc29sZSIsImxvZyIsIm9uRGlzY29ubmVjdGVkIiwiY3VycmVudCIsIm9uRXJyb3IiLCJlcnJvciIsInNlbmQiLCJ3YXJuIiwic3Vic2NyaWJlIiwiY2FsbGJhY2siLCJib2R5IiwiaGVhZGVycyIsImRlc3RpbmF0aW9uIiwic3RhdHVzIiwiZGlzY29ubmVjdCIsInN1YnNjcmliZUhlYWRlcnMiLCJ1bnN1YnNjcmliZSIsIkVycm9yIiwiaGFzSGVhZGVycyIsImF1dGhIZWFkZXIiLCJ1cmwiLCJTdG9tcCIsIm92ZXIiLCJTb2NrSlMiLCJvcHRpb25zIiwiZGVidWciLCJjb25uZWN0IiwiQXV0aG9yaXphdGlvbiIsImN0eCIsImNoaWxkcmVuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBR0E7O0FBQ0E7Ozs7Ozs0QkFxQ2VBLGVBQU1DLElBQU4sQ0FBa0MsVUFBQ0MsS0FBRCxFQUFXO0FBQUE7O0FBQ3hELE1BQU1DLE1BQU0sR0FBRyxtQkFBZSxJQUFmLENBQWY7O0FBRHdELGtCQUd0QixxQkFBUyxLQUFULENBSHNCO0FBQUE7QUFBQSxNQUdqREMsU0FIaUQ7QUFBQSxNQUd0Q0MsWUFIc0M7O0FBS3hELE1BQU1DLGNBQWMsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFDbkIsVUFBQ0MsT0FBRCxFQUFVQyxHQUFWLEVBQWVDLFVBQWYsRUFBOEI7QUFDMUIsUUFBSVAsS0FBSyxDQUFDSSxjQUFW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QUFDd0MsT0FBbEMsQ0FEYSxFQUViLENBQUMsQ0FBQ3hDLEtBQUssQ0FBQ3lDLEtBRkssQ0FBakI7QUFLQ3hDLE1BQUFBLE1BQU0sQ0FBQ2tCLE9BQVAsQ0FBZXVCLE9BQWhCLENBQ0kxQyxLQUFLLENBQUNtQyxVQUFOLEdBQ007QUFBQ1EsUUFBQUEsYUFBYSxFQUFFM0MsS0FBSyxDQUFDbUM7QUFBdEIsT0FETixHQUVNbkMsS0FBSyxDQUFDMkIsT0FIaEIsRUFJSVosV0FKSixFQUtJRyxjQUxKLEVBTUlFLE9BTko7QUFRSDs7QUFFRCxXQUFPLFlBQU07QUFDVCxVQUFJbEIsU0FBUyxJQUFJRCxNQUFNLENBQUNrQixPQUF4QixFQUFpQztBQUM1QmxCLFFBQUFBLE1BQU0sQ0FBQ2tCLE9BQVAsQ0FBZVcsVUFBaEI7QUFDSDtBQUNKLEtBSkQ7QUFLSCxHQXhCRCxFQXdCRyxDQUFDNUIsU0FBRCxFQUFZRixLQUFLLENBQUNtQyxVQUFsQixFQUE4Qm5DLEtBQUssQ0FBQzJCLE9BQXBDLEVBQTZDM0IsS0FBSyxDQUFDb0MsR0FBbkQsQ0F4Qkg7QUEwQkEsTUFBTVEsR0FBRyxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFdBQ1I7QUFBQSxXQUFPO0FBQ0h0QixNQUFBQSxJQUFJLEVBQUpBLElBREc7QUFFSEUsTUFBQUEsU0FBUyxFQUFUQSxTQUZHO0FBR0h0QixNQUFBQSxTQUFTLEVBQVRBO0FBSEcsS0FBUDtBQUFBLEdBRFEsR0FNUixDQUFDQSxTQUFELEVBQVlvQixJQUFaLEVBQWtCRSxTQUFsQixDQU5RLENBQVo7QUFTQSxzQkFDSSw2QkFBQyxnQkFBRCxDQUFhLFFBQWI7QUFBc0IsSUFBQSxLQUFLLEVBQUVvQjtBQUE3QixLQUNLNUMsS0FBSyxDQUFDNkMsUUFEWCxDQURKO0FBS0gsQ0FoSmMsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTb2NrSlMsIHtPcHRpb25zfSBmcm9tICdzb2NranMtY2xpZW50JztcbmltcG9ydCB0eXBlIHtDbGllbnR9IGZyb20gJ3N0b21wanMnO1xuXG5pbXBvcnQgVXNlU3RvbXBDdHggZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBTdG9tcCBmcm9tICcuL3N0b21wJztcblxuZXhwb3J0IHR5cGUgVXNlU3RvbXBQcm92aWRlclByb3BzID0ge1xuICAgIC8qKlxuICAgICAqIEhUVFAgdG8gY29ubmVjdFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFkZCBjb25zb2xlIGxvZ3MgZm9yIGRlYnVnZ2luZ1xuICAgICAqL1xuICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTb2NrSlMgT3B0aW9ucyAoaHR0cHM6Ly9naXRodWIuY29tL3NvY2tqcy9zb2NranMtY2xpZW50I3NvY2tqcy1jbGllbnQtYXBpKVxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IGF1dGggaGVhZGVyIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzZXJ2ZXIgb3IgYWdlbnQgdGhyb3VnaCB0aGUgU1RPTVAgY29ubmVjdGlvbiBmcmFtZVxuICAgICAqL1xuICAgIGF1dGhIZWFkZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3QgaGVhZGVyIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzZXJ2ZXIgb3IgYWdlbnQgdGhyb3VnaCB0aGUgU1RPTVAgY29ubmVjdGlvbiBmcmFtZVxuICAgICAqL1xuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAvKipcbiAgICAgKiBvdmVycmlkZSBkZWZhdWx0IHBhcnNpbmcgb2YgbWVzc2FnZXNcbiAgICAgKi9cbiAgICBwYXJzZU1lc3NhZ2U/KGNoYW5uZWw6IHN0cmluZywgbXNnOiBhbnkpOiBhbnk7XG4gICAgLyoqXG4gICAgICogb3ZlcnJpZGUgZGVmYXVsdCBwYWNrYWdpbmcgb2YgbWVzc2FnZXNcbiAgICAgKi9cbiAgICBwYWNrYWdlTWVzc2FnZT8oY2hhbm5lbDogc3RyaW5nLCBtc2c6IGFueSwgb3B0SGVhZGVyczogYW55KTogYW55O1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IGhlYWRlciB0aGF0IHdpbGwgYmUgcGFzc2VkIHdoZW4gc3Vic2NyaWJpbmcgdG8gdGhlIHRhcmdldFxuICAgICAqL1xuICAgIHN1YnNjcmliZUhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWN0Lm1lbW88VXNlU3RvbXBQcm92aWRlclByb3BzPigocHJvcHMpID0+IHtcbiAgICBjb25zdCBjbGllbnQgPSB1c2VSZWY8Q2xpZW50PihudWxsKTtcblxuICAgIGNvbnN0IFtjb25uZWN0ZWQsIHNldENvbm5lY3RlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAoY2hhbm5lbCwgbXNnLCBvcHRIZWFkZXJzKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvcHMucGFja2FnZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcHMucGFja2FnZU1lc3NhZ2UoY2hhbm5lbCwgbXNnLCBvcHRIZWFkZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIG1zZyA9PT0gJ29iamVjdCcgJiYgbXNnICE9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkobXNnKVxuICAgICAgICAgICAgICAgICAgICA6IG1zZztcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXNnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbcHJvcHMucGFja2FnZU1lc3NhZ2VdXG4gICAgKTtcblxuICAgIGNvbnN0IHBhcnNlTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAoY2hhbm5lbCwgbXNnKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvcHMucGFyc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BzLnBhcnNlTWVzc2FnZShjaGFubmVsLCBtc2cpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UobXNnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgcGFyc2VkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICBwYXJzZWQgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLmNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZWQuY29udGVudFxuICAgICAgICAgICAgICAgICAgICA6IHBhcnNlZDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXNnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbcHJvcHMucGFyc2VNZXNzYWdlXVxuICAgICk7XG5cbiAgICBjb25zdCBvbkNvbm5lY3RlZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJyVjW3VzZS1zdG9tcDo6Y29ubmVjdGVkXScsICdjb2xvcjogcmdiKDk1LDE1Myw2Myk7Jyk7XG4gICAgICAgIHNldENvbm5lY3RlZCgoKSA9PiB0cnVlKTtcbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCBvbkRpc2Nvbm5lY3RlZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJyVjW3VzZS1zdG9tcDo6ZGlzY29ubmVjdGVkXScsICdjb2xvcjogcmdiKDE3MCwzNCwyMyk7Jyk7XG4gICAgICAgIHNldENvbm5lY3RlZCgoKSA9PiBmYWxzZSk7XG4gICAgICAgIGNsaWVudC5jdXJyZW50ID0gbnVsbDtcbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCBvbkVycm9yID0gdXNlQ2FsbGJhY2soKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1t1c2Utc3RvbXA6OmVycm9yXScsIGVycm9yKTtcbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCBzZW5kID0gdXNlQ2FsbGJhY2soXG4gICAgICAgIChjaGFubmVsLCBtc2csIG9wdEhlYWRlcnMgPSB7fSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIGNsaWVudC5jdXJyZW50LnNlbmQoXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgIG9wdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VNZXNzYWdlKGNoYW5uZWwsIG1zZywgb3B0SGVhZGVycylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICdbdXNlLXN0b21wOjpzZW5kXScsXG4gICAgICAgICAgICAgICAgICAgICdjYW5ub3Qgc2VuZCB3aGVuIHdlYnNvY2tldCBpcyBub3QgY29ubmVjdGVkJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtjbGllbnQuY3VycmVudCwgY29ubmVjdGVkLCBwYWNrYWdlTWVzc2FnZV1cbiAgICApO1xuXG4gICAgY29uc3Qgc3Vic2NyaWJlID0gdXNlQ2FsbGJhY2soXG4gICAgICAgIChjaGFubmVsLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LmN1cnJlbnQuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICAobXNnOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBwYXJzZU1lc3NhZ2UoY2hhbm5lbCwgbXNnLmJvZHkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhib2R5LCBtc2cuaGVhZGVycy5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib2R5ICYmIGJvZHkuc3RhdHVzID09PSAnRU5EJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGllbnQuY3VycmVudC5kaXNjb25uZWN0IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuc3Vic2NyaWJlSGVhZGVyc1xuICAgICAgICAgICAgICAgICkudW5zdWJzY3JpYmU7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIGNsaWVudC5jdXJyZW50Py5kaXNjb25uZWN0LFxuICAgICAgICAgICAgY2xpZW50LmN1cnJlbnQ/LnN1YnNjcmliZSxcbiAgICAgICAgICAgIHBhcnNlTWVzc2FnZSxcbiAgICAgICAgICAgIHByb3BzLnN1YnNjcmliZUhlYWRlcnNcbiAgICAgICAgXVxuICAgICk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBoYXNIZWFkZXJzID0gcHJvcHMuaGVhZGVycyB8fCBwcm9wcy5hdXRoSGVhZGVyO1xuXG4gICAgICAgIGlmIChoYXNIZWFkZXJzICYmIHByb3BzLnVybCAmJiAhY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBjbGllbnQuY3VycmVudCA9IFN0b21wLm92ZXIoXG4gICAgICAgICAgICAgICAgbmV3IFNvY2tKUyhwcm9wcy51cmwsIG51bGwsIHByb3BzLm9wdGlvbnMpLFxuICAgICAgICAgICAgICAgICEhcHJvcHMuZGVidWdcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIChjbGllbnQuY3VycmVudC5jb25uZWN0IGFzIGFueSkoXG4gICAgICAgICAgICAgICAgcHJvcHMuYXV0aEhlYWRlclxuICAgICAgICAgICAgICAgICAgICA/IHtBdXRob3JpemF0aW9uOiBwcm9wcy5hdXRoSGVhZGVyfVxuICAgICAgICAgICAgICAgICAgICA6IHByb3BzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb25Db25uZWN0ZWQsXG4gICAgICAgICAgICAgICAgb25EaXNjb25uZWN0ZWQsXG4gICAgICAgICAgICAgICAgb25FcnJvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGVkICYmIGNsaWVudC5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgKGNsaWVudC5jdXJyZW50LmRpc2Nvbm5lY3QgYXMgYW55KSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sIFtjb25uZWN0ZWQsIHByb3BzLmF1dGhIZWFkZXIsIHByb3BzLmhlYWRlcnMsIHByb3BzLnVybF0pO1xuXG4gICAgY29uc3QgY3R4ID0gdXNlTWVtbyhcbiAgICAgICAgKCkgPT4gKHtcbiAgICAgICAgICAgIHNlbmQsXG4gICAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgICBjb25uZWN0ZWRcbiAgICAgICAgfSksXG4gICAgICAgIFtjb25uZWN0ZWQsIHNlbmQsIHN1YnNjcmliZV1cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPFVzZVN0b21wQ3R4LlByb3ZpZGVyIHZhbHVlPXtjdHh9PlxuICAgICAgICAgICAge3Byb3BzLmNoaWxkcmVufVxuICAgICAgICA8L1VzZVN0b21wQ3R4LlByb3ZpZGVyPlxuICAgICk7XG59KTtcbiJdfQ==