import { REDEEM_WEAKNET_FAIL_THRESHOLD } from '@dukang/shared-types'; import type { RedeemErrorClass, RedeemFailureReportResult } from '@dukang/shared-types'; import { request } from './api'; export function isNetworkError(e: unknown): boolean { const err = e as Error & { status?: number }; const status = err.status; const message = (err.message ?? String(e)).toLowerCase(); if (status != null && status >= 500) return true; if (status === 0 || status === 408 || status === 429 || status === 502 || status === 503 || status === 504) { return true; } if (/failed to fetch|network|timeout|timed out|abort|offline|连接|网络|超时/.test(message)) { return true; } // 无 status 的 fetch 失败通常是网络类 if (status == null && e instanceof TypeError) return true; return false; } export async function reportRedeemFailure( token: string, step: 'preview' | 'confirm', error: unknown, ): Promise { const err = error as Error & { status?: number }; const errorClass: RedeemErrorClass = isNetworkError(error) ? 'NETWORK' : 'BUSINESS'; try { return await request('SHOP_H5', '/shop/redeem/failures', { method: 'POST', body: JSON.stringify({ token, errorClass, message: err.message?.slice(0, 200), step, }), }); } catch { if (errorClass === 'NETWORK') { return { failCount: REDEEM_WEAKNET_FAIL_THRESHOLD, thresholdReached: true, threshold: REDEEM_WEAKNET_FAIL_THRESHOLD, }; } return null; } } export { REDEEM_WEAKNET_FAIL_THRESHOLD };