UNPKG

use-stomp

Version:

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

645 lines (473 loc) 67.1 kB
"use strict"; require("core-js/modules/es.array.index-of"); require("core-js/modules/es.array.iterator"); require("core-js/modules/es.array.join"); require("core-js/modules/es.array-buffer.constructor"); require("core-js/modules/es.array-buffer.slice"); require("core-js/modules/es.object.to-string"); require("core-js/modules/es.regexp.constructor"); require("core-js/modules/es.regexp.exec"); require("core-js/modules/es.regexp.to-string"); require("core-js/modules/es.string.match"); require("core-js/modules/es.string.replace"); require("core-js/modules/es.string.search"); require("core-js/modules/es.string.split"); require("core-js/modules/es.typed-array.uint8-array"); require("core-js/modules/es.typed-array.copy-within"); require("core-js/modules/es.typed-array.every"); require("core-js/modules/es.typed-array.fill"); require("core-js/modules/es.typed-array.filter"); require("core-js/modules/es.typed-array.find"); require("core-js/modules/es.typed-array.find-index"); require("core-js/modules/es.typed-array.for-each"); require("core-js/modules/es.typed-array.includes"); require("core-js/modules/es.typed-array.index-of"); require("core-js/modules/es.typed-array.iterator"); require("core-js/modules/es.typed-array.join"); require("core-js/modules/es.typed-array.last-index-of"); require("core-js/modules/es.typed-array.map"); require("core-js/modules/es.typed-array.reduce"); require("core-js/modules/es.typed-array.reduce-right"); require("core-js/modules/es.typed-array.reverse"); require("core-js/modules/es.typed-array.set"); require("core-js/modules/es.typed-array.slice"); require("core-js/modules/es.typed-array.some"); require("core-js/modules/es.typed-array.sort"); require("core-js/modules/es.typed-array.subarray"); require("core-js/modules/es.typed-array.to-locale-string"); require("core-js/modules/es.typed-array.to-string"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _websocket = require("websocket"); var __hasProp = {}.hasOwnProperty; // const __slice = [].slice; var Byte = { LF: '\x0A', NULL: '\x00' }; var Frame = function () { function Frame(command, headers, body) { this.command = command; this.headers = headers != null ? headers : {}; this.body = body != null ? body : ''; } Frame.prototype.toString = function () { var lines = [this.command]; var skipContentLength = this.headers['content-length'] === false; if (skipContentLength) { delete this.headers['content-length']; } var _ref = this.headers; for (var name in _ref) { if (!__hasProp.call(_ref, name)) continue; var value = _ref[name]; lines.push('' + name + ':' + value); } if (this.body && !skipContentLength) { lines.push('content-length:' + Frame.sizeOfUTF8(this.body)); } lines.push(Byte.LF + this.body); return lines.join(Byte.LF); }; Frame.sizeOfUTF8 = function (s) { if (s) { return encodeURI(s).match(/%..|./g).length; } else { return 0; } }; var unmarshallSingle = function unmarshallSingle(data) { var i; var _j; var _ref1; var chr; var idx; var len; var line; var divider = data.search(RegExp('' + Byte.LF + Byte.LF)); var headerLines = data.substring(0, divider).split(Byte.LF); var command = headerLines.shift(); var headers = {}; var trim = function trim(str) { return str.replace(/^\s+|\s+$/g, ''); }; var _ref = headerLines.reverse(); for (var _i = 0, _len = _ref.length; _i < _len; _i++) { line = _ref[_i]; idx = line.indexOf(':'); headers[trim(line.substring(0, idx))] = trim(line.substring(idx + 1)); } var body = ''; var start = divider + 2; if (headers['content-length']) { len = parseInt(headers['content-length']); body = ('' + data).substring(start, start + len); } else { chr = null; for (i = _j = start, _ref1 = data.length; start <= _ref1 ? _j < _ref1 : _j > _ref1; i = start <= _ref1 ? ++_j : --_j) { chr = data.charAt(i); if (chr === Byte.NULL) { break; } body += chr; } } return new Frame(command, headers, body); }; Frame.unmarshall = function (datas) { return function () { var _ref = datas.split(RegExp('' + Byte.NULL + Byte.LF + '*')); var _results = []; for (var _i = 0, _len = _ref.length; _i < _len; _i++) { var data = _ref[_i]; if ((data != null ? data.length : void 0) > 0) { _results.push(unmarshallSingle(data)); } } return _results; }(); }; Frame.marshall = function (command, headers, body) { var frame = new Frame(command, headers, body); return frame.toString() + Byte.NULL; }; return Frame; }(); var Client = function () { var now; function Client(ws) { var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; this.ws = ws; this.ws.binaryType = 'arraybuffer'; this.counter = 0; this.debugEnabled = debug || false; this.connected = false; this.heartbeat = { outgoing: 10000, incoming: 10000 }; this.maxWebSocketFrameSize = 16 * 1024; this.subscriptions = {}; } Client.prototype.debug = function (message) { var _ref; if (!this.debugEnabled) { return; } return typeof (window || self) !== 'undefined' && (window || self) !== null ? (_ref = (window || self).console) != null ? _ref.log(message) : void 0 : void 0; }; now = function now() { if (Date.now) { return Date.now(); } else { return new Date().valueOf; } }; Client.prototype._transmit = function (command, headers, body) { var out = Frame.marshall(command, headers, body); if (typeof this.debug === 'function') { this.debug('>>> ' + out); } while (true) { if (out.length > this.maxWebSocketFrameSize) { this.ws.send(out.substring(0, this.maxWebSocketFrameSize)); out = out.substring(this.maxWebSocketFrameSize); if (typeof this.debug === 'function') { this.debug('remaining = ' + out.length); } } else { return this.ws.send(out); } } }; Client.prototype._setupHeartbeat = function (headers) { var serverIncoming, serverOutgoing, ttl, v, _ref, _ref1; if ((_ref = headers.version) !== Stomp.VERSIONS.V1_1 && _ref !== Stomp.VERSIONS.V1_2) { return; } _ref1 = function () { var _i, _len, _ref1, _results; _ref1 = headers['heart-beat'].split(','); _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { v = _ref1[_i]; _results.push(parseInt(v)); } return _results; }(), serverOutgoing = _ref1[0], serverIncoming = _ref1[1]; if (!(this.heartbeat.outgoing === 0 || serverIncoming === 0)) { ttl = Math.max(this.heartbeat.outgoing, serverIncoming); if (typeof this.debug === 'function') { this.debug('send PING every ' + ttl + 'ms'); } this.pinger = Stomp.setInterval(ttl, function (_this) { return function () { _this.ws.send(Byte.LF); return typeof _this.debug === 'function' ? _this.debug('>>> PING') : void 0; }; }(this)); } if (!(this.heartbeat.incoming === 0 || serverOutgoing === 0)) { ttl = Math.max(this.heartbeat.incoming, serverOutgoing); if (typeof this.debug === 'function') { this.debug('check PONG every ' + ttl + 'ms'); } return this.ponger = Stomp.setInterval(ttl, function (_this) { return function () { var delta; delta = now() - _this.serverActivity; if (delta > ttl * 2) { if (typeof _this.debug === 'function') { _this.debug('did not receive server activity for the last ' + delta + 'ms'); } return _this.ws.close(); } }; }(this)); } }; Client.prototype.headers = null; Client.prototype.connectCallback = function () {}; Client.prototype.disconnectCallback = function () {}; Client.prototype.errorCallback = function () {}; Client.prototype.connect = function (headers, connectCallback, disconnectCallback, errorCallback) { if (typeof this.debug === 'function') { this.debug('Opening Web Socket...'); } this.headers = headers; this.errorCallback = errorCallback; this.connectCallback = connectCallback; this.disconnectCallback = disconnectCallback; this.ws.onmessage = function (_this) { return function (evt) { var arr, c, client, data, frame, messageID, onreceive, subscription, _i, _len, _ref, _results; data = typeof ArrayBuffer !== 'undefined' && evt.data instanceof ArrayBuffer ? (arr = new Uint8Array(evt.data), typeof _this.debug === 'function' ? _this.debug('--- got data length: ' + arr.length) : void 0, function () { var _i, _len, _results; _results = []; for (_i = 0, _len = arr.length; _i < _len; _i++) { c = arr[_i]; _results.push(String.fromCharCode(c)); } return _results; }().join('')) : evt.data; _this.serverActivity = now(); if (data === Byte.LF) { if (typeof _this.debug === 'function') { _this.debug('<<< PONG'); } return; } if (typeof _this.debug === 'function') { _this.debug('<<< ' + data); } _ref = Frame.unmarshall(data); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { frame = _ref[_i]; switch (frame.command) { case 'CONNECTED': if (typeof _this.debug === 'function') { _this.debug('connected to server ' + frame.headers.server); } _this.connected = true; _this._setupHeartbeat(frame.headers); _results.push(typeof _this.connectCallback === 'function' ? _this.connectCallback(frame) : void 0); break; case 'MESSAGE': subscription = frame.headers.subscription; onreceive = _this.subscriptions[subscription] || _this.onreceive; if (onreceive) { client = _this; messageID = frame.headers['message-id']; frame.ack = function (headers) { if (headers == null) { headers = {}; } return client.ack(messageID, subscription, headers); }; frame.nack = function (headers) { if (headers == null) { headers = {}; } return client.nack(messageID, subscription, headers); }; _results.push(onreceive(frame)); } else { _results.push(typeof _this.debug === 'function' ? _this.debug('Unhandled received MESSAGE: ' + frame) : void 0); } break; case 'RECEIPT': _results.push(typeof _this.onreceipt === 'function' ? _this.onreceipt(frame) : void 0); break; case 'ERROR': _results.push(typeof _this.errorCallback === 'function' ? _this.errorCallback(frame) : void 0); break; default: _results.push(typeof _this.debug === 'function' ? _this.debug('Unhandled frame: ' + frame) : void 0); } } return _results; }; }(this); this.ws.onclose = function (_this) { return function () { var msg = 'Whoops! Lost connection to ' + _this.ws.url; if (typeof _this.debug === 'function') { _this.debug(msg); } _this._cleanUp(); return typeof disconnectCallback === 'function' ? disconnectCallback() : void 0; }; }(this); return this.ws.onopen = function (_this) { return function () { if (typeof _this.debug === 'function') { _this.debug('Web Socket Opened...'); } _this.headers['accept-version'] = Stomp.VERSIONS.supportedVersions(); _this.headers['heart-beat'] = [_this.heartbeat.outgoing, _this.heartbeat.incoming].join(','); return _this._transmit('CONNECT', _this.headers); }; }(this); }; Client.prototype.disconnect = function (callback) { if (this.headers == null) { this.headers = {}; } this._transmit('DISCONNECT', this.headers); this.ws.onclose = null; this.ws.close(); this._cleanUp(); if (callback) { callback(); } if (typeof this.disconnectCallback === 'function') { this.disconnectCallback(); } this.connectCallback = function () {}; this.disconnectCallback = function () {}; this.errorCallback = function () {}; }; Client.prototype._cleanUp = function () { this.connected = false; if (this.pinger) { Stomp.clearInterval(this.pinger); } if (this.ponger) { return Stomp.clearInterval(this.ponger); } }; Client.prototype.send = function (destination, headers, body) { if (headers == null) { headers = {}; } if (body == null) { body = ''; } headers.destination = destination; return this._transmit('SEND', headers, body); }; Client.prototype.subscribe = function (destination, callback, headers) { var client; if (headers == null) { headers = {}; } if (!headers.id) { headers.id = 'sub-' + this.counter++; } headers.destination = destination; this.subscriptions[headers.id] = callback; this._transmit('SUBSCRIBE', headers); client = this; return { id: headers.id, unsubscribe: function unsubscribe() { return client.unsubscribe(headers.id); } }; }; Client.prototype.unsubscribe = function (id) { delete this.subscriptions[id]; return this._transmit('UNSUBSCRIBE', { id: id }); }; Client.prototype.begin = function (transaction) { var client, txid; txid = transaction || 'tx-' + this.counter++; this._transmit('BEGIN', { transaction: txid }); client = this; return { id: txid, commit: function commit() { return client.commit(txid); }, abort: function abort() { return client.abort(txid); } }; }; Client.prototype.commit = function (transaction) { return this._transmit('COMMIT', { transaction: transaction }); }; Client.prototype.abort = function (transaction) { return this._transmit('ABORT', { transaction: transaction }); }; Client.prototype.ack = function (messageID, subscription, headers) { if (headers == null) { headers = {}; } headers['message-id'] = messageID; headers.subscription = subscription; return this._transmit('ACK', headers); }; Client.prototype.nack = function (messageID, subscription, headers) { if (headers == null) { headers = {}; } headers['message-id'] = messageID; headers.subscription = subscription; return this._transmit('NACK', headers); }; return Client; }(); var Stomp = { debug: false, VERSIONS: { V1_0: '1.0', V1_1: '1.1', V1_2: '1.2', supportedVersions: function supportedVersions() { return '1.1,1.0'; } }, client: function client(url, protocols) { if (protocols == null) { protocols = ['v10.stomp', 'v11.stomp']; } var klass = _websocket.w3cwebsocket || WebSocket; var ws = new klass(url, protocols); return new Client(ws); }, over: function over(ws) { var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; return new Client(ws, debug); }, setInterval: function setInterval(interval, f) { return (self || window).setInterval(f, interval); }, clearInterval: function clearInterval(id) { return (self || window).clearInterval(id); }, Frame: Frame }; var _default = Stomp; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zdG9tcC50cyJdLCJuYW1lcyI6WyJfX2hhc1Byb3AiLCJoYXNPd25Qcm9wZXJ0eSIsIkJ5dGUiLCJMRiIsIk5VTEwiLCJGcmFtZSIsImNvbW1hbmQiLCJoZWFkZXJzIiwiYm9keSIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwibGluZXMiLCJza2lwQ29udGVudExlbmd0aCIsIl9yZWYiLCJuYW1lIiwiY2FsbCIsInZhbHVlIiwicHVzaCIsInNpemVPZlVURjgiLCJqb2luIiwicyIsImVuY29kZVVSSSIsIm1hdGNoIiwibGVuZ3RoIiwidW5tYXJzaGFsbFNpbmdsZSIsImRhdGEiLCJpIiwiX2oiLCJfcmVmMSIsImNociIsImlkeCIsImxlbiIsImxpbmUiLCJkaXZpZGVyIiwic2VhcmNoIiwiUmVnRXhwIiwiaGVhZGVyTGluZXMiLCJzdWJzdHJpbmciLCJzcGxpdCIsInNoaWZ0IiwidHJpbSIsInN0ciIsInJlcGxhY2UiLCJyZXZlcnNlIiwiX2kiLCJfbGVuIiwiaW5kZXhPZiIsInN0YXJ0IiwicGFyc2VJbnQiLCJjaGFyQXQiLCJ1bm1hcnNoYWxsIiwiZGF0YXMiLCJfcmVzdWx0cyIsIm1hcnNoYWxsIiwiZnJhbWUiLCJDbGllbnQiLCJub3ciLCJ3cyIsImRlYnVnIiwiYmluYXJ5VHlwZSIsImNvdW50ZXIiLCJkZWJ1Z0VuYWJsZWQiLCJjb25uZWN0ZWQiLCJoZWFydGJlYXQiLCJvdXRnb2luZyIsImluY29taW5nIiwibWF4V2ViU29ja2V0RnJhbWVTaXplIiwic3Vic2NyaXB0aW9ucyIsIm1lc3NhZ2UiLCJ3aW5kb3ciLCJzZWxmIiwiY29uc29sZSIsImxvZyIsIkRhdGUiLCJ2YWx1ZU9mIiwiX3RyYW5zbWl0Iiwib3V0Iiwic2VuZCIsIl9zZXR1cEhlYXJ0YmVhdCIsInNlcnZlckluY29taW5nIiwic2VydmVyT3V0Z29pbmciLCJ0dGwiLCJ2IiwidmVyc2lvbiIsIlN0b21wIiwiVkVSU0lPTlMiLCJWMV8xIiwiVjFfMiIsIk1hdGgiLCJtYXgiLCJwaW5nZXIiLCJzZXRJbnRlcnZhbCIsIl90aGlzIiwicG9uZ2VyIiwiZGVsdGEiLCJzZXJ2ZXJBY3Rpdml0eSIsImNsb3NlIiwiY29ubmVjdENhbGxiYWNrIiwiZGlzY29ubmVjdENhbGxiYWNrIiwiZXJyb3JDYWxsYmFjayIsImNvbm5lY3QiLCJvbm1lc3NhZ2UiLCJldnQiLCJhcnIiLCJjIiwiY2xpZW50IiwibWVzc2FnZUlEIiwib25yZWNlaXZlIiwic3Vic2NyaXB0aW9uIiwiQXJyYXlCdWZmZXIiLCJVaW50OEFycmF5IiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwic2VydmVyIiwiYWNrIiwibmFjayIsIm9ucmVjZWlwdCIsIm9uY2xvc2UiLCJtc2ciLCJ1cmwiLCJfY2xlYW5VcCIsIm9ub3BlbiIsInN1cHBvcnRlZFZlcnNpb25zIiwiZGlzY29ubmVjdCIsImNhbGxiYWNrIiwiY2xlYXJJbnRlcnZhbCIsImRlc3RpbmF0aW9uIiwic3Vic2NyaWJlIiwiaWQiLCJ1bnN1YnNjcmliZSIsImJlZ2luIiwidHJhbnNhY3Rpb24iLCJ0eGlkIiwiY29tbWl0IiwiYWJvcnQiLCJWMV8wIiwicHJvdG9jb2xzIiwia2xhc3MiLCJXZWJTb2NrZXRDbGFzcyIsIldlYlNvY2tldCIsIm92ZXIiLCJpbnRlcnZhbCIsImYiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBLElBQU1BLFNBQVMsR0FBRyxHQUFHQyxjQUFyQixDLENBQ0E7O0FBRUEsSUFBTUMsSUFBSSxHQUFHO0FBQ1RDLEVBQUFBLEVBQUUsRUFBRSxNQURLO0FBRVRDLEVBQUFBLElBQUksRUFBRTtBQUZHLENBQWI7O0FBS0EsSUFBTUMsS0FBSyxHQUFJLFlBQVk7QUFDdkIsV0FBU0EsS0FBVCxDQUFlQyxPQUFmLEVBQXdCQyxPQUF4QixFQUFpQ0MsSUFBakMsRUFBdUM7QUFDbkMsU0FBS0YsT0FBTCxHQUFl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QixFQUF1QjtBQUNoQyxXQUFPLENBQUN4RSxJQUFJLElBQUlELE1BQVQsRUFBaUJzQixXQUFqQixDQUE2Qm1ELENBQTdCLEVBQWdDRCxRQUFoQyxDQUFQO0FBQ0gsR0ExQlM7QUEyQlZoQixFQUFBQSxhQUFhLEVBQUUsdUJBQVVHLEVBQVYsRUFBYztBQUN6QixXQUFPLENBQUMxRCxJQUFJLElBQUlELE1BQVQsRUFBaUJ3RCxhQUFqQixDQUErQkcsRUFBL0IsQ0FBUDtBQUNILEdBN0JTO0FBOEJWM0gsRUFBQUEsS0FBSyxFQUFMQTtBQTlCVSxDQUFkO2VBaUNlK0UsSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7dzNjd2Vic29ja2V0IGFzIFdlYlNvY2tldENsYXNzfSBmcm9tICd3ZWJzb2NrZXQnO1xuY29uc3QgX19oYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG4vLyBjb25zdCBfX3NsaWNlID0gW10uc2xpY2U7XG5cbmNvbnN0IEJ5dGUgPSB7XG4gICAgTEY6ICdcXHgwQScsXG4gICAgTlVMTDogJ1xceDAwJ1xufTtcblxuY29uc3QgRnJhbWUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZyYW1lKGNvbW1hbmQsIGhlYWRlcnMsIGJvZHkpIHtcbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycyAhPSBudWxsID8gaGVhZGVycyA6IHt9O1xuICAgICAgICB0aGlzLmJvZHkgPSBib2R5ICE9IG51bGwgPyBib2R5IDogJyc7XG4gICAgfVxuXG4gICAgRnJhbWUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBsaW5lcyA9IFt0aGlzLmNvbW1hbmRdO1xuICAgICAgICBjb25zdCBza2lwQ29udGVudExlbmd0aCA9IHRoaXMuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9PT0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHNraXBDb250ZW50TGVuZ3RoKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgX3JlZiA9IHRoaXMuaGVhZGVycztcblxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIF9yZWYpIHtcbiAgICAgICAgICAgIGlmICghX19oYXNQcm9wLmNhbGwoX3JlZiwgbmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBfcmVmW25hbWVdO1xuICAgICAgICAgICAgbGluZXMucHVzaCgnJyArIG5hbWUgKyAnOicgKyB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ib2R5ICYmICFza2lwQ29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgbGluZXMucHVzaCgnY29udGVudC1sZW5ndGg6JyArIEZyYW1lLnNpemVPZlVURjgodGhpcy5ib2R5KSk7XG4gICAgICAgIH1cblxuICAgICAgICBsaW5lcy5wdXNoKEJ5dGUuTEYgKyB0aGlzLmJvZHkpO1xuXG4gICAgICAgIHJldHVybiBsaW5lcy5qb2luKEJ5dGUuTEYpO1xuICAgIH07XG5cbiAgICBGcmFtZS5zaXplT2ZVVEY4ID0gZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUkkocykubWF0Y2goLyUuLnwuL2cpLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHVubWFyc2hhbGxTaW5nbGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgbGV0IF9qO1xuICAgICAgICBsZXQgX3JlZjE7XG4gICAgICAgIGxldCBjaHI7XG4gICAgICAgIGxldCBpZHg7XG4gICAgICAgIGxldCBsZW47XG4gICAgICAgIGxldCBsaW5lO1xuXG4gICAgICAgIGNvbnN0IGRpdmlkZXIgPSBkYXRhLnNlYXJjaChSZWdFeHAoJycgKyBCeXRlLkxGICsgQnl0ZS5MRikpO1xuXG4gICAgICAgIGNvbnN0IGhlYWRlckxpbmVzID0gZGF0YS5zdWJzdHJpbmcoMCwgZGl2aWRlcikuc3BsaXQoQnl0ZS5MRik7XG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IGhlYWRlckxpbmVzLnNoaWZ0KCk7XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuXG4gICAgICAgIGNvbnN0IHRyaW0gPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBfcmVmID0gaGVhZGVyTGluZXMucmV2ZXJzZSgpO1xuXG4gICAgICAgIGZvciAobGV0IF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICAgIGxpbmUgPSBfcmVmW19pXTtcbiAgICAgICAgICAgIGlkeCA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgICAgICAgICAgaGVhZGVyc1t0cmltKGxpbmUuc3Vic3RyaW5nKDAsIGlkeCkpXSA9IHRyaW0oXG4gICAgICAgICAgICAgICAgbGluZS5zdWJzdHJpbmcoaWR4ICsgMSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYm9keSA9ICcnO1xuICAgICAgICBjb25zdCBzdGFydCA9IGRpdmlkZXIgKyAyO1xuXG4gICAgICAgIGlmIChoZWFkZXJzWydjb250ZW50LWxlbmd0aCddKSB7XG4gICAgICAgICAgICBsZW4gPSBwYXJzZUludChoZWFkZXJzWydjb250ZW50LWxlbmd0aCddKTtcbiAgICAgICAgICAgIGJvZHkgPSAoJycgKyBkYXRhKS5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0ICsgbGVuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNociA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIGkgPSBfaiA9IHN0YXJ0LCBfcmVmMSA9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHN0YXJ0IDw9IF9yZWYxID8gX2ogPCBfcmVmMSA6IF9qID4gX3JlZjE7XG4gICAgICAgICAgICAgICAgaSA9IHN0YXJ0IDw9IF9yZWYxID8gKytfaiA6IC0tX2pcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNociA9IGRhdGEuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGlmIChjaHIgPT09IEJ5dGUuTlVMTCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm9keSArPSBjaHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGcmFtZShjb21tYW5kLCBoZWFkZXJzLCBib2R5KTtcbiAgICB9O1xuXG4gICAgRnJhbWUudW5tYXJzaGFsbCA9IGZ1bmN0aW9uIChkYXRhcykge1xuICAgICAgICByZXR1cm4gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBkYXRhcy5zcGxpdChSZWdFeHAoJycgKyBCeXRlLk5VTEwgKyBCeXRlLkxGICsgJyonKSk7XG4gICAgICAgICAgICBjb25zdCBfcmVzdWx0cyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IF9yZWZbX2ldO1xuICAgICAgICAgICAgICAgIGlmICgoZGF0YSAhPSBudWxsID8gZGF0YS5sZW5ndGggOiB2b2lkIDApID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0cy5wdXNoKHVubWFyc2hhbGxTaW5nbGUoZGF0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgICB9KSgpO1xuICAgIH07XG5cbiAgICBGcmFtZS5tYXJzaGFsbCA9IGZ1bmN0aW9uIChjb21tYW5kLCBoZWFkZXJzLCBib2R5KSB7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gbmV3IEZyYW1lKGNvbW1hbmQsIGhlYWRlcnMsIGJvZHkpO1xuICAgICAgICByZXR1cm4gZnJhbWUudG9TdHJpbmcoKSArIEJ5dGUuTlVMTDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEZyYW1lO1xufSkoKTtcblxuY29uc3QgQ2xpZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbm93O1xuXG4gICAgZnVuY3Rpb24gQ2xpZW50KHdzLCBkZWJ1ZyA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMud3MgPSB3cztcbiAgICAgICAgdGhpcy53cy5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5kZWJ1Z0VuYWJsZWQgPSBkZWJ1ZyB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oZWFydGJlYXQgPSB7XG4gICAgICAgICAgICBvdXRnb2luZzogMTAwMDAsXG4gICAgICAgICAgICBpbmNvbWluZzogMTAwMDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5tYXhXZWJTb2NrZXRGcmFtZVNpemUgPSAxNiAqIDEwMjQ7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIENsaWVudC5wcm90b3R5cGUuZGVidWcgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICBsZXQgX3JlZjtcblxuICAgICAgICBpZiAoIXRoaXMuZGVidWdFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHlwZW9mICh3aW5kb3cgfHwgc2VsZikgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAod2luZG93IHx8IHNlbGYpICE9PSBudWxsXG4gICAgICAgICAgICA/IChfcmVmID0gKHdpbmRvdyB8fCBzZWxmKS5jb25zb2xlKSAhPSBudWxsXG4gICAgICAgICAgICAgICAgPyBfcmVmLmxvZyhtZXNzYWdlKVxuICAgICAgICAgICAgICAgIDogdm9pZCAwXG4gICAgICAgICAgICA6IHZvaWQgMDtcbiAgICB9O1xuXG4gICAgbm93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoRGF0ZS5ub3cpIHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkudmFsdWVPZjtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLl90cmFuc21pdCA9IGZ1bmN0aW9uIChjb21tYW5kLCBoZWFkZXJzLCBib2R5KSB7XG4gICAgICAgIGxldCBvdXQgPSBGcmFtZS5tYXJzaGFsbChjb21tYW5kLCBoZWFkZXJzLCBib2R5KTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGVidWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoJz4+PiAnICsgb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAob3V0Lmxlbmd0aCA+IHRoaXMubWF4V2ViU29ja2V0RnJhbWVTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cy5zZW5kKG91dC5zdWJzdHJpbmcoMCwgdGhpcy5tYXhXZWJTb2NrZXRGcmFtZVNpemUpKTtcbiAgICAgICAgICAgICAgICBvdXQgPSBvdXQuc3Vic3RyaW5nKHRoaXMubWF4V2ViU29ja2V0RnJhbWVTaXplKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGVidWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygncmVtYWluaW5nID0gJyArIG91dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3Muc2VuZChvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuX3NldHVwSGVhcnRiZWF0ID0gZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgICAgICAgdmFyIHNlcnZlckluY29taW5nLCBzZXJ2ZXJPdXRnb2luZywgdHRsLCB2LCBfcmVmLCBfcmVmMTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoX3JlZiA9IGhlYWRlcnMudmVyc2lvbikgIT09IFN0b21wLlZFUlNJT05TLlYxXzEgJiZcbiAgICAgICAgICAgIF9yZWYgIT09IFN0b21wLlZFUlNJT05TLlYxXzJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAoX3JlZjEgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IF9pLCBfbGVuLCBfcmVmMSwgX3Jlc3VsdHM7XG4gICAgICAgICAgICBfcmVmMSA9IGhlYWRlcnNbJ2hlYXJ0LWJlYXQnXS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgX3Jlc3VsdHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2ID0gX3JlZjFbX2ldO1xuICAgICAgICAgICAgICAgIF9yZXN1bHRzLnB1c2gocGFyc2VJbnQodikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgICB9KSgpKSxcbiAgICAgICAgICAgIChzZXJ2ZXJPdXRnb2luZyA9IF9yZWYxWzBdKSxcbiAgICAgICAgICAgIChzZXJ2ZXJJbmNvbWluZyA9IF9yZWYxWzFdKTtcblxuICAgICAgICBpZiAoISh0aGlzLmhlYXJ0YmVhdC5vdXRnb2luZyA9PT0gMCB8fCBzZXJ2ZXJJbmNvbWluZyA9PT0gMCkpIHtcbiAgICAgICAgICAgIHR0bCA9IE1hdGgubWF4KHRoaXMuaGVhcnRiZWF0Lm91dGdvaW5nLCBzZXJ2ZXJJbmNvbWluZyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGVidWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdzZW5kIFBJTkcgZXZlcnkgJyArIHR0bCArICdtcycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5waW5nZXIgPSBTdG9tcC5zZXRJbnRlcnZhbChcbiAgICAgICAgICAgICAgICB0dGwsXG4gICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChfdGhpcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMud3Muc2VuZChCeXRlLkxGKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgX3RoaXMuZGVidWcgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF90aGlzLmRlYnVnKCc+Pj4gUElORycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSkodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodGhpcy5oZWFydGJlYXQuaW5jb21pbmcgPT09IDAgfHwgc2VydmVyT3V0Z29pbmcgPT09IDApKSB7XG4gICAgICAgICAgICB0dGwgPSBNYXRoLm1heCh0aGlzLmhlYXJ0YmVhdC5pbmNvbWluZywgc2VydmVyT3V0Z29pbmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRlYnVnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnY2hlY2sgUE9ORyBldmVyeSAnICsgdHRsICsgJ21