@ordino.ai/cli
Version:
ordino.ai global command line interface
703 lines (702 loc) • 45 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.cognitoAuthService = exports.CognitoAuthService = void 0;
var _express = _interopRequireDefault(require("express"));
var _open = _interopRequireDefault(require("open"));
var _printMessage = require("../utils/printMessage.util");
var _serviceFactory = require("../config/service-factory");
var _cognito = require("../config/cognito.config");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); }
function _OverloadYield(e, d) { this.v = e, this.k = d; }
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
var CognitoAuthService = exports.CognitoAuthService = /*#__PURE__*/function () {
function CognitoAuthService() {
_classCallCheck(this, CognitoAuthService);
_defineProperty(this, "server", null);
_defineProperty(this, "portRange", {
min: 8000,
max: 8010
});
_defineProperty(this, "currentPort", null);
_defineProperty(this, "authCompletePromise", null);
_defineProperty(this, "authCompleteResolver", null);
this.app = (0, _express["default"])();
this.setupRoutes();
}
return _createClass(CognitoAuthService, [{
key: "getUserFriendlyErrorMessage",
value: function getUserFriendlyErrorMessage(error) {
var errorMessage = (error === null || error === void 0 ? void 0 : error.message) || (error === null || error === void 0 ? void 0 : error.toString()) || 'Unknown error';
if (errorMessage.includes('fetch failed') || errorMessage.includes('ECONNREFUSED') || errorMessage.includes('ENOTFOUND') || errorMessage.includes('ETIMEDOUT')) {
return 'Unable to connect to the authentication server. Please check your internet connection and try again.';
}
if (errorMessage.includes('access_denied') || errorMessage.includes('user_cancelled')) {
return 'Authentication was cancelled or denied. Please try signing in again.';
}
if (errorMessage.includes('invalid_grant') || errorMessage.includes('invalid_request')) {
return 'The authentication request was invalid. Please try signing in again.';
}
if (errorMessage.includes('server_error') || errorMessage.includes('temporarily_unavailable')) {
return 'The authentication service is temporarily unavailable. Please try again in a few moments.';
}
if (errorMessage.includes('Social sign-in failed')) {
return 'Unable to complete social sign-in. Please try again or contact support if the issue persists.';
}
if (errorMessage.includes('Token exchange failed')) {
return 'Unable to complete authentication. Please try signing in again.';
}
if (errorMessage.includes('Failed to') || errorMessage.includes('Error:') || errorMessage.includes('Exception:')) {
return 'An unexpected error occurred during authentication. Please try again.';
}
return errorMessage;
}
}, {
key: "generateErrorPageHTML",
value: function generateErrorPageHTML(errorMessage) {
return "\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Authentication Error - Ordino CLI</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n }\n .container {\n background: white;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n padding: 48px;\n text-align: center;\n max-width: 500px;\n width: 100%;\n animation: slideUp 0.5s ease-out;\n }\n @keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n h1 { color: #1a202c; font-size: 28px; font-weight: 700; margin-bottom: 16px; }\n .error-message {\n background: #fff5f5;\n border-left: 4px solid #f5576c;\n padding: 16px;\n border-radius: 8px;\n margin: 20px 0;\n color: #c53030;\n font-size: 14px;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Authentication Error</h1>\n <p style=\"color: #4a5568; margin-bottom: 16px;\">Something went wrong during authentication</p>\n <div class=\"error-message\">\n ".concat(errorMessage, "\n </div>\n <p style=\"color: #718096; font-size: 14px; margin-top: 20px;\">\n You can close this window and try again from the CLI\n </p>\n </div>\n <script>\n setTimeout(() => { window.close(); }, 5000);\n </script>\n </body>\n </html>\n ");
}
}, {
key: "isPortAvailable",
value: function () {
var _isPortAvailable = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(port) {
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
return _context.abrupt("return", new Promise(function (resolve) {
try {
var net = require('net');
var testServer = net.createServer();
testServer.listen(port, 'localhost', function () {
testServer.close(function () {
return resolve(true);
});
});
testServer.on('error', function (error) {
resolve(false);
});
} catch (error) {
resolve(false);
}
}));
case 1:
case "end":
return _context.stop();
}
}, _callee);
}));
function isPortAvailable(_x) {
return _isPortAvailable.apply(this, arguments);
}
return isPortAvailable;
}()
}, {
key: "setupRoutes",
value: function setupRoutes() {
var _this = this;
this.app.get('/callback', function (req, res) {
var _ref = req.query,
code = _ref.code,
state = _ref.state,
error = _ref.error;
if (error) {
var userFriendlyError = _this.getUserFriendlyErrorMessage({
message: error
});
res.send(_this.generateErrorPageHTML(userFriendlyError));
if (_this.authCompleteResolver) {
_this.authCompleteResolver(null);
}
return;
}
if (code) {
_this.exchangeCodeForTokens(code).then(function (tokens) {
res.send("\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Authentication Successful - Ordino CLI</title>\n <style>\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n \n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n }\n \n .container {\n background: white;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n padding: 48px;\n text-align: center;\n max-width: 500px;\n width: 100%;\n animation: slideUp 0.5s ease-out;\n }\n \n @keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n \n h1 {\n color: #1a202c;\n font-size: 28px;\n font-weight: 700;\n margin-bottom: 16px;\n }\n \n .message {\n color: #4a5568;\n font-size: 16px;\n line-height: 1.6;\n margin-bottom: 24px;\n }\n \n .cli-message {\n background: #f7fafc;\n border-left: 4px solid #667eea;\n padding: 16px;\n border-radius: 8px;\n margin-bottom: 24px;\n }\n \n .cli-message p {\n color: #2d3748;\n font-size: 15px;\n font-weight: 500;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Authentication Successful!</h1>\n <div class=\"message\">\n Your authentication has been completed successfully.\n </div>\n <div class=\"cli-message\">\n <p>\uD83C\uDF89 You're all set!</p>\n <p style=\"margin-top: 8px; font-weight: 400; font-size: 14px;\">\n You can now close this window and return to the CLI\n </p>\n </div>\n </div>\n <script>\n setTimeout(() => {\n window.close();\n }, 3000);\n </script>\n </body>\n </html>\n ");
if (_this.authCompleteResolver) {
_this.authCompleteResolver(tokens);
}
})["catch"](function (error) {
var userFriendlyError = _this.getUserFriendlyErrorMessage(error);
res.send(_this.generateErrorPageHTML(userFriendlyError));
if (_this.authCompleteResolver) {
_this.authCompleteResolver(null);
}
});
} else {
res.send("\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Authentication Failed - Ordino CLI</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n }\n .container {\n background: white;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n padding: 48px;\n text-align: center;\n max-width: 500px;\n width: 100%;\n animation: slideUp 0.5s ease-out;\n }\n @keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n h1 { color: #1a202c; font-size: 28px; font-weight: 700; margin-bottom: 16px; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Authentication Failed</h1>\n <p style=\"color: #4a5568; margin: 16px 0;\">No authorization code was received from the authentication provider.</p>\n <p style=\"color: #718096; font-size: 14px;\">\n Please try signing in again from the CLI\n </p>\n </div>\n <script>\n setTimeout(() => { window.close(); }, 3000);\n </script>\n </body>\n </html>\n ");
if (_this.authCompleteResolver) {
_this.authCompleteResolver(null);
}
}
});
this.app.get('/health', function (req, res) {
res.json({
status: 'ok',
message: 'Auth server is running'
});
});
}
}, {
key: "exchangeCodeForTokens",
value: function () {
var _exchangeCodeForTokens = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(code) {
var currentEnvironment, cognitoConfig, redirectUri, requestBody, response, errorText, errorData, errorMessage, tokens;
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
currentEnvironment = _serviceFactory.serviceFactory.getEnvironment();
cognitoConfig = (0, _cognito.getCognitoConfig)(currentEnvironment);
if (!(!code || code.length < 10)) {
_context2.next = 5;
break;
}
throw new Error('Invalid authorization code received');
case 5:
redirectUri = this.currentPort ? "http://localhost:".concat(this.currentPort, "/callback") : cognitoConfig.redirectUri;
requestBody = new URLSearchParams({
grant_type: 'authorization_code',
client_id: cognitoConfig.clientId,
code: code,
redirect_uri: redirectUri
});
if (cognitoConfig.clientSecret) {
requestBody.append('client_secret', cognitoConfig.clientSecret);
}
_context2.next = 10;
return fetch(cognitoConfig.tokenEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: requestBody
});
case 10:
response = _context2.sent;
if (response.ok) {
_context2.next = 24;
break;
}
_context2.next = 14;
return response.text();
case 14:
errorText = _context2.sent;
_context2.prev = 15;
errorData = JSON.parse(errorText);
errorMessage = errorData.error || errorText;
throw new Error("Token exchange failed: ".concat(errorMessage));
case 21:
_context2.prev = 21;
_context2.t0 = _context2["catch"](15);
throw new Error("Token exchange failed: ".concat(response.status, " ").concat(response.statusText, " - ").concat(errorText));
case 24:
_context2.next = 26;
return response.json();
case 26:
tokens = _context2.sent;
return _context2.abrupt("return", tokens);
case 30:
_context2.prev = 30;
_context2.t1 = _context2["catch"](0);
throw _context2.t1;
case 33:
case "end":
return _context2.stop();
}
}, _callee2, this, [[0, 30], [15, 21]]);
}));
function exchangeCodeForTokens(_x2) {
return _exchangeCodeForTokens.apply(this, arguments);
}
return exchangeCodeForTokens;
}()
}, {
key: "startServer",
value: function startServer() {
var _this2 = this;
return new Promise(/*#__PURE__*/function () {
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(resolve, reject) {
var availablePort, port;
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
_context3.prev = 0;
availablePort = null;
port = _this2.portRange.min;
case 3:
if (!(port <= _this2.portRange.max)) {
_context3.next = 12;
break;
}
_context3.next = 6;
return _this2.isPortAvailable(port);
case 6:
if (!_context3.sent) {
_context3.next = 9;
break;
}
availablePort = port;
return _context3.abrupt("break", 12);
case 9:
port++;
_context3.next = 3;
break;
case 12:
if (availablePort) {
_context3.next = 15;
break;
}
reject(new Error("No available ports found in range ".concat(_this2.portRange.min, "-").concat(_this2.portRange.max, ". Please close other applications using these ports.")));
return _context3.abrupt("return");
case 15:
_this2.server = _this2.app.listen(availablePort, 'localhost', function () {
_this2.currentPort = availablePort;
resolve();
});
_this2.server.on('error', function (error) {
reject(error);
});
_context3.next = 22;
break;
case 19:
_context3.prev = 19;
_context3.t0 = _context3["catch"](0);
reject(_context3.t0);
case 22:
case "end":
return _context3.stop();
}
}, _callee3, null, [[0, 19]]);
}));
return function (_x3, _x4) {
return _ref2.apply(this, arguments);
};
}());
}
}, {
key: "stopServer",
value: function stopServer() {
var _this3 = this;
return new Promise(function (resolve) {
if (_this3.server) {
var timeoutId = setTimeout(function () {
_this3.server = null;
_this3.currentPort = null;
resolve();
}, 2000);
_this3.server.close(function () {
clearTimeout(timeoutId);
_this3.server = null;
_this3.currentPort = null;
resolve();
});
} else {
resolve();
}
});
}
}, {
key: "buildAuthUrl",
value: function buildAuthUrl() {
var currentEnvironment = _serviceFactory.serviceFactory.getEnvironment();
var cognitoConfig = (0, _cognito.getCognitoConfig)(currentEnvironment);
var authEndpoint = "https://".concat(cognitoConfig.domain, "/login");
var redirectUri = this.currentPort ? "http://localhost:".concat(this.currentPort, "/callback") : cognitoConfig.redirectUri;
var params = new URLSearchParams({
client_id: cognitoConfig.clientId,
response_type: 'code',
scope: 'email openid phone profile',
redirect_uri: redirectUri,
state: Math.random().toString(36).substring(2, 15)
});
return "".concat(authEndpoint, "?").concat(params.toString());
}
}, {
key: "authenticateWithBrowser",
value: function () {
var _authenticateWithBrowser = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
var _this4 = this;
var authUrl, timeoutPromise, result, userFriendlyError;
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
_context4.prev = 0;
_context4.next = 3;
return this.startServer();
case 3:
this.authCompletePromise = new Promise(function (resolve) {
_this4.authCompleteResolver = resolve;
});
authUrl = this.buildAuthUrl();
(0, _printMessage.printMessage)('🌐 Opening browser for authentication...', "36", false, false);
(0, _printMessage.printMessage)("If the browser doesn't open automatically, please visit: ".concat(authUrl), "33", false, false);
_context4.prev = 7;
_context4.next = 10;
return (0, _open["default"])(authUrl);
case 10:
_context4.next = 15;
break;
case 12:
_context4.prev = 12;
_context4.t0 = _context4["catch"](7);
(0, _printMessage.printMessage)('Failed to open browser automatically. Please copy and paste the URL above into your browser.', "31", false, false);
case 15:
timeoutPromise = new Promise(function (resolve) {
setTimeout(function () {
(0, _printMessage.printMessage)('⏰ Authentication timeout after 5 minutes', "31", false, false);
resolve(null);
}, 5 * 60 * 1000);
});
_context4.next = 18;
return Promise.race([this.authCompletePromise, timeoutPromise]);
case 18:
result = _context4.sent;
return _context4.abrupt("return", result);
case 22:
_context4.prev = 22;
_context4.t1 = _context4["catch"](0);
userFriendlyError = this.getUserFriendlyErrorMessage(_context4.t1);
(0, _printMessage.printMessage)("\u274C Authentication error: ".concat(userFriendlyError), "31", false, false);
return _context4.abrupt("return", null);
case 27:
_context4.prev = 27;
_context4.next = 30;
return this.stopServer();
case 30:
this.authCompletePromise = null;
this.authCompleteResolver = null;
return _context4.finish(27);
case 33:
case "end":
return _context4.stop();
}
}, _callee4, this, [[0, 22, 27, 33], [7, 12]]);
}));
function authenticateWithBrowser() {
return _authenticateWithBrowser.apply(this, arguments);
}
return authenticateWithBrowser;
}()
}, {
key: "checkAuthStatus",
value: function () {
var _checkAuthStatus = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
return _context5.abrupt("return", false);
case 1:
case "end":
return _context5.stop();
}
}, _callee5);
}));
function checkAuthStatus() {
return _checkAuthStatus.apply(this, arguments);
}
return checkAuthStatus;
}()
}, {
key: "isOAuthLogin",
value: function isOAuthLogin(idToken) {
try {
var tokenParts = idToken.split('.');
if (tokenParts.length === 3) {
var payload = JSON.parse(Buffer.from(tokenParts[1], 'base64').toString());
return payload.identities && Array.isArray(payload.identities) && payload.identities.length > 0;
}
return false;
} catch (_unused2) {
return true;
}
}
}, {
key: "getUserInfo",
value: function () {
var _getUserInfo = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6(accessToken) {
var currentEnvironment, cognitoConfig, response;
return _regeneratorRuntime().wrap(function _callee6$(_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
currentEnvironment = _serviceFactory.serviceFactory.getEnvironment();
cognitoConfig = (0, _cognito.getCognitoConfig)(currentEnvironment);
_context6.next = 4;
return fetch("https://".concat(cognitoConfig.domain, "/oauth2/userInfo"), {
headers: {
Authorization: "Bearer ".concat(accessToken)
}
});
case 4:
response = _context6.sent;
if (response.ok) {
_context6.next = 7;
break;
}
throw new Error('Failed to fetch user info');
case 7:
_context6.next = 9;
return response.json();
case 9:
return _context6.abrupt("return", _context6.sent);
case 10:
case "end":
return _context6.stop();
}
}, _callee6);
}));
function getUserInfo(_x5) {
return _getUserInfo.apply(this, arguments);
}
return getUserInfo;
}()
}, {
key: "socialSignIn",
value: function () {
var _socialSignIn = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7(userInfo, idToken) {
var currentEnvironment, portalConfig, socialSignInData, response, errorText, technicalError, userFriendlyError, result;
return _regeneratorRuntime().wrap(function _callee7$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
currentEnvironment = _serviceFactory.serviceFactory.getEnvironment();
portalConfig = (0, _cognito.getPortalConfig)(currentEnvironment);
socialSignInData = {
Email: userInfo.email,
FirstName: userInfo.given_name || userInfo.name || 'User',
LastName: userInfo.family_name || userInfo.given_name || 'User'
};
_context7.next = 5;
return fetch("".concat(portalConfig.baseUrl, "/api/v1/social-signin"), {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': "Bearer ".concat(idToken)
},
body: JSON.stringify(socialSignInData)
});
case 5:
response = _context7.sent;
if (response.ok) {
_context7.next = 13;
break;
}
_context7.next = 9;
return response.text();
case 9:
errorText = _context7.sent;
technicalError = "Social sign-in failed: ".concat(response.status, " ").concat(response.statusText, " - ").concat(errorText);
userFriendlyError = this.getUserFriendlyErrorMessage({
message: technicalError
});
throw new Error(userFriendlyError);
case 13:
_context7.next = 15;
return response.json();
case 15:
result = _context7.sent;
if (!(result.isSuccess && result.extraInfo)) {
_context7.next = 20;
break;
}
return _context7.abrupt("return", typeof result.extraInfo === 'string' ? result.extraInfo : result.extraInfo.idToken);
case 20:
throw new Error(result.message || 'Failed to get backend token');
case 21:
case "end":
return _context7.stop();
}
}, _callee7, this);
}));
function socialSignIn(_x6, _x7) {
return _socialSignIn.apply(this, arguments);
}
return socialSignIn;
}()
}, {
key: "getCliApiKey",
value: function () {
var _getCliApiKey = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8(token) {
var currentEnvironment, portalConfig, controller, timeoutId, response, errorText, result;
return _regeneratorRuntime().wrap(function _callee8$(_context8) {
while (1) switch (_context8.prev = _context8.next) {
case 0:
currentEnvironment = _serviceFactory.serviceFactory.getEnvironment();
portalConfig = (0, _cognito.getPortalConfig)(currentEnvironment);
controller = new AbortController();
timeoutId = setTimeout(function () {
return controller.abort();
}, 10000);
_context8.prev = 4;
_context8.next = 7;
return fetch("".concat(portalConfig.baseUrl, "/api/v1/system-api-key/cli-key"), {
method: 'POST',
headers: {
'Authorization': "Bearer ".concat(token),
'Content-Type': 'application/json'
},
signal: controller.signal
});
case 7:
response = _context8.sent;
clearTimeout(timeoutId);
if (response.ok) {
_context8.next = 14;
break;
}
_context8.next = 12;
return response.text();
case 12:
errorText = _context8.sent;
throw new Error("Failed to generate CLI API key: ".concat(response.status, " ").concat(response.statusText, " - ").concat(errorText));
case 14:
_context8.next = 16;
return response.json();
case 16:
result = _context8.sent;
if (!(result.isSuccess && result.extraInfo)) {
_context8.next = 21;
break;
}
return _context8.abrupt("return", typeof result.extraInfo === 'string' ? result.extraInfo : result.extraInfo.accessToken);
case 21:
throw new Error(result.message || 'Failed to generate CLI API key');
case 22:
_context8.next = 31;
break;
case 24:
_context8.prev = 24;
_context8.t0 = _context8["catch"](4);
clearTimeout(timeoutId);
if (!(_context8.t0 instanceof Error)) {
_context8.next = 30;
break;
}
if (!(_context8.t0.message.includes('ECONNREFUSED') || _context8.t0.message.includes('fetch failed') || _context8.t0.message.includes('aborted'))) {
_context8.next = 30;
break;
}
return _context8.abrupt("return", null);
case 30:
throw _context8.t0;
case 31:
case "end":
return _context8.stop();
}
}, _callee8, null, [[4, 24]]);
}));
function getCliApiKey(_x8) {
return _getCliApiKey.apply(this, arguments);
}
return getCliApiKey;
}()
}, {
key: "authenticate",
value: function () {
var _authenticate = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
var isAuthenticated, tokens, isOAuthLogin, userInfo, backendToken, cliApiKey, _cliApiKey, userFriendlyError;
return _regeneratorRuntime().wrap(function _callee9$(_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
_context9.next = 2;
return this.checkAuthStatus();
case 2:
isAuthenticated = _context9.sent;
if (!isAuthenticated) {
_context9.next = 6;
break;
}
(0, _printMessage.printMessage)('✅ Already authenticated', "32", false, false);
return _context9.abrupt("return", null);
case 6:
_context9.next = 8;
return this.authenticateWithBrowser();
case 8:
tokens = _context9.sent;
if (!tokens) {
_context9.next = 41;
break;
}
(0, _printMessage.printMessage)('✅ Authentication successful!', "32", false, false);
_context9.prev = 11;
isOAuthLogin = this.isOAuthLogin(tokens.id_token);
if (!isOAuthLogin) {
_context9.next = 28;
break;
}
_context9.next = 16;
return this.getUserInfo(tokens.access_token);
case 16:
userInfo = _context9.sent;
if (!userInfo) {
_context9.next = 26;
break;
}
_context9.next = 20;
return this.socialSignIn(userInfo, tokens.id_token);
case 20:
backendToken = _context9.sent;
if (!backendToken) {
_context9.next = 26;
break;
}
_context9.next = 24;
return this.getCliApiKey(backendToken);
case 24:
cliApiKey = _context9.sent;
if (cliApiKey) {
tokens.cliApiKey = cliApiKey;
}
case 26:
_context9.next = 32;
break;
case 28:
_context9.next = 30;
return this.getCliApiKey(tokens.id_token);
case 30:
_cliApiKey = _context9.sent;
if (_cliApiKey) {
tokens.cliApiKey = _cliApiKey;
}
case 32:
_context9.next = 38;
break;
case 34:
_context9.prev = 34;
_context9.t0 = _context9["catch"](11);
userFriendlyError = this.getUserFriendlyErrorMessage(_context9.t0);
(0, _printMessage.printMessage)("\u26A0\uFE0F Warning: ".concat(userFriendlyError), "33", false, false);
case 38:
return _context9.abrupt("return", tokens);
case 41:
(0, _printMessage.printMessage)('❌ Authentication failed or was cancelled', "31", false, false);
return _context9.abrupt("return", null);
case 43:
case "end":
return _context9.stop();
}
}, _callee9, this, [[11, 34]]);
}));
function authenticate() {
return _authenticate.apply(this, arguments);
}
return authenticate;
}()
}]);
}();
var cognitoAuthService = exports.cognitoAuthService = new CognitoAuthService();