86 lines
2.2 KiB
TypeScript
86 lines
2.2 KiB
TypeScript
import {
|
||
BACKGROUND_AUTH_REQUEST_OPTIONS,
|
||
type ApiAuthImpact,
|
||
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;
|
||
authImpact?: ApiAuthImpact;
|
||
notifyAuthStateChange?: boolean;
|
||
clearAuthOnUnauthorized?: boolean;
|
||
};
|
||
|
||
export const RUNTIME_BACKGROUND_AUTH_OPTIONS =
|
||
BACKGROUND_AUTH_REQUEST_OPTIONS satisfies RuntimeRequestOptions;
|
||
|
||
/**
|
||
* 统一封装 RPG 运行时域的请求重试与鉴权透传,避免各 client 重复维护同一套规则。
|
||
*/
|
||
export function requestRpgRuntimeJson<T>(
|
||
path: string,
|
||
init: RequestInit,
|
||
fallbackMessage: string,
|
||
options: RuntimeRequestOptions = {},
|
||
) {
|
||
const method = (init.method ?? 'GET').toUpperCase();
|
||
// 中文注释:运行时读请求和写请求的重试策略分开配置;
|
||
// GET 更保守,写请求允许 unsafe method retry,用来兜底瞬时网络抖动。
|
||
const retry =
|
||
options.retry ??
|
||
(method === 'GET' ? RUNTIME_READ_RETRY : RUNTIME_WRITE_RETRY);
|
||
const normalizedPath = path.startsWith('/profile/')
|
||
? `/api${path}`
|
||
: `${RUNTIME_API_BASE}${path}`;
|
||
|
||
return requestJson<T>(
|
||
normalizedPath,
|
||
{
|
||
...init,
|
||
signal: options.signal,
|
||
},
|
||
fallbackMessage,
|
||
{
|
||
retry,
|
||
skipAuth: options.skipAuth,
|
||
skipRefresh: options.skipRefresh,
|
||
authImpact: options.authImpact,
|
||
notifyAuthStateChange: options.notifyAuthStateChange,
|
||
clearAuthOnUnauthorized: options.clearAuthOnUnauthorized,
|
||
},
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 公共世界广场等匿名接口统一走公开请求入口,避免误附带鉴权状态。
|
||
*/
|
||
export function requestPublicRpgRuntimeJson<T>(
|
||
path: string,
|
||
init: RequestInit,
|
||
fallbackMessage: string,
|
||
options: RuntimeRequestOptions = {},
|
||
) {
|
||
return requestRpgRuntimeJson<T>(path, init, fallbackMessage, {
|
||
...options,
|
||
skipAuth: true,
|
||
skipRefresh: true,
|
||
});
|
||
}
|