@mesh-tech/mesh-cli
Version:
CLI for Mesh platform development utilities
60 lines (59 loc) • 2.13 kB
JavaScript
import { spawn } from "child_process";
import { detectContext, getPlatformBastionInfo, logInfo, logError, } from "../../utils/index.js";
export async function connectCommand(options) {
let tenant;
let platformEnv;
if (options.tenant && options.env) {
tenant = options.tenant;
platformEnv = options.env;
logInfo(`Explicit mode: Tenant=${tenant}, Env=${platformEnv}`);
}
else if (options.tenant || options.env) {
logError("Both --tenant and --env are required");
logInfo("Usage: mesh db connect --tenant mesh --env dev-temporal");
process.exit(1);
}
else {
const ctx = detectContext();
tenant = ctx.tenant;
platformEnv = ctx.platformEnv;
logInfo(`Auto-detected: Tenant=${tenant}, Env=${platformEnv}`);
}
const bastion = await getPlatformBastionInfo(tenant, platformEnv);
const rdsService = bastion.services.rds;
if (!rdsService) {
logError("RDS service not available in platform bastion");
process.exit(1);
}
console.log("");
logInfo(`Tunnel will forward localhost:5432 → ${rdsService.host}:${rdsService.port}`);
console.log("");
logInfo("In another terminal, connect with:");
console.log(" psql -h localhost -p 5432 -U <username> -d <database>");
console.log("");
logInfo("Or use: mesh db credentials --tenant ... --env ... --app ...");
console.log("");
logInfo("Press Ctrl+C to stop the tunnel");
console.log("");
const tunnel = spawn("aws", [
"ssm",
"start-session",
"--target",
bastion.instanceId,
"--document-name",
"AWS-StartPortForwardingSessionToRemoteHost",
"--parameters",
JSON.stringify({
host: [rdsService.host],
portNumber: [String(rdsService.port)],
localPortNumber: ["5432"],
}),
], { stdio: "inherit" });
tunnel.on("error", (err) => {
console.error("Failed to start tunnel:", err.message);
process.exit(1);
});
tunnel.on("exit", (code) => {
process.exit(code ?? 0);
});
}