67 lines
1.5 KiB
TypeScript
67 lines
1.5 KiB
TypeScript
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<T>(
|
|
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<T>(
|
|
`${RUNTIME_API_BASE}${path}`,
|
|
{
|
|
...init,
|
|
signal: options.signal,
|
|
},
|
|
fallbackMessage,
|
|
{
|
|
retry,
|
|
skipAuth: options.skipAuth,
|
|
skipRefresh: options.skipRefresh,
|
|
},
|
|
);
|
|
}
|
|
|
|
/**
|
|
* 公共世界广场等匿名接口统一走公开请求入口,避免误附带鉴权状态。
|
|
*/
|
|
export function requestPublicRpgRuntimeJson<T>(
|
|
path: string,
|
|
init: RequestInit,
|
|
fallbackMessage: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
return requestRpgRuntimeJson<T>(path, init, fallbackMessage, {
|
|
...options,
|
|
skipAuth: true,
|
|
skipRefresh: true,
|
|
});
|
|
}
|