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