import { spawn } from "node:child_process"; import fs from "node:fs"; const envFile = ".env"; const localEnv = fs.existsSync(envFile) ? readEnvFile(envFile) : {}; const host = localEnv.DB_HOST || "127.0.0.1"; const port = localEnv.DB_PORT || "3306"; const user = localEnv.DB_USER || "root"; const password = localEnv.DB_PASSWORD || ""; const catalogDatabase = localEnv.DB_NAME || "9bplus"; const scrapeDatabase = localEnv.SCRAPE_DB_NAME || "catalog_scrape"; const dbgateEnv = { ...process.env, CONNECTIONS: "local9bplus,localscrape", ENGINE_local9bplus: "mariadb@dbgate-plugin-mysql", SERVER_local9bplus: host, PORT_local9bplus: port, USER_local9bplus: user, PASSWORD_local9bplus: password, DATABASE_local9bplus: catalogDatabase, LABEL_local9bplus: "Local 9bplus DB", READONLY_local9bplus: "1", ENGINE_localscrape: "mariadb@dbgate-plugin-mysql", SERVER_localscrape: host, PORT_localscrape: port, USER_localscrape: user, PASSWORD_localscrape: password, DATABASE_localscrape: scrapeDatabase, LABEL_localscrape: "Local scrape DB", READONLY_localscrape: "0", }; const child = spawn("dbgate-serve", { stdio: "inherit", shell: true, env: dbgateEnv, }); child.on("exit", (code, signal) => { if (signal) { process.kill(process.pid, signal); return; } process.exit(code ?? 0); }); function readEnvFile(filePath: string): Record { return Object.fromEntries( fs.readFileSync(filePath, "utf8") .split(/\r?\n/) .map((line) => line.trim()) .filter((line) => line && !line.startsWith("#") && line.includes("=")) .map((line) => { const separator = line.indexOf("="); return [line.slice(0, separator).trim(), line.slice(separator + 1).trim()]; }), ); }