genezio
Version:
Command line utility to interact with Genezio infrastructure.
83 lines (82 loc) • 3.86 kB
JavaScript
import jsonBody from "body/json.js";
import { log } from "../utils/logging.js";
import { DASHBOARD_URL } from "../constants.js";
import { saveAuthToken } from "../utils/accounts.js";
import http from "http";
import open from "open";
import { asciiCapybara } from "../utils/strings.js";
import { GenezioTelemetry, TelemetryEventTypes } from "../telemetry/telemetry.js";
import { isCI } from "../utils/process.js";
import { UserError } from "../errors.js";
export async function loginCommand(accessToken, logSuccessMessage = true) {
if (!isCI() && logSuccessMessage)
log.info(asciiCapybara);
await GenezioTelemetry.sendEvent({
eventType: TelemetryEventTypes.GENEZIO_LOGIN,
});
const promiseHttpServer = new Promise((resolve, reject) => {
if (accessToken !== "") {
saveAuthToken(accessToken);
if (logSuccessMessage) {
loginSuccessMsg();
}
}
else {
// If we are in a CI environment, we don't open the browser because it will hang indefinitely
if (isCI()) {
reject(new UserError("CI environment detected. Authentication must be done using `genezio login <token> or set a valid GENEZIO_TOKEN=<token>"));
return;
}
const server = http.createServer((req, res) => {
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Headers", "Content-Type");
res.setHeader("Access-Control-Allow-Methods", "POST");
res.setHeader("Access-Control-Allow-Credentials", "true");
if (req.method === "OPTIONS") {
res.end();
return;
}
jsonBody(req, res, () => {
const params = new URLSearchParams(req.url);
const token = params.get("/?token");
saveAuthToken(token).then(() => {
if (logSuccessMessage) {
loginSuccessMsg();
}
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Headers", "Content-Type");
res.setHeader("Access-Control-Allow-Methods", "POST");
res.setHeader("Access-Control-Allow-Credentials", "true");
res.writeHead(301, {
Location: `${DASHBOARD_URL}/cli/login/success`,
});
res.end();
// We close the server and all connections after sending the update to the browser
server.closeAllConnections();
server.close();
clearTimeout(timeout);
resolve(true);
});
});
});
// Set the server to timeout after 5 minutes
const TIMEOUT_DURATION = 5 * 60 * 1000; // 5 minutes in milliseconds
const timeout = setTimeout(() => {
server.close(() => {
log.info("Server closed due to timeout.");
});
reject(new UserError("Authentication timed out after 5 minutes."));
}, TIMEOUT_DURATION);
server.listen(0, "localhost", () => {
log.info("Redirecting to browser to complete authentication...");
const address = server.address();
const browserUrl = `${DASHBOARD_URL}/cli/login?redirect_url=http://localhost:${address.port}/`;
open(browserUrl);
});
}
});
await promiseHttpServer;
}
function loginSuccessMsg() {
log.info(`Welcome! You can now start using genezio.`);
}