mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-02-18 02:30:51 +08:00
113 lines
3.3 KiB
TypeScript
113 lines
3.3 KiB
TypeScript
/**
|
|
* Resolver functions for extracting data from auth files.
|
|
*/
|
|
|
|
import type { AuthFileItem } from '@/types';
|
|
import {
|
|
normalizeStringValue,
|
|
normalizePlanType,
|
|
parseIdTokenPayload
|
|
} from './parsers';
|
|
|
|
export function extractCodexChatgptAccountId(value: unknown): string | null {
|
|
const payload = parseIdTokenPayload(value);
|
|
if (!payload) return null;
|
|
return normalizeStringValue(payload.chatgpt_account_id ?? payload.chatgptAccountId);
|
|
}
|
|
|
|
export function resolveCodexChatgptAccountId(file: AuthFileItem): string | null {
|
|
const metadata =
|
|
file && typeof file.metadata === 'object' && file.metadata !== null
|
|
? (file.metadata as Record<string, unknown>)
|
|
: null;
|
|
const attributes =
|
|
file && typeof file.attributes === 'object' && file.attributes !== null
|
|
? (file.attributes as Record<string, unknown>)
|
|
: null;
|
|
|
|
const candidates = [file.id_token, metadata?.id_token, attributes?.id_token];
|
|
|
|
for (const candidate of candidates) {
|
|
const id = extractCodexChatgptAccountId(candidate);
|
|
if (id) return id;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
export function resolveCodexPlanType(file: AuthFileItem): string | null {
|
|
const metadata =
|
|
file && typeof file.metadata === 'object' && file.metadata !== null
|
|
? (file.metadata as Record<string, unknown>)
|
|
: null;
|
|
const attributes =
|
|
file && typeof file.attributes === 'object' && file.attributes !== null
|
|
? (file.attributes as Record<string, unknown>)
|
|
: null;
|
|
const idToken =
|
|
file && typeof file.id_token === 'object' && file.id_token !== null
|
|
? (file.id_token as Record<string, unknown>)
|
|
: null;
|
|
const metadataIdToken =
|
|
metadata && typeof metadata.id_token === 'object' && metadata.id_token !== null
|
|
? (metadata.id_token as Record<string, unknown>)
|
|
: null;
|
|
const candidates = [
|
|
file.plan_type,
|
|
file.planType,
|
|
file['plan_type'],
|
|
file['planType'],
|
|
file.id_token,
|
|
idToken?.plan_type,
|
|
idToken?.planType,
|
|
metadata?.plan_type,
|
|
metadata?.planType,
|
|
metadata?.id_token,
|
|
metadataIdToken?.plan_type,
|
|
metadataIdToken?.planType,
|
|
attributes?.plan_type,
|
|
attributes?.planType,
|
|
attributes?.id_token
|
|
];
|
|
|
|
for (const candidate of candidates) {
|
|
const planType = normalizePlanType(candidate);
|
|
if (planType) return planType;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
export function extractGeminiCliProjectId(value: unknown): string | null {
|
|
if (typeof value !== 'string') return null;
|
|
const matches = Array.from(value.matchAll(/\(([^()]+)\)/g));
|
|
if (matches.length === 0) return null;
|
|
const candidate = matches[matches.length - 1]?.[1]?.trim();
|
|
return candidate ? candidate : null;
|
|
}
|
|
|
|
export function resolveGeminiCliProjectId(file: AuthFileItem): string | null {
|
|
const metadata =
|
|
file && typeof file.metadata === 'object' && file.metadata !== null
|
|
? (file.metadata as Record<string, unknown>)
|
|
: null;
|
|
const attributes =
|
|
file && typeof file.attributes === 'object' && file.attributes !== null
|
|
? (file.attributes as Record<string, unknown>)
|
|
: null;
|
|
|
|
const candidates = [
|
|
file.account,
|
|
file['account'],
|
|
metadata?.account,
|
|
attributes?.account
|
|
];
|
|
|
|
for (const candidate of candidates) {
|
|
const projectId = extractGeminiCliProjectId(candidate);
|
|
if (projectId) return projectId;
|
|
}
|
|
|
|
return null;
|
|
}
|