curated-node
Version:
Not a framework. Not a module. Just a bunch of Node.js packages you most likely familiar with and probably already use, bundled together in a modular fashion.
182 lines • 19.9 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SocketIOKernel = void 0;
var socket_io_1 = require("socket.io");
var http_1 = require("http");
var _BaseKernel_1 = require("../_BaseKernel");
var normalize_path_1 = __importDefault(require("normalize-path"));
var SocketIOKernel = (function (_super) {
__extends(SocketIOKernel, _super);
function SocketIOKernel(config, socketIONamespaces, expressKernel, logger) {
var _a, _b, _c, _d;
var _this = _super.call(this, SocketIOKernel, config, logger) || this;
if (_this.config.options.path) {
_this.config.options.path = normalize_path_1.default("/" + _this.config.options.path);
}
if (expressKernel) {
if (expressKernel.httpServer.listening)
throw new Error("Target HTTP server is already listening!");
_this._io = socket_io_1.listen(expressKernel.httpServer, _this.config.options);
(_a = _this.logger) === null || _a === void 0 ? void 0 : _a.success("Bound to <" + ((_b = expressKernel.config.logger) === null || _b === void 0 ? void 0 : _b.origin) + ">" + (_this.config.options.path ? " at " + _this.config.options.path : ""));
}
else {
if (!_this.config.httpServerOptions)
throw new Error("Attempted to listen on an instance with no HTTP server attached, and no http server config for spawning an internal HTTP server!");
_this._httpServer = http_1.createServer();
(_c = _this.logger) === null || _c === void 0 ? void 0 : _c.success("Bootstrapped to internal HTTP server" + (_this.config.options.path ? " at " + _this.config.options.path : ""));
_this._io = socket_io_1.listen(_this._httpServer, _this.config.options);
}
var _loop_1 = function (socketIONamespace) {
var nsp = normalize_path_1.default("/" + socketIONamespace.name);
for (var _i = 0, _a = (_d = socketIONamespace.preConnectionMiddleware) !== null && _d !== void 0 ? _d : []; _i < _a.length; _i++) {
var middleware = _a[_i];
this_1._io.of(nsp).use(middleware);
}
var _loop_2 = function (listener) {
this_1._io.of(nsp).on("connection", function (socket) {
socket.on(listener.event, function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
listener.handler(socket, _this._io.of(nsp)).apply(void 0, args);
});
});
};
for (var _b = 0, _c = socketIONamespace.listeners; _b < _c.length; _b++) {
var listener = _c[_b];
_loop_2(listener);
}
};
var this_1 = this;
for (var _i = 0, socketIONamespaces_1 = socketIONamespaces; _i < socketIONamespaces_1.length; _i++) {
var socketIONamespace = socketIONamespaces_1[_i];
_loop_1(socketIONamespace);
}
return _this;
}
SocketIOKernel.prototype.use = function (middleware) {
var _a;
(_a = this._logger) === null || _a === void 0 ? void 0 : _a.info("use " + (middleware.prototype.constructor.name || "...") + "(...)");
this._io.use(middleware);
return this;
};
SocketIOKernel.prototype.boot = function () {
var _this = this;
var _a;
(_a = this._logger) === null || _a === void 0 ? void 0 : _a.info("boot");
return new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () {
var _this = this;
var _a, _b;
return __generator(this, function (_c) {
try {
if (this._httpServer) {
this._httpServer.listen(this.config.httpServerOptions.port, function () {
var _a, _b;
(_a = _this.logger) === null || _a === void 0 ? void 0 : _a.success(((_b = _this.config.logger) === null || _b === void 0 ? void 0 : _b.origin) + " listening on " + _this.config.httpServerOptions.port);
resolve(true);
});
}
else {
(_a = this._logger) === null || _a === void 0 ? void 0 : _a.error("Instance is attached to an external HTTP server. Listen from there!");
return [2, resolve(false)];
}
}
catch (e) {
(_b = this._logger) === null || _b === void 0 ? void 0 : _b.error(e.name + ": " + e.message);
resolve(false);
}
return [2];
});
}); });
};
SocketIOKernel.prototype.halt = function () {
var _this = this;
var _a;
(_a = this._logger) === null || _a === void 0 ? void 0 : _a.warn("halt");
return new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () {
var _a;
return __generator(this, function (_b) {
try {
this._io.close(function () {
resolve(true);
});
}
catch (e) {
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.error(e.name + ": " + e.message);
resolve(false);
}
return [2];
});
}); });
};
Object.defineProperty(SocketIOKernel.prototype, "httpServer", {
get: function () {
return this._httpServer;
},
enumerable: false,
configurable: true
});
Object.defineProperty(SocketIOKernel.prototype, "io", {
get: function () {
return this._io;
},
enumerable: false,
configurable: true
});
return SocketIOKernel;
}(_BaseKernel_1._BaseKernel));
exports.SocketIOKernel = SocketIOKernel;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29ja2V0SU8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMva2VybmVscy9Tb2NrZXRJTy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUNBS2tCO0FBQ2xCLDZCQUF5RDtBQUV6RCw4Q0FBNEM7QUFHNUMsa0VBQTBDO0FBVzFDO0lBQW9DLGtDQUduQztJQUlDLHdCQUNFLE1BQTRCLEVBQzVCLGtCQUF1QyxFQUN2QyxhQUE2QixFQUM3QixNQUFrQjs7UUFKcEIsWUFNRSxrQkFBTSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxTQWlEdEM7UUE3Q0MsSUFBSSxLQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDNUIsS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLHdCQUFhLENBQUMsTUFBSSxLQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFNLENBQUMsQ0FBQTtTQUN6RTtRQUVELElBQUksYUFBYSxFQUFFO1lBQ2pCLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxTQUFTO2dCQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUE7WUFFN0QsS0FBSSxDQUFDLEdBQUcsR0FBRyxrQkFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNoRSxNQUFBLEtBQUksQ0FBQyxNQUFNLDBDQUFFLE9BQU8sQ0FDbEIsc0JBQWEsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLDBDQUFFLE1BQU0sV0FDOUMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFPLEtBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNqRSxFQUNIO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQjtnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FDYixrSUFBa0ksQ0FDbkksQ0FBQTtZQUVILEtBQUksQ0FBQyxXQUFXLEdBQUcsbUJBQVksRUFBRSxDQUFBO1lBQ2pDLE1BQUEsS0FBSSxDQUFDLE1BQU0sMENBQUUsT0FBTyxDQUNsQiwwQ0FDRSxLQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQU8sS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2pFLEVBQ0g7WUFDRCxLQUFJLENBQUMsR0FBRyxHQUFHLGtCQUFNLENBQUMsS0FBSSxDQUFDLFdBQVcsRUFBRSxLQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1NBQ3pEO2dDQUVVLGlCQUFpQjtZQUMxQixJQUFNLEdBQUcsR0FBRyx3QkFBYSxDQUFDLE1BQUksaUJBQWlCLENBQUMsSUFBTSxDQUFDLENBQUE7WUFFdkQsNEJBQXlCLGlCQUFpQixDQUFDLHVCQUF1QixtQ0FDaEUsRUFBRSx3QkFBRTtnQkFERCxJQUFNLFVBQVUsU0FBQTtnQkFFbkIsT0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTthQUNqQztvQ0FFVSxRQUFRO2dCQUNqQixPQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFDLE1BQXNCO29CQUN2RCxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7d0JBQUMsY0FBYzs2QkFBZCxVQUFjLEVBQWQscUJBQWMsRUFBZCxJQUFjOzRCQUFkLHlCQUFjOzt3QkFDdkMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsZUFBSSxJQUFJLEVBQUM7b0JBQ3JELENBQUMsQ0FBQyxDQUFBO2dCQUNKLENBQUMsQ0FBQyxDQUFBOztZQUxKLEtBQXVCLFVBQTJCLEVBQTNCLEtBQUEsaUJBQWlCLENBQUMsU0FBUyxFQUEzQixjQUEyQixFQUEzQixJQUEyQjtnQkFBN0MsSUFBTSxRQUFRLFNBQUE7d0JBQVIsUUFBUTthQU1sQjs7O1FBZEgsS0FBZ0MsVUFBa0IsRUFBbEIseUNBQWtCLEVBQWxCLGdDQUFrQixFQUFsQixJQUFrQjtZQUE3QyxJQUFNLGlCQUFpQiwyQkFBQTtvQkFBakIsaUJBQWlCO1NBZTNCOztJQUNILENBQUM7SUFFTSw0QkFBRyxHQUFWLFVBQ0UsVUFBcUU7O1FBRXJFLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsSUFBSSxDQUNoQixVQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxLQUFLLFdBQU8sRUFDN0Q7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN4QixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCw2QkFBSSxHQUFKO1FBQUEsaUJBd0JDOztRQXZCQyxNQUFBLElBQUksQ0FBQyxPQUFPLDBDQUFFLElBQUksQ0FBQyxNQUFNLEVBQUM7UUFDMUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFPLE9BQU87Ozs7Z0JBQy9CLElBQUk7b0JBQ0YsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO3dCQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFrQixDQUFDLElBQUksRUFBRTs7NEJBQzNELE1BQUEsS0FBSSxDQUFDLE1BQU0sMENBQUUsT0FBTyxDQUNsQixPQUFHLEtBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSwwQ0FBRSxNQUFNLHVCQUMzQixLQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFrQixDQUFDLElBQy9CLEVBQ0g7NEJBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO3dCQUNmLENBQUMsQ0FBQyxDQUFBO3FCQUNIO3lCQUFNO3dCQUNMLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsS0FBSyxDQUNqQixxRUFBcUUsRUFDdEU7d0JBQ0QsV0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUE7cUJBQ3RCO2lCQUNGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNWLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsS0FBSyxDQUFJLENBQUMsQ0FBQyxJQUFJLFVBQUssQ0FBQyxDQUFDLE9BQVMsRUFBQztvQkFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO2lCQUNmOzs7YUFDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsNkJBQUksR0FBSjtRQUFBLGlCQVlDOztRQVhDLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQztRQUMxQixPQUFPLElBQUksT0FBTyxDQUFDLFVBQU8sT0FBTzs7O2dCQUMvQixJQUFJO29CQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO3dCQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDZixDQUFDLENBQUMsQ0FBQTtpQkFDSDtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDVixNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLEtBQUssQ0FBSSxDQUFDLENBQUMsSUFBSSxVQUFLLENBQUMsQ0FBQyxPQUFTLEVBQUM7b0JBQzdDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtpQkFDZjs7O2FBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELHNCQUFJLHNDQUFVO2FBQWQ7WUFDRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUE7UUFDekIsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSw4QkFBRTthQUFOO1lBQ0UsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFBO1FBQ2pCLENBQUM7OztPQUFBO0lBQ0gscUJBQUM7QUFBRCxDQUFDLEFBekhELENBQW9DLHlCQUFXLEdBeUg5QztBQXpIWSx3Q0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFNlcnZlciBhcyBTb2NrZXRJT1NlcnZlcixcbiAgU29ja2V0IGFzIFNvY2tldElPU29ja2V0LFxuICBsaXN0ZW4sXG4gIFNlcnZlck9wdGlvbnMgYXMgU29ja2V0SU9TZXJ2ZXJPcHRpb25zXG59IGZyb20gXCJzb2NrZXQuaW9cIlxuaW1wb3J0IHsgU2VydmVyIGFzIEh0dHBTZXJ2ZXIsIGNyZWF0ZVNlcnZlciB9IGZyb20gXCJodHRwXCJcbmltcG9ydCB7IExvZ01vZHVsZSwgTG9nTW9kdWxlQ29uZmlnIH0gZnJvbSBcIi4uL21vZHVsZXMvTG9nXCJcbmltcG9ydCB7IF9CYXNlS2VybmVsIH0gZnJvbSBcIi4uL19CYXNlS2VybmVsXCJcbmltcG9ydCB7IEV4cHJlc3NLZXJuZWwgfSBmcm9tIFwiLi9FeHByZXNzXCJcbmltcG9ydCB7IFNvY2tldElPTmFtZXNwYWNlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvU29ja2V0SU9OYW1lc3BhY2VcIlxuaW1wb3J0IG5vcm1hbGl6ZVBhdGggZnJvbSBcIm5vcm1hbGl6ZS1wYXRoXCJcblxuZXhwb3J0IHR5cGUgU29ja2V0SU9LZXJuZWxDb25maWcgPSB7XG4gIGlkPzogc3RyaW5nXG4gIGxvZ2dlcj86IExvZ01vZHVsZUNvbmZpZ1xuICBodHRwU2VydmVyT3B0aW9ucz86IHtcbiAgICBwb3J0OiBudW1iZXJcbiAgfVxuICBvcHRpb25zOiBQYXJ0aWFsPFNvY2tldElPU2VydmVyT3B0aW9ucz5cbn1cblxuZXhwb3J0IGNsYXNzIFNvY2tldElPS2VybmVsIGV4dGVuZHMgX0Jhc2VLZXJuZWw8XG4gIFNvY2tldElPS2VybmVsLFxuICBTb2NrZXRJT0tlcm5lbENvbmZpZ1xuPiB7XG4gIHByaXZhdGUgX2h0dHBTZXJ2ZXI/OiBIdHRwU2VydmVyXG4gIHByaXZhdGUgX2lvOiBTb2NrZXRJT1NlcnZlclxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbmZpZzogU29ja2V0SU9LZXJuZWxDb25maWcsXG4gICAgc29ja2V0SU9OYW1lc3BhY2VzOiBTb2NrZXRJT05hbWVzcGFjZVtdLFxuICAgIGV4cHJlc3NLZXJuZWw/OiBFeHByZXNzS2VybmVsLFxuICAgIGxvZ2dlcj86IExvZ01vZHVsZVxuICApIHtcbiAgICBzdXBlcihTb2NrZXRJT0tlcm5lbCwgY29uZmlnLCBsb2dnZXIpXG5cbiAgICAvLyBpZiBwYXRoIGRvZXNuJ3QgYmVnaW4gd2l0aCBhIFwiL1wiLCBTb2NrZXRJTyBtaXNiZWhhdmVzXG4gICAgLy8gdGhpcyBmaXhlcyB0aGF0XG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMucGF0aCkge1xuICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5wYXRoID0gbm9ybWFsaXplUGF0aChgLyR7dGhpcy5jb25maWcub3B0aW9ucy5wYXRofWApXG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3NLZXJuZWwpIHtcbiAgICAgIGlmIChleHByZXNzS2VybmVsLmh0dHBTZXJ2ZXIubGlzdGVuaW5nKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYXJnZXQgSFRUUCBzZXJ2ZXIgaXMgYWxyZWFkeSBsaXN0ZW5pbmchXCIpXG5cbiAgICAgIHRoaXMuX2lvID0gbGlzdGVuKGV4cHJlc3NLZXJuZWwuaHR0cFNlcnZlciwgdGhpcy5jb25maWcub3B0aW9ucylcbiAgICAgIHRoaXMubG9nZ2VyPy5zdWNjZXNzKFxuICAgICAgICBgQm91bmQgdG8gPCR7ZXhwcmVzc0tlcm5lbC5jb25maWcubG9nZ2VyPy5vcmlnaW59PiR7XG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5wYXRoID8gYCBhdCAke3RoaXMuY29uZmlnLm9wdGlvbnMucGF0aH1gIDogXCJcIlxuICAgICAgICB9YFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlnLmh0dHBTZXJ2ZXJPcHRpb25zKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJBdHRlbXB0ZWQgdG8gbGlzdGVuIG9uIGFuIGluc3RhbmNlIHdpdGggbm8gSFRUUCBzZXJ2ZXIgYXR0YWNoZWQsIGFuZCBubyBodHRwIHNlcnZlciBjb25maWcgZm9yIHNwYXduaW5nIGFuIGludGVybmFsIEhUVFAgc2VydmVyIVwiXG4gICAgICAgIClcblxuICAgICAgdGhpcy5faHR0cFNlcnZlciA9IGNyZWF0ZVNlcnZlcigpXG4gICAgICB0aGlzLmxvZ2dlcj8uc3VjY2VzcyhcbiAgICAgICAgYEJvb3RzdHJhcHBlZCB0byBpbnRlcm5hbCBIVFRQIHNlcnZlciR7XG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5wYXRoID8gYCBhdCAke3RoaXMuY29uZmlnLm9wdGlvbnMucGF0aH1gIDogXCJcIlxuICAgICAgICB9YFxuICAgICAgKVxuICAgICAgdGhpcy5faW8gPSBsaXN0ZW4odGhpcy5faHR0cFNlcnZlciwgdGhpcy5jb25maWcub3B0aW9ucylcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvY2tldElPTmFtZXNwYWNlIG9mIHNvY2tldElPTmFtZXNwYWNlcykge1xuICAgICAgY29uc3QgbnNwID0gbm9ybWFsaXplUGF0aChgLyR7c29ja2V0SU9OYW1lc3BhY2UubmFtZX1gKVxuXG4gICAgICBmb3IgKGNvbnN0IG1pZGRsZXdhcmUgb2Ygc29ja2V0SU9OYW1lc3BhY2UucHJlQ29ubmVjdGlvbk1pZGRsZXdhcmUgPz9cbiAgICAgICAgW10pIHtcbiAgICAgICAgdGhpcy5faW8ub2YobnNwKS51c2UobWlkZGxld2FyZSlcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBzb2NrZXRJT05hbWVzcGFjZS5saXN0ZW5lcnMpIHtcbiAgICAgICAgdGhpcy5faW8ub2YobnNwKS5vbihcImNvbm5lY3Rpb25cIiwgKHNvY2tldDogU29ja2V0SU9Tb2NrZXQpID0+IHtcbiAgICAgICAgICBzb2NrZXQub24obGlzdGVuZXIuZXZlbnQsICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlcihzb2NrZXQsIHRoaXMuX2lvLm9mKG5zcCkpKC4uLmFyZ3MpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXNlKFxuICAgIG1pZGRsZXdhcmU6IChzb2NrZXQ6IFNvY2tldElPU29ja2V0LCBmbjogKGVycj86IGFueSkgPT4gdm9pZCkgPT4gdm9pZFxuICApIHtcbiAgICB0aGlzLl9sb2dnZXI/LmluZm8oXG4gICAgICBgdXNlICR7bWlkZGxld2FyZS5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSB8fCBcIi4uLlwifSguLi4pYFxuICAgIClcbiAgICB0aGlzLl9pby51c2UobWlkZGxld2FyZSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgYm9vdCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMuX2xvZ2dlcj8uaW5mbyhcImJvb3RcIilcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLl9odHRwU2VydmVyKSB7XG4gICAgICAgICAgdGhpcy5faHR0cFNlcnZlci5saXN0ZW4odGhpcy5jb25maWcuaHR0cFNlcnZlck9wdGlvbnMhLnBvcnQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyPy5zdWNjZXNzKFxuICAgICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy5sb2dnZXI/Lm9yaWdpbn0gbGlzdGVuaW5nIG9uICR7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuaHR0cFNlcnZlck9wdGlvbnMhLnBvcnRcbiAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlcj8uZXJyb3IoXG4gICAgICAgICAgICBcIkluc3RhbmNlIGlzIGF0dGFjaGVkIHRvIGFuIGV4dGVybmFsIEhUVFAgc2VydmVyLiBMaXN0ZW4gZnJvbSB0aGVyZSFcIlxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLl9sb2dnZXI/LmVycm9yKGAke2UubmFtZX06ICR7ZS5tZXNzYWdlfWApXG4gICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGhhbHQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLl9sb2dnZXI/Lndhcm4oXCJoYWx0XCIpXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9pby5jbG9zZSgoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZ2dlcj8uZXJyb3IoYCR7ZS5uYW1lfTogJHtlLm1lc3NhZ2V9YClcbiAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0IGh0dHBTZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2h0dHBTZXJ2ZXJcbiAgfVxuXG4gIGdldCBpbygpIHtcbiAgICByZXR1cm4gdGhpcy5faW9cbiAgfVxufVxuIl19