UNPKG

use-stomp

Version:

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

599 lines (467 loc) 66.9 kB
import "core-js/modules/es.array.index-of"; import "core-js/modules/es.array.iterator"; import "core-js/modules/es.array.join"; import "core-js/modules/es.array-buffer.constructor"; import "core-js/modules/es.array-buffer.slice"; import "core-js/modules/es.object.to-string"; import "core-js/modules/es.regexp.constructor"; import "core-js/modules/es.regexp.exec"; import "core-js/modules/es.regexp.to-string"; import "core-js/modules/es.string.match"; import "core-js/modules/es.string.replace"; import "core-js/modules/es.string.search"; import "core-js/modules/es.string.split"; import "core-js/modules/es.typed-array.uint8-array"; import "core-js/modules/es.typed-array.copy-within"; import "core-js/modules/es.typed-array.every"; import "core-js/modules/es.typed-array.fill"; import "core-js/modules/es.typed-array.filter"; import "core-js/modules/es.typed-array.find"; import "core-js/modules/es.typed-array.find-index"; import "core-js/modules/es.typed-array.for-each"; import "core-js/modules/es.typed-array.includes"; import "core-js/modules/es.typed-array.index-of"; import "core-js/modules/es.typed-array.iterator"; import "core-js/modules/es.typed-array.join"; import "core-js/modules/es.typed-array.last-index-of"; import "core-js/modules/es.typed-array.map"; import "core-js/modules/es.typed-array.reduce"; import "core-js/modules/es.typed-array.reduce-right"; import "core-js/modules/es.typed-array.reverse"; import "core-js/modules/es.typed-array.set"; import "core-js/modules/es.typed-array.slice"; import "core-js/modules/es.typed-array.some"; import "core-js/modules/es.typed-array.sort"; import "core-js/modules/es.typed-array.subarray"; import "core-js/modules/es.typed-array.to-locale-string"; import "core-js/modules/es.typed-array.to-string"; import { w3cwebsocket as WebSocketClass } from '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 = WebSocketClass || 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 }; export default Stomp; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zdG9tcC50cyJdLCJuYW1lcyI6WyJ3M2N3ZWJzb2NrZXQiLCJXZWJTb2NrZXRDbGFzcyIsIl9faGFzUHJvcCIsImhhc093blByb3BlcnR5IiwiQnl0ZSIsIkxGIiwiTlVMTCIsIkZyYW1lIiwiY29tbWFuZCIsImhlYWRlcnMiLCJib2R5IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJsaW5lcyIsInNraXBDb250ZW50TGVuZ3RoIiwiX3JlZiIsIm5hbWUiLCJjYWxsIiwidmFsdWUiLCJwdXNoIiwic2l6ZU9mVVRGOCIsImpvaW4iLCJzIiwiZW5jb2RlVVJJIiwibWF0Y2giLCJsZW5ndGgiLCJ1bm1hcnNoYWxsU2luZ2xlIiwiZGF0YSIsImkiLCJfaiIsIl9yZWYxIiwiY2hyIiwiaWR4IiwibGVuIiwibGluZSIsImRpdmlkZXIiLCJzZWFyY2giLCJSZWdFeHAiLCJoZWFkZXJMaW5lcyIsInN1YnN0cmluZyIsInNwbGl0Iiwic2hpZnQiLCJ0cmltIiwic3RyIiwicmVwbGFjZSIsInJldmVyc2UiLCJfaSIsIl9sZW4iLCJpbmRleE9mIiwic3RhcnQiLCJwYXJzZUludCIsImNoYXJBdCIsInVubWFyc2hhbGwiLCJkYXRhcyIsIl9yZXN1bHRzIiwibWFyc2hhbGwiLCJmcmFtZSIsIkNsaWVudCIsIm5vdyIsIndzIiwiZGVidWciLCJiaW5hcnlUeXBlIiwiY291bnRlciIsImRlYnVnRW5hYmxlZCIsImNvbm5lY3RlZCIsImhlYXJ0YmVhdCIsIm91dGdvaW5nIiwiaW5jb21pbmciLCJtYXhXZWJTb2NrZXRGcmFtZVNpemUiLCJzdWJzY3JpcHRpb25zIiwibWVzc2FnZSIsIndpbmRvdyIsInNlbGYiLCJjb25zb2xlIiwibG9nIiwiRGF0ZSIsInZhbHVlT2YiLCJfdHJhbnNtaXQiLCJvdXQiLCJzZW5kIiwiX3NldHVwSGVhcnRiZWF0Iiwic2VydmVySW5jb21pbmciLCJzZXJ2ZXJPdXRnb2luZyIsInR0bCIsInYiLCJ2ZXJzaW9uIiwiU3RvbXAiLCJWRVJTSU9OUyIsIlYxXzEiLCJWMV8yIiwiTWF0aCIsIm1heCIsInBpbmdlciIsInNldEludGVydmFsIiwiX3RoaXMiLCJwb25nZXIiLCJkZWx0YSIsInNlcnZlckFjdGl2aXR5IiwiY2xvc2UiLCJjb25uZWN0Q2FsbGJhY2siLCJkaXNjb25uZWN0Q2FsbGJhY2siLCJlcnJvckNhbGxiYWNrIiwiY29ubmVjdCIsIm9ubWVzc2FnZSIsImV2dCIsImFyciIsImMiLCJjbGllbnQiLCJtZXNzYWdlSUQiLCJvbnJlY2VpdmUiLCJzdWJzY3JpcHRpb24iLCJBcnJheUJ1ZmZlciIsIlVpbnQ4QXJyYXkiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJzZXJ2ZXIiLCJhY2siLCJuYWNrIiwib25yZWNlaXB0Iiwib25jbG9zZSIsIm1zZyIsInVybCIsIl9jbGVhblVwIiwib25vcGVuIiwic3VwcG9ydGVkVmVyc2lvbnMiLCJkaXNjb25uZWN0IiwiY2FsbGJhY2siLCJjbGVhckludGVydmFsIiwiZGVzdGluYXRpb24iLCJzdWJzY3JpYmUiLCJpZCIsInVuc3Vic2NyaWJlIiwiYmVnaW4iLCJ0cmFuc2FjdGlvbiIsInR4aWQiLCJjb21taXQiLCJhYm9ydCIsIlYxXzAiLCJwcm90b2NvbHMiLCJrbGFzcyIsIldlYlNvY2tldCIsIm92ZXIiLCJpbnRlcnZhbCIsImYiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFRQSxZQUFZLElBQUlDLGNBQXhCLFFBQTZDLFdBQTdDO0FBQ0EsSUFBTUMsU0FBUyxHQUFHLEdBQUdDLGNBQXJCLEMsQ0FDQTs7QUFFQSxJQUFNQyxJQUFJLEdBQUc7QUFDVEMsRUFBQUEsRUFBRSxFQUFFLE1BREs7QUFFVEMsRUFBQUEsSUFBSSxFQUFFO0FBRkcsQ0FBYjs7QUFLQSxJQUFNQyxLQUFLLEdBQUksWUFBWTtBQUN2QixXQUFTQSxLQUFULENBQWVDLE9BQWYsRUFBd0JDLE9BQXhCLEVBQWlDQyxJQUFqQyxFQUF1QztBQUNuQyxTQUFLRixPQUFM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QUFvQkMsQ0FBcEIsRUFBdUI7QUFDaEMsV0FBTyxDQUFDdkUsSUFBSSxJQUFJRCxNQUFULEVBQWlCc0IsV0FBakIsQ0FBNkJrRCxDQUE3QixFQUFnQ0QsUUFBaEMsQ0FBUDtBQUNILEdBMUJTO0FBMkJWZixFQUFBQSxhQUFhLEVBQUUsdUJBQVVHLEVBQVYsRUFBYztBQUN6QixXQUFPLENBQUMxRCxJQUFJLElBQUlELE1BQVQsRUFBaUJ3RCxhQUFqQixDQUErQkcsRUFBL0IsQ0FBUDtBQUNILEdBN0JTO0FBOEJWM0gsRUFBQUEsS0FBSyxFQUFMQTtBQTlCVSxDQUFkO0FBaUNBLGVBQWUrRSxLQUFmIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt3M2N3ZWJzb2NrZXQgYXMgV2ViU29ja2V0Q2xhc3N9IGZyb20gJ3dlYnNvY2tldCc7XG5jb25zdCBfX2hhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbi8vIGNvbnN0IF9fc2xpY2UgPSBbXS5zbGljZTtcblxuY29uc3QgQnl0ZSA9IHtcbiAgICBMRjogJ1xceDBBJyxcbiAgICBOVUxMOiAnXFx4MDAnXG59O1xuXG5jb25zdCBGcmFtZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRnJhbWUoY29tbWFuZCwgaGVhZGVycywgYm9keSkge1xuICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kO1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzICE9IG51bGwgPyBoZWFkZXJzIDoge307XG4gICAgICAgIHRoaXMuYm9keSA9IGJvZHkgIT0gbnVsbCA/IGJvZHkgOiAnJztcbiAgICB9XG5cbiAgICBGcmFtZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gW3RoaXMuY29tbWFuZF07XG4gICAgICAgIGNvbnN0IHNraXBDb250ZW50TGVuZ3RoID0gdGhpcy5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddID09PSBmYWxzZTtcblxuICAgICAgICBpZiAoc2tpcENvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfcmVmID0gdGhpcy5oZWFkZXJzO1xuXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gX3JlZikge1xuICAgICAgICAgICAgaWYgKCFfX2hhc1Byb3AuY2FsbChfcmVmLCBuYW1lKSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IF9yZWZbbmFtZV07XG4gICAgICAgICAgICBsaW5lcy5wdXNoKCcnICsgbmFtZSArICc6JyArIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmJvZHkgJiYgIXNraXBDb250ZW50TGVuZ3RoKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKCdjb250ZW50LWxlbmd0aDonICsgRnJhbWUuc2l6ZU9mVVRGOCh0aGlzLmJvZHkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVzLnB1c2goQnl0ZS5MRiArIHRoaXMuYm9keSk7XG5cbiAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oQnl0ZS5MRik7XG4gICAgfTtcblxuICAgIEZyYW1lLnNpemVPZlVURjggPSBmdW5jdGlvbiAocykge1xuICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSShzKS5tYXRjaCgvJS4ufC4vZykubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdW5tYXJzaGFsbFNpbmdsZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGxldCBpO1xuICAgICAgICBsZXQgX2o7XG4gICAgICAgIGxldCBfcmVmMTtcbiAgICAgICAgbGV0IGNocjtcbiAgICAgICAgbGV0IGlkeDtcbiAgICAgICAgbGV0IGxlbjtcbiAgICAgICAgbGV0IGxpbmU7XG5cbiAgICAgICAgY29uc3QgZGl2aWRlciA9IGRhdGEuc2VhcmNoKFJlZ0V4cCgnJyArIEJ5dGUuTEYgKyBCeXRlLkxGKSk7XG5cbiAgICAgICAgY29uc3QgaGVhZGVyTGluZXMgPSBkYXRhLnN1YnN0cmluZygwLCBkaXZpZGVyKS5zcGxpdChCeXRlLkxGKTtcblxuICAgICAgICBjb25zdCBjb21tYW5kID0gaGVhZGVyTGluZXMuc2hpZnQoKTtcblxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG5cbiAgICAgICAgY29uc3QgdHJpbSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IF9yZWYgPSBoZWFkZXJMaW5lcy5yZXZlcnNlKCk7XG5cbiAgICAgICAgZm9yIChsZXQgX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgbGluZSA9IF9yZWZbX2ldO1xuICAgICAgICAgICAgaWR4ID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAgICAgICAgICBoZWFkZXJzW3RyaW0obGluZS5zdWJzdHJpbmcoMCwgaWR4KSldID0gdHJpbShcbiAgICAgICAgICAgICAgICBsaW5lLnN1YnN0cmluZyhpZHggKyAxKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBib2R5ID0gJyc7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gZGl2aWRlciArIDI7XG5cbiAgICAgICAgaWYgKGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pIHtcbiAgICAgICAgICAgIGxlbiA9IHBhcnNlSW50KGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pO1xuICAgICAgICAgICAgYm9keSA9ICgnJyArIGRhdGEpLnN1YnN0cmluZyhzdGFydCwgc3RhcnQgKyBsZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hyID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgaSA9IF9qID0gc3RhcnQsIF9yZWYxID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgc3RhcnQgPD0gX3JlZjEgPyBfaiA8IF9yZWYxIDogX2ogPiBfcmVmMTtcbiAgICAgICAgICAgICAgICBpID0gc3RhcnQgPD0gX3JlZjEgPyArK19qIDogLS1falxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2hyID0gZGF0YS5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKGNociA9PT0gQnl0ZS5OVUxMKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib2R5ICs9IGNocjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZyYW1lKGNvbW1hbmQsIGhlYWRlcnMsIGJvZHkpO1xuICAgIH07XG5cbiAgICBGcmFtZS51bm1hcnNoYWxsID0gZnVuY3Rpb24gKGRhdGFzKSB7XG4gICAgICAgIHJldHVybiAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgX3JlZiA9IGRhdGFzLnNwbGl0KFJlZ0V4cCgnJyArIEJ5dGUuTlVMTCArIEJ5dGUuTEYgKyAnKicpKTtcbiAgICAgICAgICAgIGNvbnN0IF9yZXN1bHRzID0gW107XG5cbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gX3JlZltfaV07XG4gICAgICAgICAgICAgICAgaWYgKChkYXRhICE9IG51bGwgPyBkYXRhLmxlbmd0aCA6IHZvaWQgMCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXN1bHRzLnB1c2godW5tYXJzaGFsbFNpbmdsZShkYXRhKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX3Jlc3VsdHM7XG4gICAgICAgIH0pKCk7XG4gICAgfTtcblxuICAgIEZyYW1lLm1hcnNoYWxsID0gZnVuY3Rpb24gKGNvbW1hbmQsIGhlYWRlcnMsIGJvZHkpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgRnJhbWUoY29tbWFuZCwgaGVhZGVycywgYm9keSk7XG4gICAgICAgIHJldHVybiBmcmFtZS50b1N0cmluZygpICsgQnl0ZS5OVUxMO1xuICAgIH07XG5cbiAgICByZXR1cm4gRnJhbWU7XG59KSgpO1xuXG5jb25zdCBDbGllbnQgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBub3c7XG5cbiAgICBmdW5jdGlvbiBDbGllbnQod3MsIGRlYnVnID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy53cyA9IHdzO1xuICAgICAgICB0aGlzLndzLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLmRlYnVnRW5hYmxlZCA9IGRlYnVnIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdCA9IHtcbiAgICAgICAgICAgIG91dGdvaW5nOiAxMDAwMCxcbiAgICAgICAgICAgIGluY29taW5nOiAxMDAwMFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1heFdlYlNvY2tldEZyYW1lU2l6ZSA9IDE2ICogMTAyNDtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5kZWJ1ZyA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIGxldCBfcmVmO1xuXG4gICAgICAgIGlmICghdGhpcy5kZWJ1Z0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0eXBlb2YgKHdpbmRvdyB8fCBzZWxmKSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICh3aW5kb3cgfHwgc2VsZikgIT09IG51bGxcbiAgICAgICAgICAgID8gKF9yZWYgPSAod2luZG93IHx8IHNlbGYpLmNvbnNvbGUpICE9IG51bGxcbiAgICAgICAgICAgICAgICA/IF9yZWYubG9nKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgOiB2b2lkIDBcbiAgICAgICAgICAgIDogdm9pZCAwO1xuICAgIH07XG5cbiAgICBub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChEYXRlLm5vdykge1xuICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoKS52YWx1ZU9mO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuX3RyYW5zbWl0ID0gZnVuY3Rpb24gKGNvbW1hbmQsIGhlYWRlcnMsIGJvZHkpIHtcbiAgICAgICAgbGV0IG91dCA9IEZyYW1lLm1hcnNoYWxsKGNvbW1hbmQsIGhlYWRlcnMsIGJvZHkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZWJ1ZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnPj4+ICcgKyBvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGlmIChvdXQubGVuZ3RoID4gdGhpcy5tYXhXZWJTb2NrZXRGcmFtZVNpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndzLnNlbmQob3V0LnN1YnN0cmluZygwLCB0aGlzLm1heFdlYlNvY2tldEZyYW1lU2l6ZSkpO1xuICAgICAgICAgICAgICAgIG91dCA9IG91dC5zdWJzdHJpbmcodGhpcy5tYXhXZWJTb2NrZXRGcmFtZVNpemUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZWJ1ZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdyZW1haW5pbmcgPSAnICsgb3V0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cy5zZW5kKG91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5fc2V0dXBIZWFydGJlYXQgPSBmdW5jdGlvbiAoaGVhZGVycykge1xuICAgICAgICB2YXIgc2VydmVySW5jb21pbmcsIHNlcnZlck91dGdvaW5nLCB0dGwsIHYsIF9yZWYsIF9yZWYxO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChfcmVmID0gaGVhZGVycy52ZXJzaW9uKSAhPT0gU3RvbXAuVkVSU0lPTlMuVjFfMSAmJlxuICAgICAgICAgICAgX3JlZiAhPT0gU3RvbXAuVkVSU0lPTlMuVjFfMlxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIChfcmVmMSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgX2ksIF9sZW4sIF9yZWYxLCBfcmVzdWx0cztcbiAgICAgICAgICAgIF9yZWYxID0gaGVhZGVyc1snaGVhcnQtYmVhdCddLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICBfcmVzdWx0cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICAgIHYgPSBfcmVmMVtfaV07XG4gICAgICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChwYXJzZUludCh2KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX3Jlc3VsdHM7XG4gICAgICAgIH0pKCkpLFxuICAgICAgICAgICAgKHNlcnZlck91dGdvaW5nID0gX3JlZjFbMF0pLFxuICAgICAgICAgICAgKHNlcnZlckluY29taW5nID0gX3JlZjFbMV0pO1xuXG4gICAgICAgIGlmICghKHRoaXMuaGVhcnRiZWF0Lm91dGdvaW5nID09PSAwIHx8IHNlcnZlckluY29taW5nID09PSAwKSkge1xuICAgICAgICAgICAgdHRsID0gTWF0aC5tYXgodGhpcy5oZWFydGJlYXQub3V0Z29pbmcsIHNlcnZlckluY29taW5nKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZWJ1ZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ3NlbmQgUElORyBldmVyeSAnICsgdHRsICsgJ21zJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBpbmdlciA9IFN0b21wLnNldEludGVydmFsKFxuICAgICAgICAgICAgICAgIHR0bCxcbiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKF90aGlzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy53cy5zZW5kKEJ5dGUuTEYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBfdGhpcy5kZWJ1ZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX3RoaXMuZGVidWcoJz4+PiBQSU5HJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KSh0aGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh0aGlzLmhlYXJ0YmVhdC5pbmNvbWluZyA9PT0gMCB8fCBzZXJ2ZXJPdXRnb2luZyA9PT0gMCkpIHtcbiAgICAgICAgICAgIHR0bCA9IE1hdGgubWF4KHRoaXMuaGVhcnRiZWF0LmluY29taW5nLCBzZXJ2ZXJPdXRnb2luZyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGVidWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdjaGVjayBQT05HIGV2ZXJ5ICcgKyB0dGwgKyAnbXMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAodGhpcy5wb25nZXIgPSBTdG9tcC5zZXRJbnRlcnZhbChcbiAgICAgICAgICAgICAgICB0dGwsXG4gICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChfdGhpcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm