Revert EMULATOR_MODE to rcon default, restore RCON config
CI / check (push) Successful in 28s
CI / release (push) Skipped
CI / deploy (push) Successful in 54s

This commit is contained in:
openhands committed 2026-08-22 22:32:24 +02:00
1 parent f24426c1fa
commit adb56eb80b
4 files changed
+30 -15

No files matched your search

+5 -2
View File
@@ -46,8 +46,11 @@ DB_BACKUP_KEEP=7
# Minutes between repeat health-fail alerts from jobs-worker (default 15). # Minutes between repeat health-fail alerts from jobs-worker (default 15).
HEALTH_ALERT_COOLDOWN_MIN=15 HEALTH_ALERT_COOLDOWN_MIN=15
# --- EMULATOR API --- # --- RCON (Low Latency Loop) ---
EMULATOR_API_URL=http://127.0.0.1:3001 RCON_HOST=127.0.0.1
RCON_PORT=3003
EMU_PORT=3004
RCON_TIMEOUT_MS=2000
# --- EMAIL & NOTIFICATIONS --- # --- EMAIL & NOTIFICATIONS ---
SMTP_HOST= SMTP_HOST=
+9 -3
View File
@@ -40,11 +40,17 @@ const schema = z
SMTP_USER: z.string().optional(), SMTP_USER: z.string().optional(),
SMTP_PASSWORD: z.string().optional(), SMTP_PASSWORD: z.string().optional(),
SMTP_FROM: z.string().optional(), SMTP_FROM: z.string().optional(),
// Emulator transport selection. "api" uses an HTTP endpoint that accepts the same // RCON link to the Arcturus emulator (raw-JSON TCP protocol).
RCON_HOST: z.string().default("127.0.0.1"),
RCON_PORT: z.coerce.number().int().positive().default(3001),
RCON_TIMEOUT_MS: z.coerce.number().int().positive().default(10_000),
RCON_MAX_RETRIES: z.coerce.number().int().positive().default(3),
// Emulator transport selection. "rcon" uses the raw-JSON TCP protocol
// above; "api" uses an HTTP endpoint that accepts the same
// `{"key":...,"data":...}` payload (for emulators without RCON). // `{"key":...,"data":...}` payload (for emulators without RCON).
EMULATOR_MODE: z.enum(["rcon", "api"]).default("api"), EMULATOR_MODE: z.enum(["rcon", "api"]).default("rcon"),
// HTTP endpoint used when EMULATOR_MODE=api. Required in that mode. // HTTP endpoint used when EMULATOR_MODE=api. Required in that mode.
EMULATOR_API_URL: z.string().url(), EMULATOR_API_URL: z.string().url().optional(),
// Optional bearer/key auth for the API transport. When set, it is sent // Optional bearer/key auth for the API transport. When set, it is sent
// as `${EMULATOR_API_KEY_HEADER}: ${EMULATOR_API_KEY}` (default header // as `${EMULATOR_API_KEY_HEADER}: ${EMULATOR_API_KEY}` (default header
// "Authorization"). // "Authorization").
+3 -1
View File
@@ -223,8 +223,10 @@ export function emulatorOffline(detail?: string): Promise<SendAlertResult> {
severity: "critical", severity: "critical",
message: detail message: detail
? `Emulator appears offline: ${detail}` ? `Emulator appears offline: ${detail}`
: "Emulator appears offline — emulator API connection could not be established.", : "Emulator appears offline — RCON connection could not be established.",
context: { context: {
rconHost: env.RCON_HOST,
rconPort: env.RCON_PORT,
...(detail ? { detail } : {}), ...(detail ? { detail } : {}),
}, },
}); });
+13 -9
View File
@@ -225,20 +225,24 @@ export function httpTransport(opts: {
* misconfiguration surfaces immediately instead of on first command. * misconfiguration surfaces immediately instead of on first command.
*/ */
export function createEmulatorTransport(): RconTransport { export function createEmulatorTransport(): RconTransport {
const mode = env.EMULATOR_MODE ?? "api"; if (env.EMULATOR_MODE === "api") {
if (mode === "api") { if (!env.EMULATOR_API_URL) {
throw new Error("EMULATOR_MODE=api requires EMULATOR_API_URL to be set");
}
return httpTransport({ return httpTransport({
url: env.EMULATOR_API_URL ?? "http://127.0.0.1:3001", url: env.EMULATOR_API_URL,
timeoutMs: 10_000, timeoutMs: env.RCON_TIMEOUT_MS,
apiKey: env.EMULATOR_API_KEY, apiKey: env.EMULATOR_API_KEY,
apiKeyHeader: env.EMULATOR_API_KEY_HEADER, apiKeyHeader: env.EMULATOR_API_KEY_HEADER,
maxRetries: 3, maxRetries: env.RCON_MAX_RETRIES,
}); });
} }
// API mode only; RCON transport removed. return tcpTransport({
throw new Error( host: env.RCON_HOST,
"EMULATOR_MODE=rcon is no longer supported; use EMULATOR_MODE=api", port: env.RCON_PORT,
); timeoutMs: env.RCON_TIMEOUT_MS,
maxRetries: env.RCON_MAX_RETRIES,
});
} }
const globalForRcon = globalThis as unknown as { rcon?: RconClient }; const globalForRcon = globalThis as unknown as { rcon?: RconClient };