Build & Deploy / build-and-push (backend) (push) Failing after 35s
Build & Deploy / build-and-push (discord-gateway) (push) Failing after 25s
Build & Deploy / build-and-push (proxy) (push) Failing after 25s
- Remove pnpm workspace, moon repo, and all monorepo tooling - Delete packages/shared/, embed shared code directly into each service - Copy packages/shared/src/* -> services/backend/src/shared/ and services/discord-gateway/src/shared/ - Replace all @bete/shared imports with @/shared/ path alias - Remove @bete/shared workspace dependency from both services - Update root package.json scripts from --filter to --prefix - Rewrite Dockerfiles to build each service standalone - Clean up biome.json, .gitignore, remove root drizzle.config.ts
26 lines
918 B
TypeScript
26 lines
918 B
TypeScript
import type { CommandReply } from "./index.js";
|
|
import { createChildLogger } from "./logger/index.js";
|
|
|
|
export { createChildLogger };
|
|
|
|
/**
|
|
* Attempt a Redis command first; if it fails or times out, fall back.
|
|
*
|
|
* @param commandFn - Function that issues the publishCommand and returns the reply.
|
|
* @param fallbackFn - Async fallback, typically reads from Redis status key.
|
|
* @param commandLabel - Label used for logging (e.g. "voice:connect").
|
|
*/
|
|
export async function tryCommandThenFallback<T>(
|
|
commandFn: () => Promise<CommandReply<T> | null>,
|
|
fallbackFn: () => Promise<T>,
|
|
commandLabel: string,
|
|
): Promise<T> {
|
|
const logger = createChildLogger(`command-helper:${commandLabel}`);
|
|
const reply = await commandFn();
|
|
if (reply?.success && reply.data !== undefined && reply.data !== null) {
|
|
return reply.data;
|
|
}
|
|
logger.warn("discord-gateway unreachable, falling back");
|
|
return fallbackFn();
|
|
}
|