test-api-client 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/client/logger.ts","../src/client/sign.ts","../src/client/state.ts","../src/client/token.ts","../src/client/error-codes.ts","../src/client/http.ts","../src/api/v1/auth.ts","../src/api/v1/airline.ts","../src/api/v1/fence.ts"],"names":["ErrorLevel","FunctionModule","e"],"mappings":"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","file":"index.mjs","sourcesContent":["export type ApiLogLevel = 'ALL' | 'TRACE' | 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'FATAL' | 'OFF';\r\n\r\nexport type LogFormatType = 1 | 2; // 1: json格式, 2: 传统文本格式\r\n\r\nexport type LogOutputOption = 1 | 2; // 1: 控制台打印, 2: 客户端上报\r\n\r\n/**\r\n * 错误级别枚举\r\n */\r\nexport enum ErrorLevel {\r\n SUCCESS = 0, // 成功(业务成功)\r\n SYSTEM = 1, // 系统级错误\r\n CLIENT_PARAM = 2, // 客户端参数错误\r\n AUTH = 3, // 认证授权错误\r\n BUSINESS = 4, // 业务逻辑错误\r\n RESOURCE = 5, // 资源操作错误\r\n NETWORK = 6, // 网络通信错误\r\n FILE_MEDIA = 7, // 文件/媒体错误\r\n DEVICE_HARDWARE = 8, // 设备硬件错误\r\n THIRD_PARTY = 9 // 第三方服务错误\r\n}\r\n\r\n/**\r\n * 功能模块枚举\r\n */\r\nexport enum FunctionModule {\r\n GENERAL = '00', // 通用/系统\r\n USER_AUTH = '01', // 用户认证\r\n SELF_CHECK = '02', // 自检维护\r\n AIRLINE = '03', // 航线管理\r\n FENCE = '04', // 电子围栏\r\n REAL_TIME_DATA = '05', // 实时数据\r\n VIDEO_STREAM = '06', // 视频流\r\n AUDIO_STREAM = '07', // 音频流\r\n MEDIA_SERVICE = '08', // 流媒体服务\r\n AV_CONTROL = '09', // 音视频控制\r\n LOG_FILE = '10', // 日志文件\r\n REMOTE_CONTROL = '11', // 遥控指令\r\n FLIGHT_STATUS = '12' // 飞行状态\r\n}\r\n\r\n/**\r\n * API错误类型\r\n */\r\nexport type ApiErrorType = 'network' | 'server' | 'auth' | 'business' | 'unknown';\r\n\r\n/**\r\n * Api API响应通用格式\r\n * @template T - 响应数据类型\r\n * @property {number} code - 响应状态码\r\n * @property {string} [msg] - 响应消息(短)\r\n * @property {string} [message] - 响应消息(长)\r\n * @property {number} [sub_code] - 子错误码\r\n * @property {string} [sub_msg] - 子错误消息\r\n * @property {T} [data] - 响应数据\r\n */\r\nexport interface ApiApiResponse<T> {\r\n code: number;\r\n msg?: string;\r\n message?: string;\r\n sub_code?: number;\r\n sub_msg?: string;\r\n data?: T;\r\n}\r\n\r\n/**\r\n * Api客户端配置\r\n * @property {string} baseUrl - API基础URL\r\n * @property {string} secret - 密钥\r\n * @property {string} salt - 加密盐值\r\n * @property {boolean} [debug] - 是否开启调试模式\r\n * @property {ApiLogLevel} [logLevel] - 日志等级\r\n * @property {LogFormatType} [logFormat] - 日志格式类型,1: json格式, 2: 传统文本格式\r\n * @property {LogOutputOption[]} [logOutput] - 日志输出选项,1: 控制台打印, 2: 客户端上报\r\n * @property {(log: object | string, level: ApiLogLevel, meta?: unknown) => void} [logger] - 自定义日志输出方法(用于外部系统集成)\r\n * @property {(error: ApiError) => void} [onError] - 统一错误回调(可用于埋点/上报)\r\n * @property {Record<number, string>} [businessErrorMessageMap] - 业务错误码映射(优先使用 sub_code,其次 code)\r\n * @property {number} [tokenRefreshMaxRetries] - Token失效时的最大重试次数,设置为0则一直重试\r\n */\r\nexport interface ApiClientConfig {\r\n baseUrl: string;\r\n secret: string;\r\n salt: string;\r\n debug?: boolean;\r\n logLevel?: ApiLogLevel;\r\n logFormat?: LogFormatType;\r\n logOutput?: LogOutputOption[];\r\n logger?: (log: object | string, level: ApiLogLevel, meta?: unknown) => void;\r\n onError?: (error: ApiError) => void;\r\n businessErrorMessageMap?: Record<number, string>;\r\n tokenRefreshMaxRetries?: number;\r\n}\r\n\r\n/**\r\n * Api结构化HTTP日志\r\n * @property {string} url - 请求URL\r\n * @property {string} name - API名称\r\n * @property {string} [method] - 请求方法\r\n * @property {unknown} [headers] - 请求头\r\n * @property {unknown} [request] - 请求体\r\n * @property {unknown} [response] - 响应体\r\n * @property {number} [durationMs] - 请求时长(毫秒)\r\n * @property {number} [status] - HTTP状态码\r\n * @property {string} [message] - 日志消息\r\n */\r\nexport interface ApiStructuredHttpLog {\r\n name?: string;\r\n url?: string;\r\n method?: string;\r\n headers?: unknown;\r\n request?: unknown;\r\n response?: unknown;\r\n durationMs?: number;\r\n status?: number;\r\n message?: string;\r\n}\r\n\r\n/**\r\n * 结构化日志接口,用于ELK、Splunk等日志系统\r\n */\r\nexport interface ApiStructuredLog {\r\n timestamp: string;\r\n level: ApiLogLevel;\r\n module: string;\r\n event: string;\r\n request?: {\r\n url: string;\r\n method: string;\r\n headers?: Record<string, string>;\r\n body?: unknown;\r\n };\r\n response?: {\r\n status: number;\r\n body?: unknown;\r\n };\r\n duration_ms?: number;\r\n message: string;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Api客户端错误类\r\n * 用于封装各种类型的错误信息\r\n */\r\nexport class ApiError extends Error {\r\n public readonly type: ApiErrorType;\r\n public readonly httpStatus?: number;\r\n public readonly code?: number;\r\n public readonly subCode?: number;\r\n public readonly subMsg?: string;\r\n public readonly errorLevel?: ErrorLevel;\r\n public readonly module?: FunctionModule;\r\n public readonly raw?: unknown;\r\n\r\n /**\r\n * 创建ApiError实例\r\n * @param params - 错误参数\r\n * @param params.message - 错误消息\r\n * @param params.type - 错误类型\r\n * @param params.httpStatus - HTTP状态码(可选)\r\n * @param params.code - 业务错误码(可选)\r\n * @param params.subCode - 业务子错误码(可选)\r\n * @param params.subMsg - 业务子错误消息(可选)\r\n * @param params.errorLevel - 错误级别(可选)\r\n * @param params.module - 功能模块(可选)\r\n * @param params.raw - 原始错误数据(可选)\r\n */\r\n constructor(params: {\r\n message: string;\r\n type: ApiErrorType;\r\n httpStatus?: number;\r\n code?: number;\r\n subCode?: number;\r\n subMsg?: string;\r\n errorLevel?: ErrorLevel;\r\n module?: FunctionModule;\r\n raw?: unknown;\r\n }) {\r\n super(params.message);\r\n this.name = 'ApiError';\r\n this.type = params.type;\r\n this.httpStatus = params.httpStatus;\r\n this.code = params.code;\r\n this.subCode = params.subCode;\r\n this.subMsg = params.subMsg;\r\n this.errorLevel = params.errorLevel;\r\n this.module = params.module;\r\n this.raw = params.raw;\r\n }\r\n}\r\n\r\n","import type { ApiClientConfig, ApiLogLevel, ApiStructuredHttpLog, ApiStructuredLog } from '../types';\n\n/**\n * 日志级别权重,用于比较日志级别\n */\nconst LOG_LEVEL_WEIGHT: Record<ApiLogLevel, number> = {\n 'ALL': 0,\n 'TRACE': 1,\n 'DEBUG': 2,\n 'INFO': 3,\n 'WARN': 4,\n 'ERROR': 5,\n 'FATAL': 6,\n 'OFF': 7\n};\n\n\n/**\n * 检查是否应该处理该级别日志\n * @param config - Api客户端配置\n * @param level - 日志级别\n * @returns 是否应该处理\n */\nfunction shouldHandle(config: ApiClientConfig | undefined, level: ApiLogLevel): boolean {\n if (!config?.debug) return false;\n \n const cfgLevel = config.logLevel ?? 'INFO';\n if (cfgLevel === 'OFF') return false;\n if (cfgLevel === 'ALL') return true;\n \n return LOG_LEVEL_WEIGHT[level] >= LOG_LEVEL_WEIGHT[cfgLevel];\n}\n\n/**\n * 格式化敏感信息(如密码、token等)\n * @param data - 要格式化的数据\n * @returns 格式化后的数据\n */\nfunction formatSensitiveData(data: unknown): unknown {\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map(item => formatSensitiveData(item));\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n const lowerKey = key.toLowerCase();\n if (lowerKey.includes('password') || lowerKey.includes('passwd') || \n lowerKey.includes('token') || lowerKey.includes('auth') || \n lowerKey.includes('secret')) {\n result[key] = typeof value === 'string' ? '******' : '******';\n } else {\n result[key] = formatSensitiveData(value);\n }\n }\n return result;\n}\n\n/**\n * 生成结构化日志\n * @param config - Api客户端配置\n * @param level - 日志级别\n * @param event - 事件类型\n * @param message - 日志消息\n * @param httpLog - HTTP日志结构(可选)\n * @param meta - 其他元数据(可选)\n * @returns 结构化日志对象\n */\nfunction generateStructuredLog(\n config: ApiClientConfig | undefined,\n level: ApiLogLevel,\n event: string,\n message: string,\n httpLog?: ApiStructuredHttpLog,\n meta?: unknown\n): ApiStructuredLog {\n const structuredLog: ApiStructuredLog = {\n timestamp: new Date().toISOString(),\n level,\n module: 'api-client',\n event,\n message\n };\n\n // 添加HTTP相关信息\n if (httpLog) {\n if (httpLog.url && httpLog.method) {\n structuredLog.request = {\n url: httpLog.url,\n method: httpLog.method,\n headers: httpLog.headers as Record<string, string>,\n body: formatSensitiveData(httpLog.request)\n };\n }\n \n if (httpLog.response && typeof httpLog.response === 'object') {\n const responseObj = httpLog.response as { status?: number; code?: number; [key: string]: unknown };\n structuredLog.response = {\n status: responseObj.status || responseObj.code || 0,\n body: responseObj\n };\n }\n \n if (httpLog.durationMs) {\n structuredLog.duration_ms = httpLog.durationMs;\n }\n }\n\n // 添加其他元数据\n if (meta) {\n Object.assign(structuredLog, meta);\n }\n\n return structuredLog;\n}\n\n/**\n * 格式化日志为JSON格式\n * @param log - 结构化日志对象\n * @returns JSON字符串\n */\nfunction formatJsonLog(log: ApiStructuredLog): string {\n return JSON.stringify(log, null, 2);\n}\n\n/**\n * 格式化日志为传统文本格式\n * @param log - 结构化日志对象\n * @returns 文本字符串\n */\nfunction formatTextLog(log: ApiStructuredLog): string {\n const { timestamp: timestamp, level, module, event, message, duration_ms } = log;\n let text = `${timestamp} [${level}] [${module}] [${event}]`;\n if (log.trace_id) {\n text += ` [trace_id: ${log.trace_id}]`;\n }\n if (duration_ms) {\n text += ` [duration: ${duration_ms}ms]`;\n }\n text += ` - ${message}`;\n \n // 添加请求信息\n if (log.request) {\n text += `\\n Request: ${log.request.method} ${log.request.url}`;\n if (log.request.headers) {\n text += `\\n Headers: ${JSON.stringify(log.request.headers)}`;\n }\n if (log.request.body) {\n text += `\\n Body: ${JSON.stringify(log.request.body)}`;\n }\n }\n \n // 添加响应信息\n if (log.response) {\n text += `\\n Response: ${log.response.status}`;\n if (log.response.body) {\n text += `\\n Body: ${JSON.stringify(log.response.body)}`;\n }\n }\n \n return text;\n}\n\n/**\n * 格式化日志\n * @param config - Api客户端配置\n * @param log - 结构化日志对象\n * @returns 格式化后的日志字符串\n */\nfunction formatLog(config: ApiClientConfig | undefined, log: ApiStructuredLog): string {\n const formatType = config?.logFormat ?? 1;\n return formatType === 1 ? formatJsonLog(log) : formatTextLog(log);\n}\n\n/**\n * 控制台打印日志\n * @param config - Api客户端配置\n * @param log - 结构化日志对象\n */\nfunction printLog(config: ApiClientConfig | undefined, log: ApiStructuredLog): void {\n const logOutput = config?.logOutput ?? [1]; // 默认只在控制台打印\n if (!logOutput.includes(1)) return;\n\n const formattedLog = formatLog(config, log);\n \n // 根据日志级别选择不同的控制台方法\n switch (log.level) {\n case 'DEBUG':\n case 'TRACE':\n console.debug(formattedLog);\n break;\n case 'INFO':\n console.info(formattedLog);\n break;\n case 'WARN':\n console.warn(formattedLog);\n break;\n case 'ERROR':\n case 'FATAL':\n console.error(formattedLog);\n break;\n default:\n console.log(formattedLog);\n }\n}\n\n/**\n * 发送日志到客户端\n * @param config - Api客户端配置\n * @param log - 结构化日志对象\n */\nfunction sendLogToClient(config: ApiClientConfig | undefined, log: ApiStructuredLog): void {\n const logOutput = config?.logOutput ?? [1]; // 默认只在控制台打印\n if (!logOutput.includes(2)) return;\n \n config?.logger?.(log, log.level, log);\n}\n\n/**\n * 统一处理HTTP日志\n * @param config - Api客户端配置\n * @param level - 日志级别\n * @param httpLog - HTTP日志结构\n */\nexport function handleHttpLog(\n config: ApiClientConfig,\n level: ApiLogLevel,\n httpLog: ApiStructuredHttpLog\n): void {\n if (!shouldHandle(config, level)) return;\n \n const message = `${httpLog.name || 'HTTP Request'} ${httpLog.method || ''} ${httpLog.url || ''}`;\n const structuredLog = generateStructuredLog(config, level, 'request', message, httpLog);\n \n printLog(config, structuredLog);\n sendLogToClient(config, structuredLog);\n}\n\n/**\n * 记录日志\n * @param config - Api客户端配置\n * @param level - 日志级别\n * @param message - 日志消息\n * @param meta - 日志元数据(可选)\n */\nexport function emitLog(\n config: ApiClientConfig | undefined,\n level: ApiLogLevel,\n message: string,\n meta?: unknown\n): void {\n if (!shouldHandle(config, level)) return;\n \n const structuredLog = generateStructuredLog(config, level, 'general', message, undefined, meta);\n \n printLog(config, structuredLog);\n sendLogToClient(config, structuredLog);\n}\n\n/**\n * 直接生成并返回结构化日志对象(用于客户端直接上报)\n * @param config - Api客户端配置\n * @param level - 日志级别\n * @param event - 事件类型\n * @param message - 日志消息\n * @param httpLog - HTTP日志结构(可选)\n * @param meta - 其他元数据(可选)\n * @returns 结构化日志对象\n */\nexport function generateLog(\n config: ApiClientConfig | undefined,\n level: ApiLogLevel,\n event: string,\n message: string,\n httpLog?: ApiStructuredHttpLog,\n meta?: unknown\n): ApiStructuredLog {\n return generateStructuredLog(config, level, event, message, httpLog, meta);\n}\n","import CryptoJS from 'crypto-js';\n\n/**\n * 获取URI路径\n * @param urlOrPath - URL或路径字符串\n * @returns URI路径\n */\nfunction getUri(urlOrPath: string): string {\n try {\n const url = new URL(urlOrPath, 'https://example.com');\n return url.pathname;\n } catch {\n return urlOrPath.split('?')[0];\n }\n}\n\n/**\n * 序列化值为字符串\n * @param value - 要序列化的值\n * @returns 序列化后的字符串\n */\nfunction serializeValue(value: unknown): string {\n if (typeof value === 'object' && value !== null) {\n if (value instanceof Date) return value.toISOString();\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/**\n * 生成签名 - 按小写key排序(与Java一致)\n * @param params 参与签名的参数\n * @param secret 签名密钥\n * @param salt HMAC-MD5盐值\n * @returns HMAC-MD5签名\n */\nexport function generateSignature(params: Record<string, unknown>, secret: string, salt: string): string {\n // 1. 过滤空值并准备排序\n const entries: [string, unknown][] = [];\n for (const [key, value] of Object.entries(params)) {\n if (value != null && value !== '') {\n entries.push([key, value]);\n }\n }\n \n // 2. 按小写key排序(与Java完全一致)\n entries.sort((a, b) =>\n a[0].toLowerCase().localeCompare(b[0].toLowerCase())\n );\n \n // 3. 构建待签名字符串(key使用小写,与Java一致)\n let strToSign = '';\n for (const [key, value] of entries) {\n strToSign += `${key.toLowerCase()}=${serializeValue(value)}&`;\n }\n strToSign += `secret=${secret}`;\n \n // 4. 使用HMAC-MD5\n const hmac = CryptoJS.HmacMD5(strToSign, salt);\n return hmac.toString(CryptoJS.enc.Hex);\n}\n\n/**\n * 生成随机nonce\n * 随机nonce字符串,用于签名\n * @param length - 随机字符串长度\n * @returns 随机nonce字符串\n */\nexport function randomNonce(length: number = 32): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\n/**\n * 生成完整的请求头\n * @param params - 请求参数\n * @param uri - 请求URI\n * @param secret - 签名密钥\n * @param salt - HMAC-MD5盐值\n * @param token - 认证令牌\n * @returns 请求头对象\n */\nexport function generateHeaders(params: Record<string, unknown>, uri: string, secret: string, salt: string, token: string = ''): Record<string, string> {\n const timestamp = Date.now().toString();\n const nonce = randomNonce(32); // 使用32位随机字符串\n \n // 构建签名参数\n const signParams: Record<string, unknown> = {\n ...params,\n 'X-Timestamp': timestamp,\n 'X-Nonce': nonce,\n 'uri': getUri(uri),\n };\n \n // 生成签名\n const signature = generateSignature(signParams, secret, salt);\n \n // 返回请求头\n return {\n 'Authorization': token || '7f2d0948-63e2-42c8-ab5f-d6e495bec919',\n 'X-Timestamp': timestamp,\n 'X-Nonce': nonce,\n 'X-Sign': signature\n };\n}\n\n/**\n * 生成签名(兼容原有API)\n * @param input - 签名输入参数\n * @returns 包含签名和签名字符串的对象\n */\nexport function generateSign(input: {\n uri: string;\n timestamp: number;\n nonce: string;\n query?: Record<string, unknown>;\n body?: unknown;\n secret: string;\n salt: string;\n}): { sign: string; signString: string } {\n const params: Record<string, unknown> = {};\n\n params.uri = getUri(input.uri);\n params['X-Timestamp'] = String(input.timestamp);\n params['X-Nonce'] = input.nonce;\n\n if (input.query) {\n Object.assign(params, input.query);\n }\n\n if (input.body !== undefined && input.body !== null && input.body !== '') {\n if (typeof input.body === 'object' && !Array.isArray(input.body)) {\n Object.assign(params, input.body as Record<string, unknown>);\n } else if (typeof input.body === 'string') {\n const s = input.body.trim();\n if (s.startsWith('{') && s.endsWith('}')) {\n try {\n const obj = JSON.parse(s);\n if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n Object.assign(params, obj as Record<string, unknown>);\n } else {\n params.body = input.body;\n }\n } catch {\n params.body = input.body;\n }\n } else {\n params.body = input.body;\n }\n } else {\n params.body = input.body;\n }\n }\n\n // 使用新的签名算法\n const sign = generateSignature(params, input.secret, input.salt);\n \n // 构建签名字符串用于返回(与Java一致的格式)\n const entries: [string, unknown][] = [];\n for (const [key, value] of Object.entries(params)) {\n if (value != null && value !== '') {\n entries.push([key, value]);\n }\n }\n entries.sort((a, b) => a[0].toLowerCase().localeCompare(b[0].toLowerCase()));\n let signString = '';\n for (const [key, value] of entries) {\n signString += `${key.toLowerCase()}=${serializeValue(value)}&`;\n }\n signString += `secret=${input.secret}`;\n \n return { sign, signString };\n}\n\n","import type { AxiosInstance } from 'axios';\r\nimport type { ApiClientConfig } from '../types';\r\n\r\nexport interface ApiClientState {\r\n config?: ApiClientConfig;\r\n axios?: AxiosInstance;\r\n token?: string;\r\n simulate401Remaining?: number;\r\n}\r\n\r\nexport const state: ApiClientState = {};\r\n","import { state } from './state';\n\n/**\n * 设置Api令牌\n * @param token - 令牌字符串或undefined\n */\nexport function setApiToken(token: string | undefined): void {\n state.token = token;\n}\n\n/**\n * 获取Api令牌\n * @returns 令牌字符串或undefined\n */\nexport function getApiToken(): string | undefined {\n return state.token;\n}\n","/**\n * 错误码映射模块\n * 根据后端提供的错误码文档实现统一的错误码映射和解析\n */\n\n/**\n * HTTP状态码映射\n */\nexport const HTTP_STATUS_MAP: Record<number, string> = {\n 200: '请求成功',\n 400: '参数列表错误',\n 401: '未授权',\n 403: '访问受限,授权过期',\n 404: '资源或服务未找到',\n 405: '不允许的HTTP方法',\n 408: '请求超时',\n 500: '系统内部错误',\n 501: '未实现',\n 503: '服务不可用'\n};\n\n/**\n * 业务错误码映射\n * 格式:XYYZZ\n * X: 错误级别, YY: 功能模块, ZZ: 具体错误序号\n */\nexport const BUSINESS_ERROR_MAP: Record<string, string> = {\n // 系统级错误 (1YYZZ)\n '10000': '系统内部错误',\n '10001': '数据库操作失败',\n '10002': '缓存服务异常',\n '10003': '配置文件错误',\n '10004': '服务初始化失败',\n '10005': '系统资源不足',\n '10006': '线程池异常',\n '10007': '消息队列异常',\n '10008': '服务间通信失败',\n '10009': '数据序列化失败',\n '10010': '数据反序列化失败',\n\n // 客户端参数错误 (2YYZZ)\n '20000': '通用参数错误',\n '20001': '必填参数缺失',\n '20002': '参数格式错误',\n '20003': '参数类型不匹配',\n '20004': '参数值超出范围',\n '20005': '参数校验失败',\n '20006': 'JSON解析失败',\n '20007': 'XML解析失败',\n '20008': '参数长度超限',\n '20009': '无效的枚举值',\n '20010': '参数组合无效',\n '20011': '请求体过大',\n '20012': '时间参数格式错误',\n\n // 认证授权错误 (3YYZZ)\n '30001': '用户名不存在',\n '30002': '密码错误',\n '30003': '用户账号已禁用',\n '30004': '用户账号已锁定',\n '30005': '登录尝试次数超限',\n '30006': '会话已过期',\n '30007': '令牌无效',\n '30008': '令牌已过期',\n '30009': '刷新令牌无效',\n '30010': '权限不足',\n '30011': '角色不存在',\n '30012': '访问IP受限',\n '30013': '访问时间受限',\n '30014': '双因素认证失败',\n '30015': '用户名不能为空',\n '30016': '密码不能为空',\n '30017': '用户名已经存在',\n '30018': '用户名退出失败',\n\n // 业务逻辑错误 (4YYZZ)\n // 403ZZ: 航线管理\n '40300': '航线操作失败',\n '40301': '航线ID已存在',\n '40302': '航线不存在',\n '40303': '航线名称重复',\n '40304': '航线数据无效',\n '40305': '航点列表为空',\n '40306': '航点数量超限',\n '40307': '航点序号不连续',\n '40308': '航点类型不合法(允许值:0/1/2)',\n '40309': '经纬度格式错误',\n '40310': '经纬度超出范围',\n '40311': '高度值非法',\n '40312': '速度值非法',\n '40313': '切换模式不合法',\n '40314': '航线总距离超限',\n '40315': '航线保存失败',\n '40316': '航线删除失败',\n '40317': '航线复制失败',\n '40318': '航线导入失败',\n '40319': '航线导出失败',\n '40320': '航线执行冲突(正在执行)',\n\n // 404ZZ: 电子围栏\n '40400': '围栏操作失败',\n '40401': '围栏名称重复',\n '40402': '围栏不存在',\n '40403': '几何类型不合法(0=多边形,1=圆形,2=扇区)',\n '40404': '空域属性不合法(0=禁飞,1=警告,2=限高,3=管制)',\n '40405': '多边形顶点数不足(至少3个)',\n '40406': '顶点坐标格式错误',\n '40407': '顶点序号不连续',\n '40408': '多边形自相交',\n '40409': '圆形半径非法',\n '40410': '扇区半径非法',\n '40411': '起始方向不合法(0-360)',\n '40412': '结束方向不合法(0-360)',\n '40413': '时间范围重叠',\n '40414': '相对高度非法',\n '40415': '围栏空间冲突(与现有围栏重叠)',\n\n // 405ZZ: 实时数据\n '40500': '实时数据错误',\n '40501': '数据流不存在',\n '40502': '数据订阅失败',\n '40503': '数据发布失败',\n '40504': '数据格式错误',\n '40505': '数据解析失败',\n '40506': '时间戳无效',\n '40507': '数据过期',\n '40508': '数据频率超限',\n '40509': '数据量过大',\n '40510': '数据流中断',\n '40511': '数据类型不支持',\n '40512': '数据验证失败',\n\n // 文件/媒体错误 (7YYZZ)\n // 706ZZ: 视频流\n '70600': '视频流错误',\n '70601': '视频流不存在或未开启',\n '70602': '视频流权限不足',\n '70603': '视频编码格式不支持(支持:H.264, H.265, VP9)',\n '70604': '视频分辨率不支持',\n '70605': '视频帧率异常(范围:1-60fps)',\n '70606': '视频流连接失败(RTSP/WebRTC)',\n '70607': '视频流中断',\n '70608': '视频解码失败',\n '70609': '视频缓冲超时',\n '70610': '视频流会话超限(每终端最多X路)',\n '70611': '视频存储失败',\n '70612': '视频时间戳异常',\n '70613': '视频码率异常',\n '70614': '视频关键帧丢失',\n '70615': '视频水印添加失败',\n\n // 707ZZ: 音频流\n '70700': '音频流错误',\n '70701': '音频流不存在或未开启',\n '70702': '音频流权限不足',\n '70703': '音频编码格式不支持(支持:AAC, MP3, Opus)',\n '70704': '音频采样率不支持',\n '70705': '音频声道数不支持(支持:单声道/立体声)',\n '70706': '音频流连接失败',\n '70707': '音频流中断',\n '70708': '音频解码失败',\n '70709': '音频采集设备异常',\n '70710': '音频播放设备异常',\n '70711': '音频降噪失败',\n '70712': '音频回声消除失败',\n '70713': '音频比特率异常',\n\n // 708ZZ: 流媒体服务\n '70800': '流媒体服务错误',\n '70801': '流媒体服务器不可用',\n '70802': '网络带宽不足',\n '70803': '网络延迟过高(>300ms)',\n '70804': '网络丢包严重(>5%)',\n '70805': '流媒体协议不支持',\n '70806': '流媒体会话过期',\n '70807': '流媒体会话冲突',\n '70808': '转码服务失败',\n '70809': '合流服务失败',\n '70810': '录制服务失败',\n\n // 709ZZ: 音视频控制\n '70900': '音视频控制错误',\n '70901': '开始推流失败',\n '70902': '停止推流失败',\n '70903': '切换码率失败',\n '70904': '切换分辨率失败',\n '70905': '静音操作失败',\n '70906': '取消静音失败',\n '70907': '开始录像失败',\n '70908': '停止录像失败',\n '70909': '视频抓拍失败',\n '70910': '云台控制失败',\n '70911': '镜头变焦失败',\n '70912': '焦点调整失败',\n '70913': '白平衡调整失败',\n\n // 710ZZ: 日志文件\n '71000': '文件操作错误',\n '71001': '文件参数缺失',\n '71002': '文件格式不支持',\n '71003': '文件读取失败',\n '71004': '文件解析失败',\n '71005': '文件大小超限(最大:100MB)',\n '71006': '文件上传失败',\n '71007': '文件下载失败',\n '71008': '文件删除失败',\n '71009': '文件校验失败(MD5/SHA)',\n '71010': '文件压缩失败',\n '71011': '文件解压失败',\n '71012': '存储空间不足',\n\n // 设备硬件错误 (8YYZZ)\n // 802ZZ: 自检维护\n '80200': '自检维护错误',\n '80201': '遥控站自检参数缺失',\n '80202': '遥控站自检参数错误',\n '80203': '机上系统自检参数缺失',\n '80204': '机上系统自检参数错误',\n '80205': '维护指令参数缺失',\n '80206': '维护指令参数错误',\n '80207': '自检超时(>30秒)',\n '80208': '自检失败(硬件异常)',\n '80209': 'GPS模块异常',\n '80210': 'IMU传感器异常',\n '80211': '气压计异常',\n '80212': '磁力计异常',\n '80213': '电池状态异常',\n '80214': '电机状态异常',\n '80215': '通信模块异常',\n '80216': '飞控系统异常',\n '80217': '固件版本不匹配'\n};\n\n/**\n * 错误级别枚举\n */\nexport enum ErrorLevel {\n SUCCESS = 0, // 成功(业务成功)\n SYSTEM = 1, // 系统级错误\n CLIENT_PARAM = 2, // 客户端参数错误\n AUTH = 3, // 认证授权错误\n BUSINESS = 4, // 业务逻辑错误\n RESOURCE = 5, // 资源操作错误\n NETWORK = 6, // 网络通信错误\n FILE_MEDIA = 7, // 文件/媒体错误\n DEVICE_HARDWARE = 8, // 设备硬件错误\n THIRD_PARTY = 9 // 第三方服务错误\n}\n\n/**\n * 功能模块枚举\n */\nexport enum FunctionModule {\n GENERAL = '00', // 通用/系统\n USER_AUTH = '01', // 用户认证\n SELF_CHECK = '02', // 自检维护\n AIRLINE = '03', // 航线管理\n FENCE = '04', // 电子围栏\n REAL_TIME_DATA = '05', // 实时数据\n VIDEO_STREAM = '06', // 视频流\n AUDIO_STREAM = '07', // 音频流\n MEDIA_SERVICE = '08', // 流媒体服务\n AV_CONTROL = '09', // 音视频控制\n LOG_FILE = '10', // 日志文件\n REMOTE_CONTROL = '11', // 遥控指令\n FLIGHT_STATUS = '12' // 飞行状态\n}\n\n/**\n * 解析业务错误码\n * @param subCode 业务错误码\n * @returns 错误信息\n */\nexport function resolveBusinessError(subCode: number | string | undefined): string {\n if (!subCode) return '业务错误';\n const codeStr = String(subCode);\n return BUSINESS_ERROR_MAP[codeStr] || '未知业务错误';\n}\n\n/**\n * 解析HTTP状态码\n * @param status HTTP状态码\n * @returns 状态信息\n */\nexport function resolveHttpStatus(status: number | undefined): string {\n if (!status) return '未知状态';\n return HTTP_STATUS_MAP[status] || '未知HTTP状态';\n}\n\n/**\n * 解析错误级别\n * @param subCode 业务错误码\n * @returns 错误级别\n */\nexport function resolveErrorLevel(subCode: number | string | undefined): ErrorLevel {\n if (!subCode) return ErrorLevel.BUSINESS;\n const codeStr = String(subCode);\n const level = parseInt(codeStr[0], 10);\n return Object.values(ErrorLevel).includes(level as ErrorLevel) ? (level as ErrorLevel) : ErrorLevel.BUSINESS;\n}\n\n/**\n * 解析功能模块\n * @param subCode 业务错误码\n * @returns 功能模块\n */\nexport function resolveFunctionModule(subCode: number | string | undefined): string {\n if (!subCode) return FunctionModule.GENERAL;\n const codeStr = String(subCode);\n if (codeStr.length < 3) return FunctionModule.GENERAL;\n const module = codeStr.slice(1, 3);\n return Object.values(FunctionModule).includes(module as FunctionModule) ? (module as FunctionModule) : FunctionModule.GENERAL;\n}\n","import axios, { AxiosHeaders, type AxiosError, type AxiosInstance, type AxiosRequestConfig, type InternalAxiosRequestConfig } from 'axios';\r\nimport type { ApiApiResponse, ApiClientConfig, ApiStructuredHttpLog } from '../types';\r\nimport { ApiError, ErrorLevel, FunctionModule } from '../types';\r\nimport { handleHttpLog } from './logger';\r\nimport { generateSign, randomNonce } from './sign';\r\nimport { getApiToken, setApiToken } from './token';\r\nimport { state } from './state';\r\nimport { resolveBusinessError, resolveHttpStatus, resolveErrorLevel, resolveFunctionModule } from './error-codes';\r\n\r\nimport type { AxiosResponse } from 'axios';\r\n\r\n/**\r\n * Axios请求元数据接口\r\n * @interface ApiAxiosMeta\r\n * @property {number} startTime - 请求开始时间戳\r\n * @property {string} [apiName] - API名称,用于日志记录\r\n */\r\ninterface ApiAxiosMeta {\r\n startTime: number;\r\n apiName?: string;\r\n}\r\n\r\n/**\r\n * 扩展的Axios内部配置类型\r\n * @typedef {InternalAxiosRequestConfig & { metadata?: ApiAxiosMeta; _retry?: boolean }} ApiInternalConfig\r\n * @property {ApiAxiosMeta} [metadata] - 请求元数据\r\n * @property {boolean} [_retry] - 是否为重试请求标识\r\n */\r\ntype ApiInternalConfig = InternalAxiosRequestConfig & {\r\n metadata?: ApiAxiosMeta;\r\n _retry?: boolean;\r\n};\r\n\r\n/**\r\n * 已通知错误集合,用于避免重复通知相同错误\r\n * @type {WeakSet<ApiError>}\r\n */\r\nconst notifiedErrors = new WeakSet<ApiError>();\r\n\r\n/**\r\n * 从响应中提取消息\r\n * @param r - 包含msg或message字段的响应对象\r\n * @returns 提取的消息字符串\r\n */\r\nfunction pickMsg(r: { msg?: string; message?: string }): string {\r\n return r.msg ?? r.message ?? '';\r\n}\r\n\r\n/**\r\n * 通知错误\r\n * @param config - Api客户端配置\r\n * @param error - 错误对象\r\n */\r\nfunction notifyError(config: ApiClientConfig, error: ApiError): void {\r\n try {\r\n if (notifiedErrors.has(error)) return;\r\n notifiedErrors.add(error);\r\n\r\n if (config.debug) {\r\n // 提取raw中的可能属性,使用类型安全的方式访问\r\n const raw = error.raw;\r\n\r\n // 使用handleHttpLog保存错误日志\r\n handleHttpLog(config, 'ERROR', {\r\n name: 'ApiError',\r\n url: typeof raw === 'object' && raw !== null && 'url' in raw ? String((raw as Record<string, unknown>).url as string) : undefined,\r\n method: typeof raw === 'object' && raw !== null && 'method' in raw ? String((raw as Record<string, unknown>).method as string) : undefined,\r\n response: {\r\n code: error.code || error.httpStatus || 500,\r\n message: error.message,\r\n error: error.type,\r\n sub_code: error.subCode,\r\n sub_msg: error.subMsg\r\n },\r\n status: error.httpStatus,\r\n request: typeof raw === 'object' && raw !== null && ('request' in raw || 'data' in raw) ? (raw as Record<string, unknown>).request || (raw as Record<string, unknown>).data : undefined,\r\n headers: typeof raw === 'object' && raw !== null && 'headers' in raw ? (raw as Record<string, unknown>).headers : undefined\r\n } satisfies ApiStructuredHttpLog);\r\n }\r\n\r\n config.onError?.(error);\r\n } catch {\r\n return;\r\n }\r\n}\r\n\r\n/**\r\n * 模拟后续请求返回401错误,用于测试token刷新逻辑\r\n * @export\r\n * @param {number} [count=1] - 模拟401错误的请求次数\r\n */\r\nexport function simulateNext401(count = 1): void {\r\n state.simulate401Remaining = count;\r\n}\r\n\r\n/**\r\n * 解析业务错误消息\r\n * @param {ApiClientConfig} config - Api客户端配置,包含业务错误消息映射\r\n * @param {ApiApiResponse<unknown>} data - API响应数据\r\n * @returns {string} 解析后的业务错误消息\r\n */\r\nfunction resolveBusinessMessage(config: ApiClientConfig, data: ApiApiResponse<unknown>): string {\r\n // 首先检查配置中是否有自定义的错误消息映射\r\n const key = (data.sub_code ?? data.code) as number | undefined;\r\n if (key !== undefined) {\r\n const mapped = config.businessErrorMessageMap?.[key];\r\n if (mapped) return mapped;\r\n }\r\n \r\n // 使用错误码映射库解析业务错误\r\n const businessMsg = resolveBusinessError(data.sub_code);\r\n if (businessMsg !== '业务错误') return businessMsg;\r\n \r\n // 最后使用响应中的msg或message字段,默认返回'业务错误'\r\n return pickMsg(data) || '业务错误';\r\n}\r\n\r\n/**\r\n * 判断请求是否为token刷新请求\r\n * @param {AxiosRequestConfig | undefined} cfg - Axios请求配置\r\n * @returns {boolean} 是否为token刷新请求\r\n */\r\nfunction isRefreshRequest(cfg: AxiosRequestConfig | undefined): boolean {\r\n const url = cfg?.url ?? '';\r\n // 通过URL路径判断是否为刷新请求\r\n return url.includes('/auth/v1/refresh');\r\n}\r\n\r\n/**\r\n * 从URL中解析查询参数\r\n * @param {string} url - URL字符串\r\n * @returns {Record<string, string>} 解析后的查询参数对象\r\n */\r\nfunction parseQueryFromUrl(url: string): Record<string, string> {\r\n const idx = url.indexOf('?');\r\n if (idx < 0) return {};\r\n \r\n const qs = url.slice(idx + 1);\r\n if (!qs) return {};\r\n\r\n const out: Record<string, string> = {};\r\n \r\n // 分割查询字符串并解析每个参数\r\n for (const part of qs.split('&')) {\r\n if (!part) continue;\r\n \r\n const eq = part.indexOf('=');\r\n if (eq < 0) {\r\n // 没有值的参数,如 ?param1&param2\r\n out[decodeURIComponent(part)] = '';\r\n continue;\r\n }\r\n \r\n const k = decodeURIComponent(part.slice(0, eq));\r\n const v = decodeURIComponent(part.slice(eq + 1));\r\n out[k] = v;\r\n }\r\n \r\n return out;\r\n}\r\n\r\n/**\r\n * 安全设置请求头\r\n * @param {InternalAxiosRequestConfig} cfg - 内部Axios请求配置\r\n * @param {string} key - 头字段名\r\n * @param {string | number} value - 头字段值\r\n */\r\nfunction setHeader(cfg: InternalAxiosRequestConfig, key: string, value: string | number): void {\r\n // 确保headers对象存在\r\n if (!cfg.headers) cfg.headers = new AxiosHeaders();\r\n\r\n // 兼容不同版本的Axios headers API\r\n const headers = cfg.headers as unknown;\r\n const headerSetter = headers as { set?: (k: string, v: string | number) => unknown };\r\n \r\n if (typeof headerSetter.set === 'function') {\r\n // 使用set方法设置头信息(Axios 0.21+推荐方式)\r\n headerSetter.set(key, value);\r\n return;\r\n }\r\n\r\n // 直接赋值方式(兼容旧版本)\r\n (cfg.headers as Record<string, unknown>)[key] = value;\r\n}\r\n\r\n/**\r\n * 令牌刷新状态标志\r\n * @type {boolean}\r\n */\r\nlet isRefreshing = false;\r\n\r\n/**\r\n * 令牌刷新Promise,用于同步多个请求的刷新操作\r\n * @type {Promise<string> | undefined}\r\n */\r\nlet refreshPromise: Promise<string> | undefined;\r\n\r\n/**\r\n * 等待令牌刷新的挂起请求队列\r\n * @type {Array<{ resolve: () => void; reject: (reason?: unknown) => void; config: ApiInternalConfig }>}\r\n */\r\nconst pending: Array<{\r\n resolve: () => void;\r\n reject: (reason?: unknown) => void;\r\n config: ApiInternalConfig;\r\n}> = [];\r\n\r\n/**\r\n * 延迟函数\r\n * @param {number} ms - 延迟毫秒数\r\n * @returns {Promise<void>} 延迟后的Promise\r\n */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n/**\r\n * 带重试机制的令牌刷新函数\r\n * @param {AxiosInstance} instance - Axios实例\r\n * @param {ApiClientConfig} config - Api客户端配置\r\n * @returns {Promise<string>} 刷新成功后的新令牌\r\n */\r\nasync function refreshTokenWithRetry(instance: AxiosInstance, config: ApiClientConfig): Promise<string> {\r\n // 获取最大重试次数,默认为1次\r\n const maxRetries = config.tokenRefreshMaxRetries ?? 1;\r\n let retryCount = 0;\r\n\r\n // 无限循环直到成功或达到最大重试次数\r\n while (true) {\r\n try {\r\n // 尝试刷新令牌\r\n return await refreshToken(instance, config);\r\n } catch (e) {\r\n // 如果是因为未设置token导致的错误,直接抛出,不再重试\r\n if (e instanceof ApiError && e.message.includes('未设置 token')) throw e;\r\n\r\n retryCount += 1;\r\n // 判断是否需要重试:maxRetries为0表示无限重试,否则不超过maxRetries次\r\n const shouldRetry = maxRetries === 0 || retryCount <= maxRetries;\r\n if (!shouldRetry) throw e;\r\n \r\n // 等待500ms后重试\r\n await sleep(500);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 刷新令牌并重新执行失败的请求\r\n * @param {AxiosInstance} instance - Axios实例\r\n * @param {ApiClientConfig} config - Api客户端配置\r\n * @param {ApiInternalConfig} cfg - 失败请求的配置\r\n * @returns {Promise<AxiosResponse>} 重新执行请求后的响应\r\n */\r\nasync function refreshAndReplay(instance: AxiosInstance, config: ApiClientConfig, cfg: ApiInternalConfig): Promise<AxiosResponse> {\r\n // 标记为重试请求,避免无限刷新循环\r\n cfg._retry = true;\r\n\r\n // 如果已有刷新操作正在进行,将当前请求加入等待队列\r\n if (isRefreshing) {\r\n return new Promise<void>((resolve, reject) => {\r\n pending.push({ resolve, reject, config: cfg });\r\n }).then(() => instance.request(cfg));\r\n }\r\n\r\n // 开始刷新操作\r\n isRefreshing = true;\r\n // 调用带重试机制的刷新函数\r\n refreshPromise = refreshTokenWithRetry(instance, config);\r\n\r\n try {\r\n // 等待刷新完成\r\n await refreshPromise;\r\n // 刷新成功后,执行所有等待的请求\r\n for (const p of pending.splice(0, pending.length)) {\r\n p.resolve();\r\n }\r\n // 重新执行当前请求\r\n return instance.request(cfg);\r\n } catch (e) {\r\n // 刷新失败,拒绝所有等待的请求\r\n for (const p of pending.splice(0, pending.length)) {\r\n p.reject(e);\r\n }\r\n throw e;\r\n } finally {\r\n // 重置刷新状态\r\n isRefreshing = false;\r\n refreshPromise = undefined;\r\n }\r\n}\r\n\r\n/**\r\n * 刷新访问令牌\r\n * @param {AxiosInstance} instance - Axios实例\r\n * @param {ApiClientConfig} config - Api客户端配置\r\n * @returns {Promise<string>} 新的访问令牌\r\n * @throws {ApiError} 刷新失败时抛出ApiError\r\n */\r\nasync function refreshToken(instance: AxiosInstance, config: ApiClientConfig): Promise<string> {\r\n // 记录刷新令牌开始(INFO级别)\r\n handleHttpLog(config, 'INFO', {\r\n name: 'refreshToken',\r\n url: `${config.baseUrl}/auth/v1/refresh`,\r\n method: 'POST',\r\n message: '开始刷新访问令牌'\r\n } satisfies ApiStructuredHttpLog);\r\n \r\n // 获取当前存储的令牌\r\n const token = getApiToken();\r\n // 如果没有令牌,无法刷新\r\n if (!token) {\r\n const error = new ApiError({ message: '未设置 token,无法刷新', type: 'auth' });\r\n // 记录错误日志\r\n handleHttpLog(config, 'ERROR', {\r\n name: 'refreshToken',\r\n url: `${config.baseUrl}/auth/v1/refresh`,\r\n method: 'POST',\r\n message: '刷新令牌失败:未设置token'\r\n } satisfies ApiStructuredHttpLog);\r\n throw error;\r\n }\r\n \r\n // 记录刷新令牌请求详情(DEBUG级别)\r\n handleHttpLog(config, 'DEBUG', {\r\n name: 'refreshToken',\r\n url: `${config.baseUrl}/auth/v1/refresh`,\r\n method: 'POST',\r\n message: '发送刷新令牌请求',\r\n request: {}\r\n } satisfies ApiStructuredHttpLog);\r\n \r\n // 发送刷新令牌请求\r\n const res = await instance.request<ApiApiResponse<{ token: string; expires_in: number }>>({\r\n url: '/auth/v1/refresh',\r\n method: 'POST',\r\n data: {}\r\n });\r\n\r\n // 验证响应是否成功\r\n if (!res.data || res.data.code !== 200 || !res.data.data?.token) {\r\n const error = new ApiError({\r\n message: pickMsg(res.data ?? {}) || '刷新 token 失败',\r\n type: 'auth',\r\n httpStatus: res.status,\r\n code: res.data?.code,\r\n subCode: res.data?.sub_code,\r\n subMsg: res.data?.sub_msg,\r\n raw: res.data\r\n });\r\n // 记录刷新失败日志\r\n handleHttpLog(config, 'ERROR', {\r\n name: 'refreshToken',\r\n url: `${config.baseUrl}/auth/v1/refresh`,\r\n method: 'POST',\r\n response: res.data,\r\n status: res.status,\r\n request: {},\r\n headers: res.config.headers,\r\n } satisfies ApiStructuredHttpLog);\r\n throw error;\r\n }\r\n\r\n // 提取新令牌并存储\r\n const newToken = res.data.data.token;\r\n setApiToken(newToken);\r\n\r\n // 记录刷新成功日志\r\n handleHttpLog(config, 'INFO', {\r\n name: 'refreshToken',\r\n url: `${config.baseUrl}/auth/v1/refresh`,\r\n method: 'POST',\r\n response: res.data,\r\n status: res.status\r\n } satisfies ApiStructuredHttpLog);\r\n\r\n return newToken;\r\n}\r\n\r\n/**\r\n * 创建HTTP客户端实例\r\n * @export\r\n * @param {ApiClientConfig} config - Api客户端配置\r\n * @returns {AxiosInstance} 配置好的Axios实例\r\n */\r\nexport function createHttpClient(config: ApiClientConfig): AxiosInstance {\r\n // 创建Axios实例,设置基础URL\r\n const instance = axios.create({\r\n baseURL: config.baseUrl\r\n });\r\n\r\n // 请求拦截器:处理请求前的准备工作\r\n instance.interceptors.request.use(async (cfg: InternalAxiosRequestConfig) => {\r\n const c = cfg as ApiInternalConfig;\r\n \r\n // 如果正在刷新令牌且当前请求不是刷新请求,等待刷新完成\r\n if (isRefreshing && refreshPromise && !isRefreshRequest(c)) {\r\n await refreshPromise;\r\n }\r\n\r\n // 设置请求元数据,记录开始时间\r\n c.metadata = { startTime: Date.now(), apiName: c.metadata?.apiName };\r\n\r\n // 记录请求开始(DEBUG级别)\r\n handleHttpLog(config, 'DEBUG', {\r\n name: c.metadata?.apiName || 'request',\r\n url: `${config.baseUrl}${c.url || ''}`,\r\n method: c.method || '',\r\n headers: c.headers,\r\n request: c.data || c.params\r\n } satisfies ApiStructuredHttpLog);\r\n\r\n // 生成请求签名所需的时间戳和随机数\r\n const timestamp = Date.now();\r\n const nonce = randomNonce(32);\r\n\r\n // 设置请求头:时间戳、随机数\r\n setHeader(c, 'X-Timestamp', timestamp);\r\n setHeader(c, 'X-Nonce', nonce);\r\n\r\n // 如果有令牌,设置Authorization头\r\n const token = getApiToken();\r\n if (token) setHeader(c, 'Authorization', token);\r\n\r\n // 解析URL路径和查询参数\r\n const rawUrl = c.url ?? '';\r\n const uri = rawUrl.split('?')[0];\r\n\r\n // 合并URL中的查询参数和配置中的params\r\n const paramsFromUrl = parseQueryFromUrl(rawUrl);\r\n const mergedQuery = {\r\n ...paramsFromUrl,\r\n ...((c.params ?? {}) as Record<string, unknown>)\r\n };\r\n\r\n // 生成请求签名(TRACE级别)\r\n handleHttpLog(config, 'TRACE', {\r\n name: c.metadata?.apiName || 'generate-sign',\r\n message: '开始生成请求签名',\r\n url: `${config.baseUrl}${c.url || ''}`,\r\n method: c.method || '',\r\n request: {\r\n timestamp,\r\n nonce,\r\n uri,\r\n query: mergedQuery,\r\n method: c.method || 'GET'\r\n }\r\n } satisfies ApiStructuredHttpLog);\r\n \r\n // 生成请求签名\r\n const { sign } = generateSign({\r\n uri,\r\n timestamp,\r\n nonce,\r\n query: mergedQuery,\r\n body: c.data,\r\n secret: config.secret,\r\n salt: config.salt\r\n });\r\n\r\n // 设置签名头\r\n setHeader(c, 'X-Sign', sign);\r\n \r\n // 签名生成完成(TRACE级别)\r\n handleHttpLog(config, 'TRACE', {\r\n name: c.metadata?.apiName || 'generate-sign',\r\n message: '请求签名生成完成',\r\n url: `${config.baseUrl}${c.url || ''}`,\r\n method: c.method || ''\r\n } satisfies ApiStructuredHttpLog);\r\n\r\n return c;\r\n });\r\n\r\n // 响应拦截器:处理响应和错误\r\n instance.interceptors.response.use(\r\n // 成功响应处理\r\n async (resp: AxiosResponse) => {\r\n const cfg = resp.config as ApiInternalConfig;\r\n // 计算请求耗时\r\n const durationMs = cfg.metadata ? Date.now() - cfg.metadata.startTime : undefined;\r\n\r\n const apiName = cfg.metadata?.apiName ?? 'request';\r\n const data = resp.data as ApiApiResponse<unknown>;\r\n \r\n // 如果响应是业务响应格式(包含code字段)\r\n if (typeof data === 'object' && data && 'code' in data) {\r\n // 检查是否需要模拟401错误(用于测试)\r\n const shouldSimulateAuth = \r\n (state.simulate401Remaining ?? 0) > 0 &&\r\n !cfg._retry &&\r\n !isRefreshRequest(cfg);\r\n\r\n if (shouldSimulateAuth) {\r\n // 减少模拟401剩余次数\r\n state.simulate401Remaining = (state.simulate401Remaining ?? 1) - 1;\r\n }\r\n\r\n // 获取标准化的响应数据(可能被模拟为401)\r\n const normalizedData = (shouldSimulateAuth ? { ...data, code: 401 } : data) as ApiApiResponse<unknown>;\r\n \r\n // 构建日志对象\r\n const httpLog: ApiStructuredHttpLog = {\r\n name: apiName,\r\n url: `${config.baseUrl}${cfg.url ?? ''}`,\r\n method: cfg.method,\r\n headers: cfg.headers,\r\n request: cfg.data ?? cfg.params,\r\n response: shouldSimulateAuth ? normalizedData : resp.data,\r\n durationMs,\r\n status: resp.status\r\n };\r\n\r\n // 如果是401或403错误且不是重试请求,刷新令牌并重新请求\r\n if ((normalizedData.code === 401 || normalizedData.code === 403) && !cfg._retry && !isRefreshRequest(cfg)) {\r\n handleHttpLog(config, 'WARN', httpLog);\r\n return await refreshAndReplay(instance, config, cfg);\r\n }\r\n\r\n // 如果业务响应码不是200,抛出业务错误\r\n if (normalizedData.code !== 200) {\r\n const errorLevel = resolveErrorLevel(normalizedData.sub_code) as ErrorLevel;\r\n const module = resolveFunctionModule(normalizedData.sub_code) as FunctionModule;\r\n \r\n const e = new ApiError({\r\n message: resolveBusinessMessage(config, normalizedData),\r\n type: normalizedData.code === 401 || normalizedData.code === 403 ? 'auth' : 'business',\r\n httpStatus: resp.status,\r\n code: normalizedData.code,\r\n subCode: normalizedData.sub_code,\r\n subMsg: normalizedData.sub_msg,\r\n errorLevel,\r\n module,\r\n raw: {\r\n ...normalizedData,\r\n url: `${config.baseUrl}${cfg.url ?? ''}`,\r\n method: cfg.method,\r\n headers: cfg.headers,\r\n request: cfg.data ?? cfg.params,\r\n durationMs: cfg.metadata ? Date.now() - cfg.metadata.startTime : undefined\r\n }\r\n });\r\n notifyError(config, e);\r\n throw e;\r\n }\r\n\r\n // 记录成功日志\r\n handleHttpLog(config, 'INFO', httpLog);\r\n }\r\n\r\n return resp;\r\n },\r\n // 错误响应处理\r\n async (error: unknown) => {\r\n // 如果已经是ApiError,直接通知并抛出\r\n if (error instanceof ApiError) {\r\n notifyError(config, error);\r\n throw error;\r\n }\r\n\r\n // 转换为AxiosError类型\r\n const axiosErr = error as AxiosError;\r\n const cfg = (axiosErr.config ?? {}) as ApiInternalConfig;\r\n const status = axiosErr.response?.status;\r\n const url = `${config.baseUrl}${cfg.url ?? ''}`;\r\n const method = cfg.method ?? '';\r\n const request = cfg.data ?? cfg.params;\r\n const response = axiosErr.response?.data;\r\n // 计算请求耗时\r\n const durationMs = cfg.metadata ? Date.now() - cfg.metadata.startTime : undefined;\r\n const apiName = cfg.metadata?.apiName ?? 'request';\r\n\r\n // 构建错误日志对象\r\n const httpLog: ApiStructuredHttpLog = {\r\n name: apiName,\r\n url,\r\n method,\r\n headers: cfg.headers,\r\n request,\r\n response,\r\n durationMs,\r\n status: status || 0\r\n };\r\n // 记录错误日志\r\n handleHttpLog(config, 'ERROR', httpLog);\r\n\r\n // 如果是401或403错误且不是重试请求,刷新令牌并重新请求\r\n if ((status === 401 || status === 403) && !cfg._retry && !isRefreshRequest(cfg)) {\r\n return await refreshAndReplay(instance, config, cfg);\r\n }\r\n\r\n // 根据错误类型构建ApiError\r\n if (axiosErr.response) {\r\n // 服务器返回错误响应\r\n const httpStatusText = resolveHttpStatus(status);\r\n let message = `${httpStatusText}(${status})`;\r\n \r\n // 尝试解析响应体中的业务错误信息\r\n let subCode: number | undefined;\r\n let subMsg: string | undefined;\r\n let errorLevel: ErrorLevel | undefined;\r\n let module: FunctionModule | undefined;\r\n \r\n if (axiosErr.response.data && typeof axiosErr.response.data === 'object') {\r\n const data = axiosErr.response.data as ApiApiResponse<unknown>;\r\n subCode = data.sub_code;\r\n subMsg = data.sub_msg || data.msg || data.message;\r\n \r\n if (subCode) {\r\n errorLevel = resolveErrorLevel(subCode) as ErrorLevel;\r\n module = resolveFunctionModule(subCode) as FunctionModule;\r\n const businessMsg = resolveBusinessError(subCode);\r\n message = businessMsg;\r\n }\r\n }\r\n \r\n const e = new ApiError({\r\n message,\r\n type: status === 401 || status === 403 ? 'auth' : 'server',\r\n httpStatus: status,\r\n subCode,\r\n subMsg,\r\n errorLevel,\r\n module,\r\n raw: axiosErr.response.data\r\n });\r\n notifyError(config, e);\r\n throw e;\r\n }\r\n\r\n if (axiosErr.request) {\r\n // 请求已发送但未收到响应(网络错误)\r\n const e = new ApiError({ \r\n message: '网络错误', \r\n type: 'network', \r\n errorLevel: ErrorLevel.NETWORK as ErrorLevel,\r\n raw: axiosErr.toJSON?.() \r\n });\r\n notifyError(config, e);\r\n throw e;\r\n }\r\n\r\n // 请求配置错误\r\n const e = new ApiError({ \r\n message: axiosErr.message || '未知错误', \r\n type: 'unknown', \r\n raw: axiosErr.toJSON?.() \r\n });\r\n notifyError(config, e);\r\n throw e;\r\n }\r\n );\r\n\r\n return instance;\r\n}\r\n\r\n/**\r\n * 初始化Api客户端\r\n * @export\r\n * @param {ApiClientConfig} config - Api客户端配置\r\n */\r\nexport function initApiClient(config: ApiClientConfig): void {\r\n // 保存配置到全局状态\r\n state.config = config;\r\n // 创建并保存HTTP客户端实例\r\n state.axios = createHttpClient(config);\r\n}\r\n\r\n/**\r\n * 获取已初始化的HTTP客户端实例\r\n * @export\r\n * @returns {AxiosInstance} Axios实例\r\n * @throws {ApiError} 当Api客户端未初始化时抛出错误\r\n */\r\nexport function getHttpClient(): AxiosInstance {\r\n // 检查客户端是否已初始化\r\n if (!state.axios) {\r\n const error = new ApiError({ message: 'Api Client 未初始化,请先调用 initApiClient', type: 'unknown' });\r\n // 记录错误日志\r\n handleHttpLog({\r\n baseUrl: window.location.origin,\r\n secret: 'undefined',\r\n salt: 'undefined',\r\n debug: true,\r\n logLevel: 'ERROR',\r\n }, 'ERROR', {\r\n name: 'getHttpClient',\r\n response: {\r\n code: null,\r\n message: error.message,\r\n error: error.type\r\n },\r\n } satisfies ApiStructuredHttpLog);\r\n throw error;\r\n }\r\n return state.axios;\r\n}\r\n\r\n/**\r\n * 发送API请求并返回数据\r\n * @export\r\n * @template TData - 响应数据类型\r\n * @param {AxiosRequestConfig} cfg - Axios请求配置\r\n * @param {string} [apiName] - API名称,用于日志记录\r\n * @returns {Promise<TData>} 响应数据\r\n */\r\nexport async function requestData<TData>(\r\n cfg: AxiosRequestConfig,\r\n apiName?: string\r\n): Promise<TData> {\r\n // 获取HTTP客户端实例\r\n const instance = getHttpClient();\r\n const c = cfg as ApiInternalConfig;\r\n // 设置请求元数据,包括API名称\r\n c.metadata = { ...(c.metadata ?? { startTime: Date.now() }), apiName };\r\n\r\n // 发送请求\r\n const resp = await instance.request<ApiApiResponse<TData>>(c);\r\n const data = resp.data as ApiApiResponse<TData>;\r\n // 提取并返回业务数据,默认返回空对象\r\n return (data?.data as TData) ?? ({} as TData);\r\n}\r\n\r\n\r\n","import { requestData } from '../../client/http';\r\nimport { LoginRequest, LoginResponse, RefreshTokenRequest, RefreshTokenResponse, LogoutRequest, LogoutResponse } from '../../types/v1/auth';\r\n\r\n/**\r\n * 用户登录\r\n * @param req - 登录请求参数\r\n * @returns 登录响应结果\r\n */\r\nexport const loginApi: (req: Partial<LoginRequest>) => Promise<LoginResponse> = async (req) => {\r\n return requestData<LoginResponse>({\r\n url: '/auth/v1/login',\r\n method: 'POST',\r\n data: req\r\n }, 'login');\r\n};\r\n\r\n/**\r\n * 刷新令牌\r\n * @param req - 刷新令牌请求参数\r\n * @returns 刷新令牌响应结果\r\n */\r\nexport const refreshTokenApi: (req: Partial<RefreshTokenRequest>) => Promise<RefreshTokenResponse> = async (req) => {\r\n return requestData<RefreshTokenResponse>({\r\n url: '/auth/v1/refresh',\r\n method: 'POST',\r\n data: req\r\n }, 'refreshToken');\r\n};\r\n\r\n/**\r\n * 用户登出\r\n * @param req - 登出请求参数\r\n * @returns 登出响应结果\r\n */\r\nexport const logoutApi: (req: Partial<LogoutRequest>) => Promise<LogoutResponse> = async (req) => {\r\n return requestData<LogoutResponse>({\r\n url: '/auth/v1/logout',\r\n method: 'POST',\r\n data: req\r\n }, 'logout');\r\n};\r\n","import { requestData } from '../../client/http';\r\nimport { \r\n AirlineAddRequest, \r\n AirlineAddResponse, \r\n AirlineListRequest, \r\n AirlineListResponse, \r\n AirlineQueryRequest, \r\n AirlineQueryResponse, \r\n AirlineUpdateRequest, \r\n AirlineUpdateResponse \r\n} from '../../types/v1/airline';\r\n\r\n/**\r\n * 添加航线信息\r\n * @param req - 航线添加请求参数\r\n * @returns 航线添加响应结果\r\n */\r\nexport const airlineAddApi: (req: Partial<AirlineAddRequest>) => Promise<AirlineAddResponse> = async (req) => {\r\n return requestData<AirlineAddResponse>({\r\n url: '/api/v1/airline/add',\r\n method: 'POST',\r\n data: req\r\n }, 'airlineAdd');\r\n};\r\n\r\n/**\r\n * 获取航线列表\r\n * @param req - 航线列表请求参数\r\n * @returns 航线列表响应结果\r\n */\r\nexport const airlineListApi: (req: Partial<AirlineListRequest>) => Promise<AirlineListResponse> = async (req) => {\r\n return requestData<AirlineListResponse>({\r\n url: '/api/v1/airline/list',\r\n method: 'POST',\r\n data: req\r\n }, 'airlineList');\r\n};\r\n\r\n/**\r\n * 查询航线详情\r\n * @param req - 航线查询请求参数\r\n * @returns 航线查询响应结果\r\n */\r\nexport const airlineQueryApi: (req: Partial<AirlineQueryRequest>) => Promise<AirlineQueryResponse> = async (req) => {\r\n return requestData<AirlineQueryResponse>({\r\n url: '/api/v1/airline/query',\r\n method: 'POST',\r\n data: req\r\n }, 'airlineQuery');\r\n};\r\n\r\n/**\r\n * 更新航线信息\r\n * @param req - 航线更新请求参数\r\n * @returns 航线更新响应结果\r\n */\r\nexport const airlineUpdateApi: (req: Partial<AirlineUpdateRequest>) => Promise<AirlineUpdateResponse> = async (req) => {\r\n return requestData<AirlineUpdateResponse>({\r\n url: '/api/v1/airline/update',\r\n method: 'POST',\r\n data: req\r\n }, 'airlineUpdate');\r\n};\r\n","import { requestData } from '../../client/http';\nimport { \n FenceAddRequest, \n FenceAddResponse, \n FenceListRequest, \n FenceListResponse, \n FenceQueryRequest, \n FenceQueryResponse, \n FenceUpdateRequest, \n FenceUpdateResponse \n} from '../../types/v1/fence';\n\n/**\n * 添加电子围栏\n * @param req - 电子围栏添加请求参数\n * @returns 电子围栏添加响应结果\n */\nexport const fenceAddApi: (req: Partial<FenceAddRequest>) => Promise<FenceAddResponse> = async (req) => {\n return requestData<FenceAddResponse>({\n url: '/api/v1/fence/add',\n method: 'POST',\n data: req\n }, 'fenceAdd');\n};\n\n/**\n * 获取电子围栏列表\n * @param req - 电子围栏列表请求参数\n * @returns 电子围栏列表响应结果\n */\nexport const fenceListApi: (req: Partial<FenceListRequest>) => Promise<FenceListResponse> = async (req) => {\n return requestData<FenceListResponse>({\n url: '/api/v1/fence/list',\n method: 'POST',\n data: req\n }, 'fenceList');\n};\n\n/**\n * 查询电子围栏详情\n * @param req - 电子围栏查询请求参数\n * @returns 电子围栏查询响应结果\n */\nexport const fenceQueryApi: (req: Partial<FenceQueryRequest>) => Promise<FenceQueryResponse> = async (req) => {\n return requestData<FenceQueryResponse>({\n url: '/api/v1/fence/query',\n method: 'POST',\n data: req\n }, 'fenceQuery');\n};\n\n/**\n * 更新电子围栏\n * @param req - 电子围栏更新请求参数\n * @returns 电子围栏更新响应结果\n */\nexport const fenceUpdateApi: (req: Partial<FenceUpdateRequest>) => Promise<FenceUpdateResponse> = async (req) => {\n return requestData<FenceUpdateResponse>({\n url: '/api/v1/fence/update',\n method: 'POST',\n data: req\n }, 'fenceUpdate');\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "test-api-client",
3
+ "version": "0.0.1",
4
+ "description": "api平台HTTP API客户端SDK,提供请求封装、签名验证、日志记录和错误处理等核心功能",
5
+ "license": "MIT",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "require": "./dist/index.js",
13
+ "import": "./dist/index.mjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "sideEffects": false,
20
+ "scripts": {
21
+ "build": "tsup",
22
+ "typecheck": "tsc -p tsconfig.json --noEmit",
23
+ "lint": "eslint .",
24
+ "prepublishOnly": "npm run build && npm run typecheck && npm run lint"
25
+ },
26
+ "dependencies": {
27
+ "axios": "^1.6.7",
28
+ "crypto-js": "^4.2.0"
29
+ },
30
+ "devDependencies": {
31
+ "@eslint/js": "^9.3.0",
32
+ "@types/crypto-js": "^4.2.2",
33
+ "@types/node": "^20.11.30",
34
+ "eslint": "^9.3.0",
35
+ "typescript": "^5.4.5",
36
+ "tsup": "^8.0.2",
37
+ "typescript-eslint": "^8.0.0"
38
+ }
39
+ }