import { FetchResponse, DownLoadResponse, UpLoadResponse, RequestFrom } from './types'; import { track } from '@/native/report'; type NetworkResponse = FetchResponse | DownLoadResponse | UpLoadResponse; interface ReportNetworkOptions { state: 'success' | 'fail'; params: Record; response: NetworkResponse; startTime: number; endTime: number; callbackStartTime?: number; callbackEndTime?: number; requestId?: string; requestFrom?: RequestFrom; // 区分内部/外部请求 } interface RequestResultData { duration: number; request_type: string; url: string; result: string; error_msg: unknown; socket_reused?: number; // reused joli_request_number?: number; // 请求序号 request_from?: string; // 'public' / 'inner' } // report max count = 10 let requestNumber = 0; const requestNumberLimit = 10; export function reportNetworkAPI(method: string, url: string, options: ReportNetworkOptions): void { const { response, startTime, endTime, requestFrom } = options; const { errMsg = '', profile = {} } = response as FetchResponse; const duration = endTime - startTime; const trackData: RequestResultData = { duration, request_type: method, url: url.split('?')[0], result: options.state, error_msg: options.state === 'fail' ? errMsg : '', socket_reused: profile.socketReused ? 1 : 0, request_from: requestFrom }; // 用户请求上报最多10个,内部的全部上报 if ( (requestFrom === RequestFrom.PUBLIC && requestNumber < requestNumberLimit) || requestFrom === RequestFrom.INNER ) { trackData.joli_request_number = requestNumber++; setTimeout(() => { track('joliboxNetRequestResult', trackData as unknown as Record); }, 500); } }