refactor: consolidate single-source routing and protocol helpers

This commit is contained in:
Cita
2026-03-22 21:27:09 +08:00
parent 96e7614835
commit 9290e51ecc
64 changed files with 3571 additions and 2681 deletions
@@ -0,0 +1,30 @@
import { describe, expect, it } from 'vitest';
import {
isTruthyFlag,
parsePositiveInt,
resolveAccountCredentialMode,
} from './accountConnection.js';
describe('accountConnection helpers', () => {
it('resolves account credential mode from explicit mode, capabilities, and token presence', () => {
expect(resolveAccountCredentialMode({ credentialMode: 'apikey' })).toBe('apikey');
expect(resolveAccountCredentialMode({ capabilities: { proxyOnly: true } })).toBe('apikey');
expect(resolveAccountCredentialMode({ accessToken: ' session-token ' })).toBe('session');
expect(resolveAccountCredentialMode({})).toBe('apikey');
});
it('parses positive integers from query values', () => {
expect(parsePositiveInt('42')).toBe(42);
expect(parsePositiveInt(' 0 ')).toBe(0);
expect(parsePositiveInt('abc')).toBe(0);
expect(parsePositiveInt(null)).toBe(0);
});
it('treats common truthy query flags as enabled', () => {
expect(isTruthyFlag('1')).toBe(true);
expect(isTruthyFlag(' TRUE ')).toBe(true);
expect(isTruthyFlag('yes')).toBe(true);
expect(isTruthyFlag('no')).toBe(false);
expect(isTruthyFlag(null)).toBe(false);
});
});
@@ -0,0 +1,23 @@
export function resolveAccountCredentialMode(account: any): 'session' | 'apikey' {
const rawMode = String(account?.credentialMode || '').trim().toLowerCase();
if (rawMode === 'apikey') return 'apikey';
if (rawMode === 'session') return 'session';
if (typeof account?.capabilities?.proxyOnly === 'boolean') {
return account.capabilities.proxyOnly ? 'apikey' : 'session';
}
return typeof account?.accessToken === 'string' && account.accessToken.trim()
? 'session'
: 'apikey';
}
export function parsePositiveInt(input: string | null): number {
const value = Number.parseInt(String(input || '').trim(), 10);
if (!Number.isFinite(value) || value <= 0) return 0;
return value;
}
export function isTruthyFlag(input: string | null): boolean {
if (!input) return false;
const normalized = input.trim().toLowerCase();
return normalized === '1' || normalized === 'true' || normalized === 'yes';
}
+3 -1
View File
@@ -1,3 +1,5 @@
import { normalizeTokenRouteMode } from '../../../shared/tokenRouteContract.js';
export type RouteListVisibilityItem = {
id: number;
modelPattern: string;
@@ -8,7 +10,7 @@ export type RouteListVisibilityItem = {
};
function normalizeRouteMode(routeMode: string | null | undefined): 'pattern' | 'explicit_group' {
return routeMode === 'explicit_group' ? 'explicit_group' : 'pattern';
return normalizeTokenRouteMode(routeMode);
}
function isExplicitGroupRoute(route: Pick<RouteListVisibilityItem, 'routeMode'>): boolean {