mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-31 12:22:14 +03:00
Adds ARENA_ELO_SYNC_ENABLED to the Dashboard Feature Flags registry (DB-overridable), routes Arena ELO startup/status checks through the shared feature-flag resolver while preserving the existing env fallback, and refreshes env docs (adds the missing STREAM_READINESS_TIMEOUT_MS example) so env/doc sync stays green. Integrated into release/v3.8.25. Co-authored-by: R.D. <rogerproself@gmail.com>
82 lines
2.5 KiB
TypeScript
82 lines
2.5 KiB
TypeScript
import { getFeatureFlagOverride } from "@/lib/db/featureFlags";
|
|
import {
|
|
FEATURE_FLAG_DEFINITIONS,
|
|
type FeatureFlagDefinition,
|
|
} from "@/shared/constants/featureFlagDefinitions";
|
|
|
|
/**
|
|
* Resolve the effective value of a feature flag.
|
|
* Priority: DB override > process.env > definition.defaultValue
|
|
*/
|
|
export function resolveFeatureFlag(key: string): string {
|
|
const dbOverride = getFeatureFlagOverride(key);
|
|
if (dbOverride !== undefined) return dbOverride;
|
|
|
|
const envValue = process.env[key];
|
|
if (envValue !== undefined && envValue !== "") return envValue;
|
|
|
|
const definition = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === key);
|
|
return definition?.defaultValue ?? "false";
|
|
}
|
|
|
|
/**
|
|
* Check if a boolean feature flag is enabled.
|
|
* Treats "true", "1", "yes" as enabled.
|
|
*/
|
|
export function isFeatureFlagEnabled(key: string): boolean {
|
|
const value = resolveFeatureFlag(key);
|
|
return value === "true" || value === "1" || value === "yes";
|
|
}
|
|
|
|
/**
|
|
* Resolve all feature flags with their effective values and sources.
|
|
*/
|
|
export function resolveAllFeatureFlags(): Array<{
|
|
key: string;
|
|
effectiveValue: string;
|
|
source: "db" | "env" | "default";
|
|
definition: FeatureFlagDefinition;
|
|
}> {
|
|
return FEATURE_FLAG_DEFINITIONS.map((definition) => {
|
|
const dbOverride = getFeatureFlagOverride(definition.key);
|
|
if (dbOverride !== undefined) {
|
|
return { key: definition.key, effectiveValue: dbOverride, source: "db", definition };
|
|
}
|
|
const envValue = process.env[definition.key];
|
|
if (envValue !== undefined && envValue !== "") {
|
|
return { key: definition.key, effectiveValue: envValue, source: "env", definition };
|
|
}
|
|
return {
|
|
key: definition.key,
|
|
effectiveValue: definition.defaultValue,
|
|
source: "default",
|
|
definition,
|
|
};
|
|
});
|
|
}
|
|
|
|
// Backward-compatible wrappers
|
|
export function isRequireApiKeyEnabled(): boolean {
|
|
try {
|
|
return isFeatureFlagEnabled("REQUIRE_API_KEY");
|
|
} catch (error) {
|
|
console.error(
|
|
"[featureFlags] Failed to resolve REQUIRE_API_KEY, defaulting to required:",
|
|
error instanceof Error ? error.message : error
|
|
);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
export function isCcCompatibleProviderEnabled(): boolean {
|
|
return isFeatureFlagEnabled("ENABLE_CC_COMPATIBLE_PROVIDER");
|
|
}
|
|
|
|
export function isModelCatalogNamesEnabled(): boolean {
|
|
return isFeatureFlagEnabled("MODEL_CATALOG_INCLUDE_NAMES");
|
|
}
|
|
|
|
export function isArenaEloSyncEnabled(): boolean {
|
|
return isFeatureFlagEnabled("ARENA_ELO_SYNC_ENABLED");
|
|
}
|