turboci-admin/src/functions/ttyd/grab-ttyd-service-info.ts
2026-03-14 07:19:46 +01:00

90 lines
2.4 KiB
TypeScript

import {
NSQLITE_TURBOCI_ADMIN_USERS_PORTS,
NSQLiteTables,
} from "@/src/db/types";
import { PrivateServerTtydParadigms, TtydInfoObject, User } from "@/src/types";
import {
NormalizedServerObject,
ParsedDeploymentServiceConfig,
} from "@/src/types/turboci";
import grabDirNames from "@/src/utils/grab-dir-names";
import getNextAvailablePort from "@/src/utils/grab-next-available-port";
import grabSSHPrefix from "@/src/utils/grab-ssh-prefix";
import grabTtydCmd from "@/src/utils/grab-ttyd-cmd";
import grabConnectedWebsocketUserdata from "@/src/websocket/(utils)/grab-connected-websocket-user-data";
import BunSQLite from "@moduletrace/bun-sqlite";
import { exec } from "child_process";
const { TURBOCI_SSH_KEY_FILE } = grabDirNames();
type Params = {
user: User;
service?: Omit<ParsedDeploymentServiceConfig, "servers">;
server?: NormalizedServerObject;
paradigm: (typeof PrivateServerTtydParadigms)[number]["name"];
cmd?: string;
};
export default async function grabTtydServerInfo({
server,
service,
user,
paradigm,
cmd: passed_log_cmd,
}: Params): Promise<TtydInfoObject> {
const first_log = service?.logs?.[0];
const final_first_log =
typeof first_log == "string" ? first_log : first_log?.cmd;
const final_log = passed_log_cmd || final_first_log;
if (paradigm == "logs" && !final_log) {
throw new Error(
`Service \`${service?.service_name}\` Doesn't have logs.`,
);
}
const available_port = await getNextAvailablePort();
let url = `/ttyd/${available_port}`;
let cmd = ``;
cmd += ` ${grabSSHPrefix()}`;
// if (paradigm == "logs") {
// } else {
// cmd += ` ssh -i ${TURBOCI_SSH_KEY_FILE}`;
// }
cmd += ` root@${server?.private_ip}`;
if (paradigm == "logs" && final_log) {
cmd += ` ${final_log}`;
}
const ttyd_cmd = grabTtydCmd({
cmd,
port: available_port,
});
const ttyd_exec = exec(ttyd_cmd.cmd);
await Bun.sleep(2000);
const connected_user_data = grabConnectedWebsocketUserdata({ user });
await BunSQLite.insert<
NSQLITE_TURBOCI_ADMIN_USERS_PORTS,
(typeof NSQLiteTables)[number]
>({
data: [{ user_id: user.id, port: available_port }],
table: "users_ports",
});
connected_user_data.child_processes.push(ttyd_exec);
connected_user_data.ports.push(available_port);
return { port: available_port, url };
}