UNPKG

@mesh-tech/mesh-cli

Version:

CLI for Mesh platform development utilities

60 lines (59 loc) 2.13 kB
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); }); }