import { type ApiRetryOptions, requestJson } from '../apiClient'; const RUNTIME_API_BASE = '/api/runtime'; const RUNTIME_READ_RETRY: ApiRetryOptions = { maxRetries: 1, baseDelayMs: 180, maxDelayMs: 480, }; const RUNTIME_WRITE_RETRY: ApiRetryOptions = { maxRetries: 1, baseDelayMs: 240, maxDelayMs: 640, retryUnsafeMethods: true, }; export type RuntimeRequestOptions = { signal?: AbortSignal; retry?: ApiRetryOptions; skipAuth?: boolean; skipRefresh?: boolean; }; /** * 统一封装 RPG 运行时域的请求重试与鉴权透传,避免各 client 重复维护同一套规则。 */ export function requestRpgRuntimeJson( path: string, init: RequestInit, fallbackMessage: string, options: RuntimeRequestOptions = {}, ) { const method = (init.method ?? 'GET').toUpperCase(); const retry = options.retry ?? (method === 'GET' ? RUNTIME_READ_RETRY : RUNTIME_WRITE_RETRY); return requestJson( `${RUNTIME_API_BASE}${path}`, { ...init, signal: options.signal, }, fallbackMessage, { retry, skipAuth: options.skipAuth, skipRefresh: options.skipRefresh, }, ); } /** * 公共世界广场等匿名接口统一走公开请求入口,避免误附带鉴权状态。 */ export function requestPublicRpgRuntimeJson( path: string, init: RequestInit, fallbackMessage: string, options: RuntimeRequestOptions = {}, ) { return requestRpgRuntimeJson(path, init, fallbackMessage, { ...options, skipAuth: true, skipRefresh: true, }); }