@quantabit/sdk-config 1.0.5 → 1.0.6
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.
- package/README.md +2 -2
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +15 -14
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @quantabit/sdk-config
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
QuantaBit SDK 统一配置管理模块。所有 SDK 共享此配置,**修改一处即可全局生效**。
|
|
4
4
|
|
|
5
5
|
## 功能特性
|
|
6
6
|
|
|
@@ -146,7 +146,7 @@ initWithEnvironment("production", {
|
|
|
146
146
|
|
|
147
147
|
## 与其他 SDK 集成
|
|
148
148
|
|
|
149
|
-
所有
|
|
149
|
+
所有 QuantaBit SDK 都应从此包读取配置:
|
|
150
150
|
|
|
151
151
|
```javascript
|
|
152
152
|
// 在 auth-sdk、wallet-sdk 等中
|
package/dist/index.esm.js
CHANGED
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/BaseApiClient.js","../src/index.js"],"sourcesContent":["/**\n * @quantabit/sdk-config - BaseApiClient\n * \n * SDK API 客户端基类\n * 封装所有通用的配置、请求、Token 管理逻辑\n * \n * 使用方式:\n * ```javascript\n * import { BaseApiClient } from '@quantabit/sdk-config';\n * \n * class MyApiClient extends BaseApiClient {\n * constructor(config = {}) {\n * super('/my-module', config); // 只需传入模块路径\n * }\n * \n * // 专注于业务方法\n * async getList() {\n * return this.request('/list');\n * }\n * }\n * ```\n */\n\nimport {\n getConfig,\n subscribeConfig,\n getToken as getStoredToken,\n logger,\n} from './index.js';\n\n/**\n * SDK API 客户端基类\n * 所有 SDK 的 API 客户端都应继承此类\n */\nexport class BaseApiClient {\n /**\n * 构造函数\n * @param {string} modulePath - 模块路径,如 '/auth', '/points', '/wallet'\n * @param {Object} config - 配置选项\n * @param {string} config.baseUrl - 自定义基础 URL(覆盖全局配置)\n * @param {number} config.timeout - 自定义超时时间(毫秒)\n * @param {Function} config.onError - 错误回调\n * @param {Function} config.getLanguage - 获取语言的函数\n */\n constructor(modulePath = '', config = {}) {\n this.modulePath = modulePath;\n this._customBaseUrl = config.baseUrl;\n this._customTimeout = config.timeout;\n this.token = null;\n this.onError = config.onError;\n this.getLanguage = config.getLanguage || (() => 'zh');\n \n // 从全局配置初始化\n this._updateFromGlobalConfig(getConfig());\n \n // 订阅配置变更\n this._unsubscribe = subscribeConfig((newConfig) => {\n this._updateFromGlobalConfig(newConfig);\n });\n }\n\n /**\n * 从全局配置更新本地配置\n * @private\n */\n _updateFromGlobalConfig(globalConfig) {\n // 只有未自定义时才使用全局配置\n if (!this._customBaseUrl) {\n this.baseUrl = `${globalConfig.apiBaseUrl}${this.modulePath}`;\n } else {\n this.baseUrl = this._customBaseUrl;\n }\n \n if (!this._customTimeout) {\n this.timeout = globalConfig.timeout || 30000;\n } else {\n this.timeout = this._customTimeout;\n }\n }\n\n /**\n * 设置 Token\n * @param {string} token - 访问令牌\n */\n setToken(token) {\n this.token = token;\n }\n\n /**\n * 设置基础 URL\n * @param {string} url - 新的基础 URL\n */\n setBaseUrl(url) {\n this._customBaseUrl = url;\n this.baseUrl = url;\n }\n\n /**\n * 获取当前使用的 Token\n * 优先使用实例 Token,否则从存储获取\n * @returns {string|null}\n */\n getToken() {\n return this.token || getStoredToken();\n }\n\n /**\n * 发送 HTTP 请求\n * @param {string} endpoint - API 端点(相对于 baseUrl)\n * @param {Object} options - fetch 选项\n * @returns {Promise<any>} 响应数据\n */\n async request(endpoint, options = {}) {\n const url = `${this.baseUrl}${endpoint}`;\n \n // 构建请求头\n const headers = {\n 'Content-Type': 'application/json',\n 'Accept-Language': this.getLanguage(),\n ...options.headers,\n };\n \n // 添加认证头\n const token = this.getToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n // 超时控制\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n \n clearTimeout(timeoutId);\n \n // 解析响应\n const data = await response.json();\n \n // 处理错误响应\n if (!response.ok) {\n const error = new Error(data.message || data.detail || `HTTP ${response.status}`);\n error.code = data.code || `HTTP_${response.status}`;\n error.status = response.status;\n error.data = data;\n \n this.onError?.(error);\n logger.error(`${this.constructor.name} Error:`, error.message);\n throw error;\n }\n \n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n \n // 处理超时错误\n if (error.name === 'AbortError') {\n const timeoutError = new Error('Request timeout');\n timeoutError.code = 'TIMEOUT';\n this.onError?.(timeoutError);\n throw timeoutError;\n }\n \n // 处理网络错误\n if (error.name === 'TypeError' && error.message.includes('fetch')) {\n const networkError = new Error('Network error');\n networkError.code = 'NETWORK_ERROR';\n this.onError?.(networkError);\n throw networkError;\n }\n \n throw error;\n }\n }\n\n /**\n * GET 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} params - 查询参数\n */\n async get(endpoint, params = {}) {\n const query = new URLSearchParams(params).toString();\n const url = query ? `${endpoint}?${query}` : endpoint;\n return this.request(url, { method: 'GET' });\n }\n\n /**\n * POST 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async post(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * PUT 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async put(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * DELETE 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据(可选)\n */\n async delete(endpoint, data = null) {\n const options = { method: 'DELETE' };\n if (data) {\n options.body = JSON.stringify(data);\n }\n return this.request(endpoint, options);\n }\n\n /**\n * PATCH 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async patch(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * 销毁实例,取消配置订阅\n */\n destroy() {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n }\n}\n\n/**\n * 创建 API 客户端的工厂函数\n * 用于快速创建简单的 API 客户端\n * \n * @param {string} modulePath - 模块路径\n * @param {Object} methods - 方法定义对象\n * @returns {BaseApiClient} API 客户端实例\n * \n * @example\n * const myApi = createApiClient('/my-module', {\n * getList: (client) => client.get('/list'),\n * create: (client, data) => client.post('/', data),\n * });\n */\nexport function createApiClient(modulePath, methods = {}) {\n const client = new BaseApiClient(modulePath);\n \n // 绑定自定义方法\n Object.entries(methods).forEach(([name, fn]) => {\n client[name] = (...args) => fn(client, ...args);\n });\n \n return client;\n}\n\nexport default BaseApiClient;\n","/**\n * @quantabit/sdk-config\n * \n * Qbit_DID SDK 统一配置管理\n * \n * 所有 SDK 共享此配置,修改一处即可全局生效:\n * - API 基础 URL\n * - 超时时间\n * - 认证配置\n * - 调试模式\n * \n * 使用方式:\n * 1. 直接使用默认配置\n * import { getConfig } from '@quantabit/sdk-config';\n * const config = getConfig();\n * \n * 2. 应用启动时初始化配置\n * import { initConfig } from '@quantabit/sdk-config';\n * initConfig({ apiBaseUrl: 'https://api.example.com' });\n * \n * 3. 使用 React Hook\n * import { useSDKConfig } from '@quantabit/sdk-config';\n * const { config, setApiBaseUrl } = useSDKConfig();\n */\n\n// ============ 默认配置 ============\n\n/**\n * 默认 API 配置\n * 注意:生产环境应通过 initConfig 覆盖这些值\n */\nconst DEFAULT_CONFIG = {\n // === API 配置 ===\n apiBaseUrl: '/api/v1', // API 基础路径(相对路径,由后端代理)\n apiFullUrl: '', // 完整 API URL(需通过 initConfig 配置)\n \n // === 超时配置 ===\n timeout: 30000, // 请求超时(毫秒)\n retryCount: 3, // 重试次数\n retryDelay: 1000, // 重试延迟(毫秒)\n \n // === 认证配置 ===\n tokenStorageKey: 'qbit_did_access_token',\n refreshTokenStorageKey: 'qbit_did_refresh_token',\n currentSessionKey: 'qbit_did_current',\n autoRefreshToken: true, // 自动刷新 Token\n \n // === WebSocket 配置 ===\n wsBaseUrl: '', // WebSocket URL(需通过 initConfig 配置)\n wsReconnect: true,\n wsReconnectInterval: 3000,\n \n // === 调试配置 ===\n debug: process.env.NODE_ENV !== 'production',\n logLevel: 'info', // 'debug' | 'info' | 'warn' | 'error'\n \n // === 环境配置 ===\n environment: process.env.NODE_ENV || 'development',\n \n // === 语言配置 ===\n language: 'zh', // 默认语言\n fallbackLanguage: 'en', // 回退语言\n supportedLanguages: ['zh', 'en', 'ja', 'ko'], // 支持的语言\n languageStorageKey: 'qbit_did_language', // localStorage key\n};\n\n// ============ 配置状态 ============\n\nlet _config = { ...DEFAULT_CONFIG };\nlet _listeners = new Set();\nlet _languageListeners = new Set(); // 语言变更监听器\n\n// ============ 核心函数 ============\n\n/**\n * 获取当前配置\n * @returns {object} 当前配置对象\n */\nexport function getConfig() {\n return { ..._config };\n}\n\n/**\n * 初始化 SDK 配置\n * 应在应用启动时调用一次\n * \n * @param {object} options - 配置选项\n * @param {string} options.apiBaseUrl - API 基础 URL(如 '/api/v1' 或完整 URL)\n * @param {number} options.timeout - 请求超时时间(毫秒)\n * @param {boolean} options.debug - 是否开启调试模式\n * @param {string} options.environment - 环境标识\n */\nexport function initConfig(options = {}) {\n _config = {\n ..._config,\n ...options,\n };\n \n // 如果提供了完整 URL,同时更新 apiFullUrl\n if (options.apiBaseUrl && options.apiBaseUrl.startsWith('http')) {\n _config.apiFullUrl = options.apiBaseUrl;\n // 对于完整 URL,apiBaseUrl 保持原样\n }\n \n // 通知所有监听者\n _notifyListeners();\n \n if (_config.debug) {\n console.log('[SDK Config] 配置已初始化:', _config);\n }\n \n return _config;\n}\n\n/**\n * 设置 API 基础 URL\n * 便捷方法,用于动态切换 API 地址\n * \n * @param {string} url - 新的 API URL\n */\nexport function setApiBaseUrl(url) {\n _config.apiBaseUrl = url;\n if (url.startsWith('http')) {\n _config.apiFullUrl = url;\n }\n _notifyListeners();\n \n if (_config.debug) {\n console.log('[SDK Config] API URL 已更新:', url);\n }\n}\n\n/**\n * 设置 WebSocket URL\n * \n * @param {string} url - 新的 WebSocket URL\n */\nexport function setWsBaseUrl(url) {\n _config.wsBaseUrl = url;\n _notifyListeners();\n}\n\n/**\n * 设置调试模式\n * \n * @param {boolean} debug - 是否开启调试\n */\nexport function setDebug(debug) {\n _config.debug = debug;\n _notifyListeners();\n}\n\n/**\n * 重置为默认配置\n */\nexport function resetConfig() {\n _config = { ...DEFAULT_CONFIG };\n _notifyListeners();\n}\n\n// ============ 配置监听 ============\n\n/**\n * 订阅配置变更\n * \n * @param {function} listener - 监听回调\n * @returns {function} 取消订阅函数\n */\nexport function subscribeConfig(listener) {\n _listeners.add(listener);\n return () => _listeners.delete(listener);\n}\n\nfunction _notifyListeners() {\n const config = getConfig();\n _listeners.forEach(listener => {\n try {\n listener(config);\n } catch (err) {\n console.error('[SDK Config] 监听器执行错误:', err);\n }\n });\n}\n\n// ============ 环境预设 ============\n\n/**\n * 环境预设配置\n * 快速切换不同环境的配置\n */\nexport const ENVIRONMENT_PRESETS = {\n development: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: 'http://localhost:3000/api/v1',\n wsBaseUrl: 'ws://localhost:3000/ws',\n debug: true,\n logLevel: 'debug',\n },\n staging: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: '', // 请通过 initWithEnvironment('staging', { apiFullUrl: '...' }) 配置\n wsBaseUrl: '', // 请通过 initWithEnvironment('staging', { wsBaseUrl: '...' }) 配置\n debug: true,\n logLevel: 'info',\n },\n production: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: '', // 请通过 initWithEnvironment('production', { apiFullUrl: '...' }) 配置\n wsBaseUrl: '', // 请通过 initWithEnvironment('production', { wsBaseUrl: '...' }) 配置\n debug: false,\n logLevel: 'error',\n },\n};\n\n/**\n * 使用环境预设初始化配置\n * \n * @param {string} env - 环境名称 ('development' | 'staging' | 'production')\n * @param {object} overrides - 额外覆盖配置\n */\nexport function initWithEnvironment(env, overrides = {}) {\n const preset = ENVIRONMENT_PRESETS[env];\n if (!preset) {\n console.warn(`[SDK Config] 未知环境: ${env}, 使用默认配置`);\n return initConfig(overrides);\n }\n \n return initConfig({\n ...preset,\n environment: env,\n ...overrides,\n });\n}\n\n// ============ React Hook ============\n\nimport { useState, useEffect, useCallback } from 'react';\n\n/**\n * React Hook: 获取和管理 SDK 配置\n * \n * @example\n * const { config, setApiBaseUrl, initConfig } = useSDKConfig();\n * \n * // 读取配置\n * console.log(config.apiBaseUrl);\n * \n * // 动态修改 API URL\n * setApiBaseUrl('https://new-api.example.com');\n */\nexport function useSDKConfig() {\n const [config, setConfigState] = useState(getConfig);\n \n useEffect(() => {\n const unsubscribe = subscribeConfig(setConfigState);\n return unsubscribe;\n }, []);\n \n const updateConfig = useCallback((options) => {\n initConfig(options);\n }, []);\n \n const updateApiUrl = useCallback((url) => {\n setApiBaseUrl(url);\n }, []);\n \n const updateWsUrl = useCallback((url) => {\n setWsBaseUrl(url);\n }, []);\n \n const reset = useCallback(() => {\n resetConfig();\n }, []);\n \n return {\n config,\n initConfig: updateConfig,\n setApiBaseUrl: updateApiUrl,\n setWsBaseUrl: updateWsUrl,\n resetConfig: reset,\n initWithEnvironment,\n };\n}\n\n// ============ 请求工具 ============\n\n/**\n * 构建完整的 API URL\n * \n * @param {string} endpoint - API 端点(如 '/auth/login')\n * @param {boolean} useFullUrl - 是否使用完整 URL\n * @returns {string} 完整的 URL\n */\nexport function buildApiUrl(endpoint, useFullUrl = false) {\n const baseUrl = useFullUrl ? _config.apiFullUrl : _config.apiBaseUrl;\n // 确保不会出现双斜杠\n const cleanEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n const cleanBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n return `${cleanBase}${cleanEndpoint}`;\n}\n\n/**\n * 获取认证 Token\n * \n * @returns {string|null} Token 或 null\n */\nexport function getToken() {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(_config.tokenStorageKey);\n}\n\n/**\n * 获取刷新 Token\n * \n * @returns {string|null} Refresh Token 或 null\n */\nexport function getRefreshToken() {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(_config.refreshTokenStorageKey);\n}\n\n/**\n * 保存认证 Token\n * \n * @param {string} accessToken - Access Token\n * @param {string} refreshToken - Refresh Token(可选)\n */\nexport function saveTokens(accessToken, refreshToken) {\n if (typeof window === 'undefined') return;\n localStorage.setItem(_config.tokenStorageKey, accessToken);\n if (refreshToken) {\n localStorage.setItem(_config.refreshTokenStorageKey, refreshToken);\n }\n}\n\n/**\n * 清除所有 Token\n */\nexport function clearTokens() {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(_config.tokenStorageKey);\n localStorage.removeItem(_config.refreshTokenStorageKey);\n localStorage.removeItem(_config.currentSessionKey);\n}\n\n/**\n * 检查是否已认证\n * \n * @returns {boolean} 是否有有效 Token\n */\nexport function isAuthenticated() {\n return !!getToken();\n}\n\n// ============ 日志工具 ============\n\nconst LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };\n\n/**\n * SDK 日志工具\n * 根据配置的日志级别输出日志\n */\nexport const logger = {\n debug: (...args) => {\n if (_config.debug && LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.debug) {\n console.debug('[SDK]', ...args);\n }\n },\n info: (...args) => {\n if (_config.debug && LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.info) {\n console.info('[SDK]', ...args);\n }\n },\n warn: (...args) => {\n if (LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.warn) {\n console.warn('[SDK]', ...args);\n }\n },\n error: (...args) => {\n console.error('[SDK]', ...args);\n },\n};\n\n// ============ 语言管理 ============\n\n/**\n * 获取当前语言\n * 优先从 localStorage 读取,否则使用默认配置\n * \n * @returns {string} 当前语言代码\n */\nexport function getLanguage() {\n // SSR 安全检查\n if (typeof window === 'undefined') {\n return _config.language;\n }\n \n // 尝试从 localStorage 读取\n const stored = localStorage.getItem(_config.languageStorageKey);\n if (stored && _config.supportedLanguages.includes(stored)) {\n return stored;\n }\n \n // 尝试从浏览器获取\n const browserLang = navigator.language?.split('-')[0];\n if (browserLang && _config.supportedLanguages.includes(browserLang)) {\n return browserLang;\n }\n \n return _config.language;\n}\n\n/**\n * 设置全局语言\n * 会通知所有订阅的 SDK 和组件\n * \n * @param {string} lang - 语言代码 ('zh' | 'en' | 'ja' | 'ko')\n * @returns {boolean} 是否设置成功\n */\nexport function setLanguage(lang) {\n // 验证语言代码\n if (!_config.supportedLanguages.includes(lang)) {\n logger.warn(`不支持的语言: ${lang}, 支持的语言: ${_config.supportedLanguages.join(', ')}`);\n return false;\n }\n \n const previousLang = _config.language;\n _config.language = lang;\n \n // 持久化到 localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem(_config.languageStorageKey, lang);\n \n // 触发全局 CustomEvent,让不直接依赖此模块的 SDK 也能收到通知\n try {\n const event = new CustomEvent('qbit-did:language-change', {\n detail: { language: lang, oldLanguage: previousLang }\n });\n window.dispatchEvent(event);\n } catch (e) {\n // 忽略事件触发错误\n }\n }\n \n // 通知所有语言监听器\n _notifyLanguageListeners(lang, previousLang);\n \n if (_config.debug) {\n console.log(`[SDK Config] 语言已切换: ${previousLang} -> ${lang}`);\n }\n \n return true;\n}\n\n/**\n * 初始化语言(应用启动时调用)\n * 从 localStorage 或浏览器偏好读取\n */\nexport function initLanguage() {\n const detectedLang = getLanguage();\n _config.language = detectedLang;\n \n if (_config.debug) {\n console.log(`[SDK Config] 语言已初始化: ${detectedLang}`);\n }\n \n return detectedLang;\n}\n\n/**\n * 订阅语言变更\n * \n * @param {function} listener - 回调函数 (newLang, oldLang) => void\n * @returns {function} 取消订阅函数\n */\nexport function subscribeLanguage(listener) {\n _languageListeners.add(listener);\n return () => _languageListeners.delete(listener);\n}\n\nfunction _notifyLanguageListeners(newLang, oldLang) {\n _languageListeners.forEach(listener => {\n try {\n listener(newLang, oldLang);\n } catch (err) {\n console.error('[SDK Config] 语言监听器执行错误:', err);\n }\n });\n}\n\n/**\n * React Hook: 获取和管理语言\n * \n * @example\n * const { language, setLanguage, supportedLanguages } = useLanguage();\n * \n * // 切换语言\n * setLanguage('en');\n */\nexport function useLanguage() {\n const [language, setLangState] = useState(getLanguage);\n \n useEffect(() => {\n // 初始化语言\n const currentLang = getLanguage();\n setLangState(currentLang);\n \n // 订阅语言变更\n const unsubscribe = subscribeLanguage((newLang) => {\n setLangState(newLang);\n });\n \n return unsubscribe;\n }, []);\n \n const updateLanguage = useCallback((lang) => {\n setLanguage(lang);\n }, []);\n \n return {\n language,\n setLanguage: updateLanguage,\n supportedLanguages: _config.supportedLanguages,\n fallbackLanguage: _config.fallbackLanguage,\n };\n}\n\n// ============ 导出 BaseApiClient ============\n\nexport { BaseApiClient, createApiClient } from './BaseApiClient.js';\n\n// ============ 导出 ============\n\nexport default {\n getConfig,\n initConfig,\n setApiBaseUrl,\n setWsBaseUrl,\n setDebug,\n resetConfig,\n subscribeConfig,\n initWithEnvironment,\n ENVIRONMENT_PRESETS,\n buildApiUrl,\n getToken,\n getRefreshToken,\n saveTokens,\n clearTokens,\n isAuthenticated,\n logger,\n useSDKConfig,\n // 语言管理\n getLanguage,\n setLanguage,\n initLanguage,\n subscribeLanguage,\n useLanguage,\n};\n\n"],"names":["getStoredToken"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/BaseApiClient.js","../src/index.js"],"sourcesContent":["/**\n * @quantabit/sdk-config - BaseApiClient\n * \n * SDK API 客户端基类\n * 封装所有通用的配置、请求、Token 管理逻辑\n * \n * 使用方式:\n * ```javascript\n * import { BaseApiClient } from '@quantabit/sdk-config';\n * \n * class MyApiClient extends BaseApiClient {\n * constructor(config = {}) {\n * super('/my-module', config); // 只需传入模块路径\n * }\n * \n * // 专注于业务方法\n * async getList() {\n * return this.request('/list');\n * }\n * }\n * ```\n */\n\nimport {\n getConfig,\n subscribeConfig,\n getToken as getStoredToken,\n logger,\n} from './index.js';\n\n/**\n * SDK API 客户端基类\n * 所有 SDK 的 API 客户端都应继承此类\n */\nexport class BaseApiClient {\n /**\n * 构造函数\n * @param {string} modulePath - 模块路径,如 '/auth', '/points', '/wallet'\n * @param {Object} config - 配置选项\n * @param {string} config.baseUrl - 自定义基础 URL(覆盖全局配置)\n * @param {number} config.timeout - 自定义超时时间(毫秒)\n * @param {Function} config.onError - 错误回调\n * @param {Function} config.getLanguage - 获取语言的函数\n */\n constructor(modulePath = '', config = {}) {\n this.modulePath = modulePath;\n this._customBaseUrl = config.baseUrl;\n this._customTimeout = config.timeout;\n this.token = null;\n this.onError = config.onError;\n this.getLanguage = config.getLanguage || (() => 'zh');\n \n // 从全局配置初始化\n this._updateFromGlobalConfig(getConfig());\n \n // 订阅配置变更\n this._unsubscribe = subscribeConfig((newConfig) => {\n this._updateFromGlobalConfig(newConfig);\n });\n }\n\n /**\n * 从全局配置更新本地配置\n * @private\n */\n _updateFromGlobalConfig(globalConfig) {\n // 只有未自定义时才使用全局配置\n if (!this._customBaseUrl) {\n this.baseUrl = `${globalConfig.apiBaseUrl}${this.modulePath}`;\n } else {\n this.baseUrl = this._customBaseUrl;\n }\n \n if (!this._customTimeout) {\n this.timeout = globalConfig.timeout || 30000;\n } else {\n this.timeout = this._customTimeout;\n }\n }\n\n /**\n * 设置 Token\n * @param {string} token - 访问令牌\n */\n setToken(token) {\n this.token = token;\n }\n\n /**\n * 设置基础 URL\n * @param {string} url - 新的基础 URL\n */\n setBaseUrl(url) {\n this._customBaseUrl = url;\n this.baseUrl = url;\n }\n\n /**\n * 获取当前使用的 Token\n * 优先使用实例 Token,否则从存储获取\n * @returns {string|null}\n */\n getToken() {\n return this.token || getStoredToken();\n }\n\n /**\n * 发送 HTTP 请求\n * @param {string} endpoint - API 端点(相对于 baseUrl)\n * @param {Object} options - fetch 选项\n * @returns {Promise<any>} 响应数据\n */\n async request(endpoint, options = {}) {\n const url = `${this.baseUrl}${endpoint}`;\n \n // 构建请求头\n const headers = {\n 'Content-Type': 'application/json',\n 'Accept-Language': this.getLanguage(),\n ...options.headers,\n };\n \n // 添加认证头\n const token = this.getToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n // 超时控制\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n \n clearTimeout(timeoutId);\n \n // 解析响应\n const data = await response.json();\n \n // 处理错误响应\n if (!response.ok) {\n const error = new Error(data.message || data.detail || `HTTP ${response.status}`);\n error.code = data.code || `HTTP_${response.status}`;\n error.status = response.status;\n error.data = data;\n \n this.onError?.(error);\n logger.error(`${this.constructor.name} Error:`, error.message);\n throw error;\n }\n \n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n \n // 处理超时错误\n if (error.name === 'AbortError') {\n const timeoutError = new Error('Request timeout');\n timeoutError.code = 'TIMEOUT';\n this.onError?.(timeoutError);\n throw timeoutError;\n }\n \n // 处理网络错误\n if (error.name === 'TypeError' && error.message.includes('fetch')) {\n const networkError = new Error('Network error');\n networkError.code = 'NETWORK_ERROR';\n this.onError?.(networkError);\n throw networkError;\n }\n \n throw error;\n }\n }\n\n /**\n * GET 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} params - 查询参数\n */\n async get(endpoint, params = {}) {\n const query = new URLSearchParams(params).toString();\n const url = query ? `${endpoint}?${query}` : endpoint;\n return this.request(url, { method: 'GET' });\n }\n\n /**\n * POST 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async post(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * PUT 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async put(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * DELETE 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据(可选)\n */\n async delete(endpoint, data = null) {\n const options = { method: 'DELETE' };\n if (data) {\n options.body = JSON.stringify(data);\n }\n return this.request(endpoint, options);\n }\n\n /**\n * PATCH 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async patch(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * 销毁实例,取消配置订阅\n */\n destroy() {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n }\n}\n\n/**\n * 创建 API 客户端的工厂函数\n * 用于快速创建简单的 API 客户端\n * \n * @param {string} modulePath - 模块路径\n * @param {Object} methods - 方法定义对象\n * @returns {BaseApiClient} API 客户端实例\n * \n * @example\n * const myApi = createApiClient('/my-module', {\n * getList: (client) => client.get('/list'),\n * create: (client, data) => client.post('/', data),\n * });\n */\nexport function createApiClient(modulePath, methods = {}) {\n const client = new BaseApiClient(modulePath);\n \n // 绑定自定义方法\n Object.entries(methods).forEach(([name, fn]) => {\n client[name] = (...args) => fn(client, ...args);\n });\n \n return client;\n}\n\nexport default BaseApiClient;\n","/**\n * @quantabit/sdk-config\n * \n * QuantaBit SDK 统一配置管理\n * \n * 所有 SDK 共享此配置,修改一处即可全局生效:\n * - API 基础 URL\n * - 超时时间\n * - 认证配置\n * - 调试模式\n * \n * 使用方式:\n * 1. 直接使用默认配置\n * import { getConfig } from '@quantabit/sdk-config';\n * const config = getConfig();\n * \n * 2. 应用启动时初始化配置\n * import { initConfig } from '@quantabit/sdk-config';\n * initConfig({ apiBaseUrl: 'https://api.example.com' });\n * \n * 3. 使用 React Hook\n * import { useSDKConfig } from '@quantabit/sdk-config';\n * const { config, setApiBaseUrl } = useSDKConfig();\n */\n\n// ============ 默认配置 ============\n\n/**\n * 默认 API 配置\n * 注意:生产环境应通过 initConfig 覆盖这些值\n */\nconst DEFAULT_CONFIG = {\n // === API 配置 ===\n apiBaseUrl: '/api/v1', // API 基础路径(相对路径,由后端代理)\n apiFullUrl: '', // 完整 API URL(需通过 initConfig 配置)\n \n // === 超时配置 ===\n timeout: 30000, // 请求超时(毫秒)\n retryCount: 3, // 重试次数\n retryDelay: 1000, // 重试延迟(毫秒)\n \n // === 认证配置 ===\n tokenStorageKey: 'qbit_did_access_token',\n refreshTokenStorageKey: 'qbit_did_refresh_token',\n currentSessionKey: 'qbit_did_current',\n autoRefreshToken: true, // 自动刷新 Token\n \n // === WebSocket 配置 ===\n wsBaseUrl: '', // WebSocket URL(需通过 initConfig 配置)\n wsReconnect: true,\n wsReconnectInterval: 3000,\n \n // === 调试配置 ===\n debug: process.env.NODE_ENV !== 'production',\n logLevel: 'info', // 'debug' | 'info' | 'warn' | 'error'\n \n // === 环境配置 ===\n environment: process.env.NODE_ENV || 'development',\n \n // === 语言配置 ===\n language: 'zh', // 默认语言\n fallbackLanguage: 'en', // 回退语言\n supportedLanguages: ['zh', 'en', 'ja', 'ko'], // 支持的语言\n languageStorageKey: 'qbit_did_language', // localStorage key\n};\n\n// ============ 配置状态 ============\n\nlet _config = { ...DEFAULT_CONFIG };\nlet _listeners = new Set();\nlet _languageListeners = new Set(); // 语言变更监听器\n\n// ============ 核心函数 ============\n\n/**\n * 获取当前配置\n * @returns {object} 当前配置对象\n */\nexport function getConfig() {\n return { ..._config };\n}\n\n/**\n * 初始化 SDK 配置\n * 应在应用启动时调用一次\n * \n * @param {object} options - 配置选项\n * @param {string} options.apiBaseUrl - API 基础 URL(如 '/api/v1' 或完整 URL)\n * @param {number} options.timeout - 请求超时时间(毫秒)\n * @param {boolean} options.debug - 是否开启调试模式\n * @param {string} options.environment - 环境标识\n */\nexport function initConfig(options = {}) {\n _config = {\n ..._config,\n ...options,\n };\n \n // 如果提供了完整 URL,同时更新 apiFullUrl\n if (options.apiBaseUrl && options.apiBaseUrl.startsWith('http')) {\n _config.apiFullUrl = options.apiBaseUrl;\n // 对于完整 URL,apiBaseUrl 保持原样\n }\n \n // 通知所有监听者\n _notifyListeners();\n \n if (_config.debug) {\n console.log('[SDK Config] 配置已初始化:', _config);\n }\n \n return _config;\n}\n\n/**\n * 设置 API 基础 URL\n * 便捷方法,用于动态切换 API 地址\n * \n * @param {string} url - 新的 API URL\n */\nexport function setApiBaseUrl(url) {\n _config.apiBaseUrl = url;\n if (url.startsWith('http')) {\n _config.apiFullUrl = url;\n }\n _notifyListeners();\n \n if (_config.debug) {\n console.log('[SDK Config] API URL 已更新:', url);\n }\n}\n\n/**\n * 设置 WebSocket URL\n * \n * @param {string} url - 新的 WebSocket URL\n */\nexport function setWsBaseUrl(url) {\n _config.wsBaseUrl = url;\n _notifyListeners();\n}\n\n/**\n * 设置调试模式\n * \n * @param {boolean} debug - 是否开启调试\n */\nexport function setDebug(debug) {\n _config.debug = debug;\n _notifyListeners();\n}\n\n/**\n * 重置为默认配置\n */\nexport function resetConfig() {\n _config = { ...DEFAULT_CONFIG };\n _notifyListeners();\n}\n\n// ============ 配置监听 ============\n\n/**\n * 订阅配置变更\n * \n * @param {function} listener - 监听回调\n * @returns {function} 取消订阅函数\n */\nexport function subscribeConfig(listener) {\n _listeners.add(listener);\n return () => _listeners.delete(listener);\n}\n\nfunction _notifyListeners() {\n const config = getConfig();\n _listeners.forEach(listener => {\n try {\n listener(config);\n } catch (err) {\n console.error('[SDK Config] 监听器执行错误:', err);\n }\n });\n}\n\n// ============ 环境预设 ============\n\n/**\n * 环境预设配置\n * 快速切换不同环境的配置\n */\nexport const ENVIRONMENT_PRESETS = {\n development: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: 'http://localhost:3000/api/v1',\n wsBaseUrl: 'ws://localhost:3000/ws',\n debug: true,\n logLevel: 'debug',\n },\n staging: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: '', // 请通过 initWithEnvironment('staging', { apiFullUrl: '...' }) 配置\n wsBaseUrl: '', // 请通过 initWithEnvironment('staging', { wsBaseUrl: '...' }) 配置\n debug: true,\n logLevel: 'info',\n },\n production: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: '', // 请通过 initWithEnvironment('production', { apiFullUrl: '...' }) 配置\n wsBaseUrl: '', // 请通过 initWithEnvironment('production', { wsBaseUrl: '...' }) 配置\n debug: false,\n logLevel: 'error',\n },\n};\n\n/**\n * 使用环境预设初始化配置\n * \n * @param {string} env - 环境名称 ('development' | 'staging' | 'production')\n * @param {object} overrides - 额外覆盖配置\n */\nexport function initWithEnvironment(env, overrides = {}) {\n const preset = ENVIRONMENT_PRESETS[env];\n if (!preset) {\n console.warn(`[SDK Config] 未知环境: ${env}, 使用默认配置`);\n return initConfig(overrides);\n }\n \n return initConfig({\n ...preset,\n environment: env,\n ...overrides,\n });\n}\n\n// ============ React Hook ============\n\nimport { useState, useEffect, useCallback } from 'react';\n\n/**\n * React Hook: 获取和管理 SDK 配置\n * \n * @example\n * const { config, setApiBaseUrl, initConfig } = useSDKConfig();\n * \n * // 读取配置\n * console.log(config.apiBaseUrl);\n * \n * // 动态修改 API URL\n * setApiBaseUrl('https://new-api.example.com');\n */\nexport function useSDKConfig() {\n const [config, setConfigState] = useState(getConfig);\n \n useEffect(() => {\n const unsubscribe = subscribeConfig(setConfigState);\n return unsubscribe;\n }, []);\n \n const updateConfig = useCallback((options) => {\n initConfig(options);\n }, []);\n \n const updateApiUrl = useCallback((url) => {\n setApiBaseUrl(url);\n }, []);\n \n const updateWsUrl = useCallback((url) => {\n setWsBaseUrl(url);\n }, []);\n \n const reset = useCallback(() => {\n resetConfig();\n }, []);\n \n return {\n config,\n initConfig: updateConfig,\n setApiBaseUrl: updateApiUrl,\n setWsBaseUrl: updateWsUrl,\n resetConfig: reset,\n initWithEnvironment,\n };\n}\n\n// ============ 请求工具 ============\n\n/**\n * 构建完整的 API URL\n * \n * @param {string} endpoint - API 端点(如 '/auth/login')\n * @param {boolean} useFullUrl - 是否使用完整 URL\n * @returns {string} 完整的 URL\n */\nexport function buildApiUrl(endpoint, useFullUrl = false) {\n const baseUrl = useFullUrl ? _config.apiFullUrl : _config.apiBaseUrl;\n // 确保不会出现双斜杠\n const cleanEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n const cleanBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n return `${cleanBase}${cleanEndpoint}`;\n}\n\n/**\n * 获取认证 Token\n * \n * @returns {string|null} Token 或 null\n */\nexport function getToken() {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(_config.tokenStorageKey);\n}\n\n/**\n * 获取刷新 Token\n * \n * @returns {string|null} Refresh Token 或 null\n */\nexport function getRefreshToken() {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(_config.refreshTokenStorageKey);\n}\n\n/**\n * 保存认证 Token\n * \n * @param {string} accessToken - Access Token\n * @param {string} refreshToken - Refresh Token(可选)\n */\nexport function saveTokens(accessToken, refreshToken) {\n if (typeof window === 'undefined') return;\n localStorage.setItem(_config.tokenStorageKey, accessToken);\n if (refreshToken) {\n localStorage.setItem(_config.refreshTokenStorageKey, refreshToken);\n }\n}\n\n/**\n * 清除所有 Token\n */\nexport function clearTokens() {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(_config.tokenStorageKey);\n localStorage.removeItem(_config.refreshTokenStorageKey);\n localStorage.removeItem(_config.currentSessionKey);\n}\n\n/**\n * 检查是否已认证\n * \n * @returns {boolean} 是否有有效 Token\n */\nexport function isAuthenticated() {\n return !!getToken();\n}\n\n// ============ 日志工具 ============\n\nconst LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };\n\n/**\n * SDK 日志工具\n * 根据配置的日志级别输出日志\n */\nexport const logger = {\n debug: (...args) => {\n if (_config.debug && LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.debug) {\n console.debug('[SDK]', ...args);\n }\n },\n info: (...args) => {\n if (_config.debug && LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.info) {\n console.info('[SDK]', ...args);\n }\n },\n warn: (...args) => {\n if (LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.warn) {\n console.warn('[SDK]', ...args);\n }\n },\n error: (...args) => {\n console.error('[SDK]', ...args);\n },\n};\n\n// ============ 语言管理 ============\n\n/**\n * 获取当前语言\n * 优先从 localStorage 读取,否则使用默认配置\n * \n * @returns {string} 当前语言代码\n */\nexport function getLanguage() {\n // SSR 安全检查\n if (typeof window === 'undefined') {\n return _config.language;\n }\n \n // 尝试从 localStorage 读取\n const stored = localStorage.getItem(_config.languageStorageKey);\n if (stored && _config.supportedLanguages.includes(stored)) {\n return stored;\n }\n \n // 尝试从浏览器获取\n const browserLang = navigator.language?.split('-')[0];\n if (browserLang && _config.supportedLanguages.includes(browserLang)) {\n return browserLang;\n }\n \n return _config.language;\n}\n\n/**\n * 设置全局语言\n * 会通知所有订阅的 SDK 和组件\n * \n * @param {string} lang - 语言代码 ('zh' | 'en' | 'ja' | 'ko')\n * @returns {boolean} 是否设置成功\n */\nexport function setLanguage(lang) {\n // 验证语言代码\n if (!_config.supportedLanguages.includes(lang)) {\n logger.warn(`不支持的语言: ${lang}, 支持的语言: ${_config.supportedLanguages.join(', ')}`);\n return false;\n }\n \n const previousLang = _config.language;\n _config.language = lang;\n \n // 持久化到 localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem(_config.languageStorageKey, lang);\n \n // 触发全局 CustomEvent,让不直接依赖此模块的 SDK 也能收到通知\n try {\n const event = new CustomEvent('qbit-did:language-change', {\n detail: { language: lang, oldLanguage: previousLang }\n });\n window.dispatchEvent(event);\n } catch (e) {\n // 忽略事件触发错误\n }\n }\n \n // 通知所有语言监听器\n _notifyLanguageListeners(lang, previousLang);\n \n if (_config.debug) {\n console.log(`[SDK Config] 语言已切换: ${previousLang} -> ${lang}`);\n }\n \n return true;\n}\n\n/**\n * 初始化语言(应用启动时调用)\n * 从 localStorage 或浏览器偏好读取\n */\nexport function initLanguage() {\n const detectedLang = getLanguage();\n _config.language = detectedLang;\n \n if (_config.debug) {\n console.log(`[SDK Config] 语言已初始化: ${detectedLang}`);\n }\n \n return detectedLang;\n}\n\n/**\n * 订阅语言变更\n * \n * @param {function} listener - 回调函数 (newLang, oldLang) => void\n * @returns {function} 取消订阅函数\n */\nexport function subscribeLanguage(listener) {\n _languageListeners.add(listener);\n return () => _languageListeners.delete(listener);\n}\n\nfunction _notifyLanguageListeners(newLang, oldLang) {\n _languageListeners.forEach(listener => {\n try {\n listener(newLang, oldLang);\n } catch (err) {\n console.error('[SDK Config] 语言监听器执行错误:', err);\n }\n });\n}\n\n/**\n * React Hook: 获取和管理语言\n * \n * @example\n * const { language, setLanguage, supportedLanguages } = useLanguage();\n * \n * // 切换语言\n * setLanguage('en');\n */\nexport function useLanguage() {\n const [language, setLangState] = useState(getLanguage);\n \n useEffect(() => {\n // 初始化语言\n const currentLang = getLanguage();\n setLangState(currentLang);\n \n // 订阅语言变更\n const unsubscribe = subscribeLanguage((newLang) => {\n setLangState(newLang);\n });\n \n return unsubscribe;\n }, []);\n \n const updateLanguage = useCallback((lang) => {\n setLanguage(lang);\n }, []);\n \n return {\n language,\n setLanguage: updateLanguage,\n supportedLanguages: _config.supportedLanguages,\n fallbackLanguage: _config.fallbackLanguage,\n };\n}\n\n// ============ 导出 BaseApiClient ============\n\nexport { BaseApiClient, createApiClient } from './BaseApiClient.js';\n\n// ============ 导出 ============\n\nexport default {\n getConfig,\n initConfig,\n setApiBaseUrl,\n setWsBaseUrl,\n setDebug,\n resetConfig,\n subscribeConfig,\n initWithEnvironment,\n ENVIRONMENT_PRESETS,\n buildApiUrl,\n getToken,\n getRefreshToken,\n saveTokens,\n clearTokens,\n isAuthenticated,\n logger,\n useSDKConfig,\n // 语言管理\n getLanguage,\n setLanguage,\n initLanguage,\n subscribeLanguage,\n useLanguage,\n};\n\n"],"names":["getStoredToken"],"mappings":"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"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/BaseApiClient.js","../src/index.js"],"sourcesContent":["/**\n * @quantabit/sdk-config - BaseApiClient\n * \n * SDK API 客户端基类\n * 封装所有通用的配置、请求、Token 管理逻辑\n * \n * 使用方式:\n * ```javascript\n * import { BaseApiClient } from '@quantabit/sdk-config';\n * \n * class MyApiClient extends BaseApiClient {\n * constructor(config = {}) {\n * super('/my-module', config); // 只需传入模块路径\n * }\n * \n * // 专注于业务方法\n * async getList() {\n * return this.request('/list');\n * }\n * }\n * ```\n */\n\nimport {\n getConfig,\n subscribeConfig,\n getToken as getStoredToken,\n logger,\n} from './index.js';\n\n/**\n * SDK API 客户端基类\n * 所有 SDK 的 API 客户端都应继承此类\n */\nexport class BaseApiClient {\n /**\n * 构造函数\n * @param {string} modulePath - 模块路径,如 '/auth', '/points', '/wallet'\n * @param {Object} config - 配置选项\n * @param {string} config.baseUrl - 自定义基础 URL(覆盖全局配置)\n * @param {number} config.timeout - 自定义超时时间(毫秒)\n * @param {Function} config.onError - 错误回调\n * @param {Function} config.getLanguage - 获取语言的函数\n */\n constructor(modulePath = '', config = {}) {\n this.modulePath = modulePath;\n this._customBaseUrl = config.baseUrl;\n this._customTimeout = config.timeout;\n this.token = null;\n this.onError = config.onError;\n this.getLanguage = config.getLanguage || (() => 'zh');\n \n // 从全局配置初始化\n this._updateFromGlobalConfig(getConfig());\n \n // 订阅配置变更\n this._unsubscribe = subscribeConfig((newConfig) => {\n this._updateFromGlobalConfig(newConfig);\n });\n }\n\n /**\n * 从全局配置更新本地配置\n * @private\n */\n _updateFromGlobalConfig(globalConfig) {\n // 只有未自定义时才使用全局配置\n if (!this._customBaseUrl) {\n this.baseUrl = `${globalConfig.apiBaseUrl}${this.modulePath}`;\n } else {\n this.baseUrl = this._customBaseUrl;\n }\n \n if (!this._customTimeout) {\n this.timeout = globalConfig.timeout || 30000;\n } else {\n this.timeout = this._customTimeout;\n }\n }\n\n /**\n * 设置 Token\n * @param {string} token - 访问令牌\n */\n setToken(token) {\n this.token = token;\n }\n\n /**\n * 设置基础 URL\n * @param {string} url - 新的基础 URL\n */\n setBaseUrl(url) {\n this._customBaseUrl = url;\n this.baseUrl = url;\n }\n\n /**\n * 获取当前使用的 Token\n * 优先使用实例 Token,否则从存储获取\n * @returns {string|null}\n */\n getToken() {\n return this.token || getStoredToken();\n }\n\n /**\n * 发送 HTTP 请求\n * @param {string} endpoint - API 端点(相对于 baseUrl)\n * @param {Object} options - fetch 选项\n * @returns {Promise<any>} 响应数据\n */\n async request(endpoint, options = {}) {\n const url = `${this.baseUrl}${endpoint}`;\n \n // 构建请求头\n const headers = {\n 'Content-Type': 'application/json',\n 'Accept-Language': this.getLanguage(),\n ...options.headers,\n };\n \n // 添加认证头\n const token = this.getToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n // 超时控制\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n \n clearTimeout(timeoutId);\n \n // 解析响应\n const data = await response.json();\n \n // 处理错误响应\n if (!response.ok) {\n const error = new Error(data.message || data.detail || `HTTP ${response.status}`);\n error.code = data.code || `HTTP_${response.status}`;\n error.status = response.status;\n error.data = data;\n \n this.onError?.(error);\n logger.error(`${this.constructor.name} Error:`, error.message);\n throw error;\n }\n \n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n \n // 处理超时错误\n if (error.name === 'AbortError') {\n const timeoutError = new Error('Request timeout');\n timeoutError.code = 'TIMEOUT';\n this.onError?.(timeoutError);\n throw timeoutError;\n }\n \n // 处理网络错误\n if (error.name === 'TypeError' && error.message.includes('fetch')) {\n const networkError = new Error('Network error');\n networkError.code = 'NETWORK_ERROR';\n this.onError?.(networkError);\n throw networkError;\n }\n \n throw error;\n }\n }\n\n /**\n * GET 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} params - 查询参数\n */\n async get(endpoint, params = {}) {\n const query = new URLSearchParams(params).toString();\n const url = query ? `${endpoint}?${query}` : endpoint;\n return this.request(url, { method: 'GET' });\n }\n\n /**\n * POST 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async post(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * PUT 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async put(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * DELETE 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据(可选)\n */\n async delete(endpoint, data = null) {\n const options = { method: 'DELETE' };\n if (data) {\n options.body = JSON.stringify(data);\n }\n return this.request(endpoint, options);\n }\n\n /**\n * PATCH 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async patch(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * 销毁实例,取消配置订阅\n */\n destroy() {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n }\n}\n\n/**\n * 创建 API 客户端的工厂函数\n * 用于快速创建简单的 API 客户端\n * \n * @param {string} modulePath - 模块路径\n * @param {Object} methods - 方法定义对象\n * @returns {BaseApiClient} API 客户端实例\n * \n * @example\n * const myApi = createApiClient('/my-module', {\n * getList: (client) => client.get('/list'),\n * create: (client, data) => client.post('/', data),\n * });\n */\nexport function createApiClient(modulePath, methods = {}) {\n const client = new BaseApiClient(modulePath);\n \n // 绑定自定义方法\n Object.entries(methods).forEach(([name, fn]) => {\n client[name] = (...args) => fn(client, ...args);\n });\n \n return client;\n}\n\nexport default BaseApiClient;\n","/**\n * @quantabit/sdk-config\n * \n * Qbit_DID SDK 统一配置管理\n * \n * 所有 SDK 共享此配置,修改一处即可全局生效:\n * - API 基础 URL\n * - 超时时间\n * - 认证配置\n * - 调试模式\n * \n * 使用方式:\n * 1. 直接使用默认配置\n * import { getConfig } from '@quantabit/sdk-config';\n * const config = getConfig();\n * \n * 2. 应用启动时初始化配置\n * import { initConfig } from '@quantabit/sdk-config';\n * initConfig({ apiBaseUrl: 'https://api.example.com' });\n * \n * 3. 使用 React Hook\n * import { useSDKConfig } from '@quantabit/sdk-config';\n * const { config, setApiBaseUrl } = useSDKConfig();\n */\n\n// ============ 默认配置 ============\n\n/**\n * 默认 API 配置\n * 注意:生产环境应通过 initConfig 覆盖这些值\n */\nconst DEFAULT_CONFIG = {\n // === API 配置 ===\n apiBaseUrl: '/api/v1', // API 基础路径(相对路径,由后端代理)\n apiFullUrl: '', // 完整 API URL(需通过 initConfig 配置)\n \n // === 超时配置 ===\n timeout: 30000, // 请求超时(毫秒)\n retryCount: 3, // 重试次数\n retryDelay: 1000, // 重试延迟(毫秒)\n \n // === 认证配置 ===\n tokenStorageKey: 'qbit_did_access_token',\n refreshTokenStorageKey: 'qbit_did_refresh_token',\n currentSessionKey: 'qbit_did_current',\n autoRefreshToken: true, // 自动刷新 Token\n \n // === WebSocket 配置 ===\n wsBaseUrl: '', // WebSocket URL(需通过 initConfig 配置)\n wsReconnect: true,\n wsReconnectInterval: 3000,\n \n // === 调试配置 ===\n debug: process.env.NODE_ENV !== 'production',\n logLevel: 'info', // 'debug' | 'info' | 'warn' | 'error'\n \n // === 环境配置 ===\n environment: process.env.NODE_ENV || 'development',\n \n // === 语言配置 ===\n language: 'zh', // 默认语言\n fallbackLanguage: 'en', // 回退语言\n supportedLanguages: ['zh', 'en', 'ja', 'ko'], // 支持的语言\n languageStorageKey: 'qbit_did_language', // localStorage key\n};\n\n// ============ 配置状态 ============\n\nlet _config = { ...DEFAULT_CONFIG };\nlet _listeners = new Set();\nlet _languageListeners = new Set(); // 语言变更监听器\n\n// ============ 核心函数 ============\n\n/**\n * 获取当前配置\n * @returns {object} 当前配置对象\n */\nexport function getConfig() {\n return { ..._config };\n}\n\n/**\n * 初始化 SDK 配置\n * 应在应用启动时调用一次\n * \n * @param {object} options - 配置选项\n * @param {string} options.apiBaseUrl - API 基础 URL(如 '/api/v1' 或完整 URL)\n * @param {number} options.timeout - 请求超时时间(毫秒)\n * @param {boolean} options.debug - 是否开启调试模式\n * @param {string} options.environment - 环境标识\n */\nexport function initConfig(options = {}) {\n _config = {\n ..._config,\n ...options,\n };\n \n // 如果提供了完整 URL,同时更新 apiFullUrl\n if (options.apiBaseUrl && options.apiBaseUrl.startsWith('http')) {\n _config.apiFullUrl = options.apiBaseUrl;\n // 对于完整 URL,apiBaseUrl 保持原样\n }\n \n // 通知所有监听者\n _notifyListeners();\n \n if (_config.debug) {\n console.log('[SDK Config] 配置已初始化:', _config);\n }\n \n return _config;\n}\n\n/**\n * 设置 API 基础 URL\n * 便捷方法,用于动态切换 API 地址\n * \n * @param {string} url - 新的 API URL\n */\nexport function setApiBaseUrl(url) {\n _config.apiBaseUrl = url;\n if (url.startsWith('http')) {\n _config.apiFullUrl = url;\n }\n _notifyListeners();\n \n if (_config.debug) {\n console.log('[SDK Config] API URL 已更新:', url);\n }\n}\n\n/**\n * 设置 WebSocket URL\n * \n * @param {string} url - 新的 WebSocket URL\n */\nexport function setWsBaseUrl(url) {\n _config.wsBaseUrl = url;\n _notifyListeners();\n}\n\n/**\n * 设置调试模式\n * \n * @param {boolean} debug - 是否开启调试\n */\nexport function setDebug(debug) {\n _config.debug = debug;\n _notifyListeners();\n}\n\n/**\n * 重置为默认配置\n */\nexport function resetConfig() {\n _config = { ...DEFAULT_CONFIG };\n _notifyListeners();\n}\n\n// ============ 配置监听 ============\n\n/**\n * 订阅配置变更\n * \n * @param {function} listener - 监听回调\n * @returns {function} 取消订阅函数\n */\nexport function subscribeConfig(listener) {\n _listeners.add(listener);\n return () => _listeners.delete(listener);\n}\n\nfunction _notifyListeners() {\n const config = getConfig();\n _listeners.forEach(listener => {\n try {\n listener(config);\n } catch (err) {\n console.error('[SDK Config] 监听器执行错误:', err);\n }\n });\n}\n\n// ============ 环境预设 ============\n\n/**\n * 环境预设配置\n * 快速切换不同环境的配置\n */\nexport const ENVIRONMENT_PRESETS = {\n development: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: 'http://localhost:3000/api/v1',\n wsBaseUrl: 'ws://localhost:3000/ws',\n debug: true,\n logLevel: 'debug',\n },\n staging: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: '', // 请通过 initWithEnvironment('staging', { apiFullUrl: '...' }) 配置\n wsBaseUrl: '', // 请通过 initWithEnvironment('staging', { wsBaseUrl: '...' }) 配置\n debug: true,\n logLevel: 'info',\n },\n production: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: '', // 请通过 initWithEnvironment('production', { apiFullUrl: '...' }) 配置\n wsBaseUrl: '', // 请通过 initWithEnvironment('production', { wsBaseUrl: '...' }) 配置\n debug: false,\n logLevel: 'error',\n },\n};\n\n/**\n * 使用环境预设初始化配置\n * \n * @param {string} env - 环境名称 ('development' | 'staging' | 'production')\n * @param {object} overrides - 额外覆盖配置\n */\nexport function initWithEnvironment(env, overrides = {}) {\n const preset = ENVIRONMENT_PRESETS[env];\n if (!preset) {\n console.warn(`[SDK Config] 未知环境: ${env}, 使用默认配置`);\n return initConfig(overrides);\n }\n \n return initConfig({\n ...preset,\n environment: env,\n ...overrides,\n });\n}\n\n// ============ React Hook ============\n\nimport { useState, useEffect, useCallback } from 'react';\n\n/**\n * React Hook: 获取和管理 SDK 配置\n * \n * @example\n * const { config, setApiBaseUrl, initConfig } = useSDKConfig();\n * \n * // 读取配置\n * console.log(config.apiBaseUrl);\n * \n * // 动态修改 API URL\n * setApiBaseUrl('https://new-api.example.com');\n */\nexport function useSDKConfig() {\n const [config, setConfigState] = useState(getConfig);\n \n useEffect(() => {\n const unsubscribe = subscribeConfig(setConfigState);\n return unsubscribe;\n }, []);\n \n const updateConfig = useCallback((options) => {\n initConfig(options);\n }, []);\n \n const updateApiUrl = useCallback((url) => {\n setApiBaseUrl(url);\n }, []);\n \n const updateWsUrl = useCallback((url) => {\n setWsBaseUrl(url);\n }, []);\n \n const reset = useCallback(() => {\n resetConfig();\n }, []);\n \n return {\n config,\n initConfig: updateConfig,\n setApiBaseUrl: updateApiUrl,\n setWsBaseUrl: updateWsUrl,\n resetConfig: reset,\n initWithEnvironment,\n };\n}\n\n// ============ 请求工具 ============\n\n/**\n * 构建完整的 API URL\n * \n * @param {string} endpoint - API 端点(如 '/auth/login')\n * @param {boolean} useFullUrl - 是否使用完整 URL\n * @returns {string} 完整的 URL\n */\nexport function buildApiUrl(endpoint, useFullUrl = false) {\n const baseUrl = useFullUrl ? _config.apiFullUrl : _config.apiBaseUrl;\n // 确保不会出现双斜杠\n const cleanEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n const cleanBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n return `${cleanBase}${cleanEndpoint}`;\n}\n\n/**\n * 获取认证 Token\n * \n * @returns {string|null} Token 或 null\n */\nexport function getToken() {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(_config.tokenStorageKey);\n}\n\n/**\n * 获取刷新 Token\n * \n * @returns {string|null} Refresh Token 或 null\n */\nexport function getRefreshToken() {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(_config.refreshTokenStorageKey);\n}\n\n/**\n * 保存认证 Token\n * \n * @param {string} accessToken - Access Token\n * @param {string} refreshToken - Refresh Token(可选)\n */\nexport function saveTokens(accessToken, refreshToken) {\n if (typeof window === 'undefined') return;\n localStorage.setItem(_config.tokenStorageKey, accessToken);\n if (refreshToken) {\n localStorage.setItem(_config.refreshTokenStorageKey, refreshToken);\n }\n}\n\n/**\n * 清除所有 Token\n */\nexport function clearTokens() {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(_config.tokenStorageKey);\n localStorage.removeItem(_config.refreshTokenStorageKey);\n localStorage.removeItem(_config.currentSessionKey);\n}\n\n/**\n * 检查是否已认证\n * \n * @returns {boolean} 是否有有效 Token\n */\nexport function isAuthenticated() {\n return !!getToken();\n}\n\n// ============ 日志工具 ============\n\nconst LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };\n\n/**\n * SDK 日志工具\n * 根据配置的日志级别输出日志\n */\nexport const logger = {\n debug: (...args) => {\n if (_config.debug && LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.debug) {\n console.debug('[SDK]', ...args);\n }\n },\n info: (...args) => {\n if (_config.debug && LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.info) {\n console.info('[SDK]', ...args);\n }\n },\n warn: (...args) => {\n if (LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.warn) {\n console.warn('[SDK]', ...args);\n }\n },\n error: (...args) => {\n console.error('[SDK]', ...args);\n },\n};\n\n// ============ 语言管理 ============\n\n/**\n * 获取当前语言\n * 优先从 localStorage 读取,否则使用默认配置\n * \n * @returns {string} 当前语言代码\n */\nexport function getLanguage() {\n // SSR 安全检查\n if (typeof window === 'undefined') {\n return _config.language;\n }\n \n // 尝试从 localStorage 读取\n const stored = localStorage.getItem(_config.languageStorageKey);\n if (stored && _config.supportedLanguages.includes(stored)) {\n return stored;\n }\n \n // 尝试从浏览器获取\n const browserLang = navigator.language?.split('-')[0];\n if (browserLang && _config.supportedLanguages.includes(browserLang)) {\n return browserLang;\n }\n \n return _config.language;\n}\n\n/**\n * 设置全局语言\n * 会通知所有订阅的 SDK 和组件\n * \n * @param {string} lang - 语言代码 ('zh' | 'en' | 'ja' | 'ko')\n * @returns {boolean} 是否设置成功\n */\nexport function setLanguage(lang) {\n // 验证语言代码\n if (!_config.supportedLanguages.includes(lang)) {\n logger.warn(`不支持的语言: ${lang}, 支持的语言: ${_config.supportedLanguages.join(', ')}`);\n return false;\n }\n \n const previousLang = _config.language;\n _config.language = lang;\n \n // 持久化到 localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem(_config.languageStorageKey, lang);\n \n // 触发全局 CustomEvent,让不直接依赖此模块的 SDK 也能收到通知\n try {\n const event = new CustomEvent('qbit-did:language-change', {\n detail: { language: lang, oldLanguage: previousLang }\n });\n window.dispatchEvent(event);\n } catch (e) {\n // 忽略事件触发错误\n }\n }\n \n // 通知所有语言监听器\n _notifyLanguageListeners(lang, previousLang);\n \n if (_config.debug) {\n console.log(`[SDK Config] 语言已切换: ${previousLang} -> ${lang}`);\n }\n \n return true;\n}\n\n/**\n * 初始化语言(应用启动时调用)\n * 从 localStorage 或浏览器偏好读取\n */\nexport function initLanguage() {\n const detectedLang = getLanguage();\n _config.language = detectedLang;\n \n if (_config.debug) {\n console.log(`[SDK Config] 语言已初始化: ${detectedLang}`);\n }\n \n return detectedLang;\n}\n\n/**\n * 订阅语言变更\n * \n * @param {function} listener - 回调函数 (newLang, oldLang) => void\n * @returns {function} 取消订阅函数\n */\nexport function subscribeLanguage(listener) {\n _languageListeners.add(listener);\n return () => _languageListeners.delete(listener);\n}\n\nfunction _notifyLanguageListeners(newLang, oldLang) {\n _languageListeners.forEach(listener => {\n try {\n listener(newLang, oldLang);\n } catch (err) {\n console.error('[SDK Config] 语言监听器执行错误:', err);\n }\n });\n}\n\n/**\n * React Hook: 获取和管理语言\n * \n * @example\n * const { language, setLanguage, supportedLanguages } = useLanguage();\n * \n * // 切换语言\n * setLanguage('en');\n */\nexport function useLanguage() {\n const [language, setLangState] = useState(getLanguage);\n \n useEffect(() => {\n // 初始化语言\n const currentLang = getLanguage();\n setLangState(currentLang);\n \n // 订阅语言变更\n const unsubscribe = subscribeLanguage((newLang) => {\n setLangState(newLang);\n });\n \n return unsubscribe;\n }, []);\n \n const updateLanguage = useCallback((lang) => {\n setLanguage(lang);\n }, []);\n \n return {\n language,\n setLanguage: updateLanguage,\n supportedLanguages: _config.supportedLanguages,\n fallbackLanguage: _config.fallbackLanguage,\n };\n}\n\n// ============ 导出 BaseApiClient ============\n\nexport { BaseApiClient, createApiClient } from './BaseApiClient.js';\n\n// ============ 导出 ============\n\nexport default {\n getConfig,\n initConfig,\n setApiBaseUrl,\n setWsBaseUrl,\n setDebug,\n resetConfig,\n subscribeConfig,\n initWithEnvironment,\n ENVIRONMENT_PRESETS,\n buildApiUrl,\n getToken,\n getRefreshToken,\n saveTokens,\n clearTokens,\n isAuthenticated,\n logger,\n useSDKConfig,\n // 语言管理\n getLanguage,\n setLanguage,\n initLanguage,\n subscribeLanguage,\n useLanguage,\n};\n\n"],"names":["getStoredToken","useState","useEffect","useCallback"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/BaseApiClient.js","../src/index.js"],"sourcesContent":["/**\n * @quantabit/sdk-config - BaseApiClient\n * \n * SDK API 客户端基类\n * 封装所有通用的配置、请求、Token 管理逻辑\n * \n * 使用方式:\n * ```javascript\n * import { BaseApiClient } from '@quantabit/sdk-config';\n * \n * class MyApiClient extends BaseApiClient {\n * constructor(config = {}) {\n * super('/my-module', config); // 只需传入模块路径\n * }\n * \n * // 专注于业务方法\n * async getList() {\n * return this.request('/list');\n * }\n * }\n * ```\n */\n\nimport {\n getConfig,\n subscribeConfig,\n getToken as getStoredToken,\n logger,\n} from './index.js';\n\n/**\n * SDK API 客户端基类\n * 所有 SDK 的 API 客户端都应继承此类\n */\nexport class BaseApiClient {\n /**\n * 构造函数\n * @param {string} modulePath - 模块路径,如 '/auth', '/points', '/wallet'\n * @param {Object} config - 配置选项\n * @param {string} config.baseUrl - 自定义基础 URL(覆盖全局配置)\n * @param {number} config.timeout - 自定义超时时间(毫秒)\n * @param {Function} config.onError - 错误回调\n * @param {Function} config.getLanguage - 获取语言的函数\n */\n constructor(modulePath = '', config = {}) {\n this.modulePath = modulePath;\n this._customBaseUrl = config.baseUrl;\n this._customTimeout = config.timeout;\n this.token = null;\n this.onError = config.onError;\n this.getLanguage = config.getLanguage || (() => 'zh');\n \n // 从全局配置初始化\n this._updateFromGlobalConfig(getConfig());\n \n // 订阅配置变更\n this._unsubscribe = subscribeConfig((newConfig) => {\n this._updateFromGlobalConfig(newConfig);\n });\n }\n\n /**\n * 从全局配置更新本地配置\n * @private\n */\n _updateFromGlobalConfig(globalConfig) {\n // 只有未自定义时才使用全局配置\n if (!this._customBaseUrl) {\n this.baseUrl = `${globalConfig.apiBaseUrl}${this.modulePath}`;\n } else {\n this.baseUrl = this._customBaseUrl;\n }\n \n if (!this._customTimeout) {\n this.timeout = globalConfig.timeout || 30000;\n } else {\n this.timeout = this._customTimeout;\n }\n }\n\n /**\n * 设置 Token\n * @param {string} token - 访问令牌\n */\n setToken(token) {\n this.token = token;\n }\n\n /**\n * 设置基础 URL\n * @param {string} url - 新的基础 URL\n */\n setBaseUrl(url) {\n this._customBaseUrl = url;\n this.baseUrl = url;\n }\n\n /**\n * 获取当前使用的 Token\n * 优先使用实例 Token,否则从存储获取\n * @returns {string|null}\n */\n getToken() {\n return this.token || getStoredToken();\n }\n\n /**\n * 发送 HTTP 请求\n * @param {string} endpoint - API 端点(相对于 baseUrl)\n * @param {Object} options - fetch 选项\n * @returns {Promise<any>} 响应数据\n */\n async request(endpoint, options = {}) {\n const url = `${this.baseUrl}${endpoint}`;\n \n // 构建请求头\n const headers = {\n 'Content-Type': 'application/json',\n 'Accept-Language': this.getLanguage(),\n ...options.headers,\n };\n \n // 添加认证头\n const token = this.getToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n // 超时控制\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n \n clearTimeout(timeoutId);\n \n // 解析响应\n const data = await response.json();\n \n // 处理错误响应\n if (!response.ok) {\n const error = new Error(data.message || data.detail || `HTTP ${response.status}`);\n error.code = data.code || `HTTP_${response.status}`;\n error.status = response.status;\n error.data = data;\n \n this.onError?.(error);\n logger.error(`${this.constructor.name} Error:`, error.message);\n throw error;\n }\n \n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n \n // 处理超时错误\n if (error.name === 'AbortError') {\n const timeoutError = new Error('Request timeout');\n timeoutError.code = 'TIMEOUT';\n this.onError?.(timeoutError);\n throw timeoutError;\n }\n \n // 处理网络错误\n if (error.name === 'TypeError' && error.message.includes('fetch')) {\n const networkError = new Error('Network error');\n networkError.code = 'NETWORK_ERROR';\n this.onError?.(networkError);\n throw networkError;\n }\n \n throw error;\n }\n }\n\n /**\n * GET 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} params - 查询参数\n */\n async get(endpoint, params = {}) {\n const query = new URLSearchParams(params).toString();\n const url = query ? `${endpoint}?${query}` : endpoint;\n return this.request(url, { method: 'GET' });\n }\n\n /**\n * POST 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async post(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * PUT 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async put(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * DELETE 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据(可选)\n */\n async delete(endpoint, data = null) {\n const options = { method: 'DELETE' };\n if (data) {\n options.body = JSON.stringify(data);\n }\n return this.request(endpoint, options);\n }\n\n /**\n * PATCH 请求便捷方法\n * @param {string} endpoint - API 端点\n * @param {Object} data - 请求体数据\n */\n async patch(endpoint, data = {}) {\n return this.request(endpoint, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * 销毁实例,取消配置订阅\n */\n destroy() {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n }\n}\n\n/**\n * 创建 API 客户端的工厂函数\n * 用于快速创建简单的 API 客户端\n * \n * @param {string} modulePath - 模块路径\n * @param {Object} methods - 方法定义对象\n * @returns {BaseApiClient} API 客户端实例\n * \n * @example\n * const myApi = createApiClient('/my-module', {\n * getList: (client) => client.get('/list'),\n * create: (client, data) => client.post('/', data),\n * });\n */\nexport function createApiClient(modulePath, methods = {}) {\n const client = new BaseApiClient(modulePath);\n \n // 绑定自定义方法\n Object.entries(methods).forEach(([name, fn]) => {\n client[name] = (...args) => fn(client, ...args);\n });\n \n return client;\n}\n\nexport default BaseApiClient;\n","/**\n * @quantabit/sdk-config\n * \n * QuantaBit SDK 统一配置管理\n * \n * 所有 SDK 共享此配置,修改一处即可全局生效:\n * - API 基础 URL\n * - 超时时间\n * - 认证配置\n * - 调试模式\n * \n * 使用方式:\n * 1. 直接使用默认配置\n * import { getConfig } from '@quantabit/sdk-config';\n * const config = getConfig();\n * \n * 2. 应用启动时初始化配置\n * import { initConfig } from '@quantabit/sdk-config';\n * initConfig({ apiBaseUrl: 'https://api.example.com' });\n * \n * 3. 使用 React Hook\n * import { useSDKConfig } from '@quantabit/sdk-config';\n * const { config, setApiBaseUrl } = useSDKConfig();\n */\n\n// ============ 默认配置 ============\n\n/**\n * 默认 API 配置\n * 注意:生产环境应通过 initConfig 覆盖这些值\n */\nconst DEFAULT_CONFIG = {\n // === API 配置 ===\n apiBaseUrl: '/api/v1', // API 基础路径(相对路径,由后端代理)\n apiFullUrl: '', // 完整 API URL(需通过 initConfig 配置)\n \n // === 超时配置 ===\n timeout: 30000, // 请求超时(毫秒)\n retryCount: 3, // 重试次数\n retryDelay: 1000, // 重试延迟(毫秒)\n \n // === 认证配置 ===\n tokenStorageKey: 'qbit_did_access_token',\n refreshTokenStorageKey: 'qbit_did_refresh_token',\n currentSessionKey: 'qbit_did_current',\n autoRefreshToken: true, // 自动刷新 Token\n \n // === WebSocket 配置 ===\n wsBaseUrl: '', // WebSocket URL(需通过 initConfig 配置)\n wsReconnect: true,\n wsReconnectInterval: 3000,\n \n // === 调试配置 ===\n debug: process.env.NODE_ENV !== 'production',\n logLevel: 'info', // 'debug' | 'info' | 'warn' | 'error'\n \n // === 环境配置 ===\n environment: process.env.NODE_ENV || 'development',\n \n // === 语言配置 ===\n language: 'zh', // 默认语言\n fallbackLanguage: 'en', // 回退语言\n supportedLanguages: ['zh', 'en', 'ja', 'ko'], // 支持的语言\n languageStorageKey: 'qbit_did_language', // localStorage key\n};\n\n// ============ 配置状态 ============\n\nlet _config = { ...DEFAULT_CONFIG };\nlet _listeners = new Set();\nlet _languageListeners = new Set(); // 语言变更监听器\n\n// ============ 核心函数 ============\n\n/**\n * 获取当前配置\n * @returns {object} 当前配置对象\n */\nexport function getConfig() {\n return { ..._config };\n}\n\n/**\n * 初始化 SDK 配置\n * 应在应用启动时调用一次\n * \n * @param {object} options - 配置选项\n * @param {string} options.apiBaseUrl - API 基础 URL(如 '/api/v1' 或完整 URL)\n * @param {number} options.timeout - 请求超时时间(毫秒)\n * @param {boolean} options.debug - 是否开启调试模式\n * @param {string} options.environment - 环境标识\n */\nexport function initConfig(options = {}) {\n _config = {\n ..._config,\n ...options,\n };\n \n // 如果提供了完整 URL,同时更新 apiFullUrl\n if (options.apiBaseUrl && options.apiBaseUrl.startsWith('http')) {\n _config.apiFullUrl = options.apiBaseUrl;\n // 对于完整 URL,apiBaseUrl 保持原样\n }\n \n // 通知所有监听者\n _notifyListeners();\n \n if (_config.debug) {\n console.log('[SDK Config] 配置已初始化:', _config);\n }\n \n return _config;\n}\n\n/**\n * 设置 API 基础 URL\n * 便捷方法,用于动态切换 API 地址\n * \n * @param {string} url - 新的 API URL\n */\nexport function setApiBaseUrl(url) {\n _config.apiBaseUrl = url;\n if (url.startsWith('http')) {\n _config.apiFullUrl = url;\n }\n _notifyListeners();\n \n if (_config.debug) {\n console.log('[SDK Config] API URL 已更新:', url);\n }\n}\n\n/**\n * 设置 WebSocket URL\n * \n * @param {string} url - 新的 WebSocket URL\n */\nexport function setWsBaseUrl(url) {\n _config.wsBaseUrl = url;\n _notifyListeners();\n}\n\n/**\n * 设置调试模式\n * \n * @param {boolean} debug - 是否开启调试\n */\nexport function setDebug(debug) {\n _config.debug = debug;\n _notifyListeners();\n}\n\n/**\n * 重置为默认配置\n */\nexport function resetConfig() {\n _config = { ...DEFAULT_CONFIG };\n _notifyListeners();\n}\n\n// ============ 配置监听 ============\n\n/**\n * 订阅配置变更\n * \n * @param {function} listener - 监听回调\n * @returns {function} 取消订阅函数\n */\nexport function subscribeConfig(listener) {\n _listeners.add(listener);\n return () => _listeners.delete(listener);\n}\n\nfunction _notifyListeners() {\n const config = getConfig();\n _listeners.forEach(listener => {\n try {\n listener(config);\n } catch (err) {\n console.error('[SDK Config] 监听器执行错误:', err);\n }\n });\n}\n\n// ============ 环境预设 ============\n\n/**\n * 环境预设配置\n * 快速切换不同环境的配置\n */\nexport const ENVIRONMENT_PRESETS = {\n development: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: 'http://localhost:3000/api/v1',\n wsBaseUrl: 'ws://localhost:3000/ws',\n debug: true,\n logLevel: 'debug',\n },\n staging: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: '', // 请通过 initWithEnvironment('staging', { apiFullUrl: '...' }) 配置\n wsBaseUrl: '', // 请通过 initWithEnvironment('staging', { wsBaseUrl: '...' }) 配置\n debug: true,\n logLevel: 'info',\n },\n production: {\n apiBaseUrl: '/api/v1',\n apiFullUrl: '', // 请通过 initWithEnvironment('production', { apiFullUrl: '...' }) 配置\n wsBaseUrl: '', // 请通过 initWithEnvironment('production', { wsBaseUrl: '...' }) 配置\n debug: false,\n logLevel: 'error',\n },\n};\n\n/**\n * 使用环境预设初始化配置\n * \n * @param {string} env - 环境名称 ('development' | 'staging' | 'production')\n * @param {object} overrides - 额外覆盖配置\n */\nexport function initWithEnvironment(env, overrides = {}) {\n const preset = ENVIRONMENT_PRESETS[env];\n if (!preset) {\n console.warn(`[SDK Config] 未知环境: ${env}, 使用默认配置`);\n return initConfig(overrides);\n }\n \n return initConfig({\n ...preset,\n environment: env,\n ...overrides,\n });\n}\n\n// ============ React Hook ============\n\nimport { useState, useEffect, useCallback } from 'react';\n\n/**\n * React Hook: 获取和管理 SDK 配置\n * \n * @example\n * const { config, setApiBaseUrl, initConfig } = useSDKConfig();\n * \n * // 读取配置\n * console.log(config.apiBaseUrl);\n * \n * // 动态修改 API URL\n * setApiBaseUrl('https://new-api.example.com');\n */\nexport function useSDKConfig() {\n const [config, setConfigState] = useState(getConfig);\n \n useEffect(() => {\n const unsubscribe = subscribeConfig(setConfigState);\n return unsubscribe;\n }, []);\n \n const updateConfig = useCallback((options) => {\n initConfig(options);\n }, []);\n \n const updateApiUrl = useCallback((url) => {\n setApiBaseUrl(url);\n }, []);\n \n const updateWsUrl = useCallback((url) => {\n setWsBaseUrl(url);\n }, []);\n \n const reset = useCallback(() => {\n resetConfig();\n }, []);\n \n return {\n config,\n initConfig: updateConfig,\n setApiBaseUrl: updateApiUrl,\n setWsBaseUrl: updateWsUrl,\n resetConfig: reset,\n initWithEnvironment,\n };\n}\n\n// ============ 请求工具 ============\n\n/**\n * 构建完整的 API URL\n * \n * @param {string} endpoint - API 端点(如 '/auth/login')\n * @param {boolean} useFullUrl - 是否使用完整 URL\n * @returns {string} 完整的 URL\n */\nexport function buildApiUrl(endpoint, useFullUrl = false) {\n const baseUrl = useFullUrl ? _config.apiFullUrl : _config.apiBaseUrl;\n // 确保不会出现双斜杠\n const cleanEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n const cleanBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n return `${cleanBase}${cleanEndpoint}`;\n}\n\n/**\n * 获取认证 Token\n * \n * @returns {string|null} Token 或 null\n */\nexport function getToken() {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(_config.tokenStorageKey);\n}\n\n/**\n * 获取刷新 Token\n * \n * @returns {string|null} Refresh Token 或 null\n */\nexport function getRefreshToken() {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(_config.refreshTokenStorageKey);\n}\n\n/**\n * 保存认证 Token\n * \n * @param {string} accessToken - Access Token\n * @param {string} refreshToken - Refresh Token(可选)\n */\nexport function saveTokens(accessToken, refreshToken) {\n if (typeof window === 'undefined') return;\n localStorage.setItem(_config.tokenStorageKey, accessToken);\n if (refreshToken) {\n localStorage.setItem(_config.refreshTokenStorageKey, refreshToken);\n }\n}\n\n/**\n * 清除所有 Token\n */\nexport function clearTokens() {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(_config.tokenStorageKey);\n localStorage.removeItem(_config.refreshTokenStorageKey);\n localStorage.removeItem(_config.currentSessionKey);\n}\n\n/**\n * 检查是否已认证\n * \n * @returns {boolean} 是否有有效 Token\n */\nexport function isAuthenticated() {\n return !!getToken();\n}\n\n// ============ 日志工具 ============\n\nconst LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };\n\n/**\n * SDK 日志工具\n * 根据配置的日志级别输出日志\n */\nexport const logger = {\n debug: (...args) => {\n if (_config.debug && LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.debug) {\n console.debug('[SDK]', ...args);\n }\n },\n info: (...args) => {\n if (_config.debug && LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.info) {\n console.info('[SDK]', ...args);\n }\n },\n warn: (...args) => {\n if (LOG_LEVELS[_config.logLevel] <= LOG_LEVELS.warn) {\n console.warn('[SDK]', ...args);\n }\n },\n error: (...args) => {\n console.error('[SDK]', ...args);\n },\n};\n\n// ============ 语言管理 ============\n\n/**\n * 获取当前语言\n * 优先从 localStorage 读取,否则使用默认配置\n * \n * @returns {string} 当前语言代码\n */\nexport function getLanguage() {\n // SSR 安全检查\n if (typeof window === 'undefined') {\n return _config.language;\n }\n \n // 尝试从 localStorage 读取\n const stored = localStorage.getItem(_config.languageStorageKey);\n if (stored && _config.supportedLanguages.includes(stored)) {\n return stored;\n }\n \n // 尝试从浏览器获取\n const browserLang = navigator.language?.split('-')[0];\n if (browserLang && _config.supportedLanguages.includes(browserLang)) {\n return browserLang;\n }\n \n return _config.language;\n}\n\n/**\n * 设置全局语言\n * 会通知所有订阅的 SDK 和组件\n * \n * @param {string} lang - 语言代码 ('zh' | 'en' | 'ja' | 'ko')\n * @returns {boolean} 是否设置成功\n */\nexport function setLanguage(lang) {\n // 验证语言代码\n if (!_config.supportedLanguages.includes(lang)) {\n logger.warn(`不支持的语言: ${lang}, 支持的语言: ${_config.supportedLanguages.join(', ')}`);\n return false;\n }\n \n const previousLang = _config.language;\n _config.language = lang;\n \n // 持久化到 localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem(_config.languageStorageKey, lang);\n \n // 触发全局 CustomEvent,让不直接依赖此模块的 SDK 也能收到通知\n try {\n const event = new CustomEvent('qbit-did:language-change', {\n detail: { language: lang, oldLanguage: previousLang }\n });\n window.dispatchEvent(event);\n } catch (e) {\n // 忽略事件触发错误\n }\n }\n \n // 通知所有语言监听器\n _notifyLanguageListeners(lang, previousLang);\n \n if (_config.debug) {\n console.log(`[SDK Config] 语言已切换: ${previousLang} -> ${lang}`);\n }\n \n return true;\n}\n\n/**\n * 初始化语言(应用启动时调用)\n * 从 localStorage 或浏览器偏好读取\n */\nexport function initLanguage() {\n const detectedLang = getLanguage();\n _config.language = detectedLang;\n \n if (_config.debug) {\n console.log(`[SDK Config] 语言已初始化: ${detectedLang}`);\n }\n \n return detectedLang;\n}\n\n/**\n * 订阅语言变更\n * \n * @param {function} listener - 回调函数 (newLang, oldLang) => void\n * @returns {function} 取消订阅函数\n */\nexport function subscribeLanguage(listener) {\n _languageListeners.add(listener);\n return () => _languageListeners.delete(listener);\n}\n\nfunction _notifyLanguageListeners(newLang, oldLang) {\n _languageListeners.forEach(listener => {\n try {\n listener(newLang, oldLang);\n } catch (err) {\n console.error('[SDK Config] 语言监听器执行错误:', err);\n }\n });\n}\n\n/**\n * React Hook: 获取和管理语言\n * \n * @example\n * const { language, setLanguage, supportedLanguages } = useLanguage();\n * \n * // 切换语言\n * setLanguage('en');\n */\nexport function useLanguage() {\n const [language, setLangState] = useState(getLanguage);\n \n useEffect(() => {\n // 初始化语言\n const currentLang = getLanguage();\n setLangState(currentLang);\n \n // 订阅语言变更\n const unsubscribe = subscribeLanguage((newLang) => {\n setLangState(newLang);\n });\n \n return unsubscribe;\n }, []);\n \n const updateLanguage = useCallback((lang) => {\n setLanguage(lang);\n }, []);\n \n return {\n language,\n setLanguage: updateLanguage,\n supportedLanguages: _config.supportedLanguages,\n fallbackLanguage: _config.fallbackLanguage,\n };\n}\n\n// ============ 导出 BaseApiClient ============\n\nexport { BaseApiClient, createApiClient } from './BaseApiClient.js';\n\n// ============ 导出 ============\n\nexport default {\n getConfig,\n initConfig,\n setApiBaseUrl,\n setWsBaseUrl,\n setDebug,\n resetConfig,\n subscribeConfig,\n initWithEnvironment,\n ENVIRONMENT_PRESETS,\n buildApiUrl,\n getToken,\n getRefreshToken,\n saveTokens,\n clearTokens,\n isAuthenticated,\n logger,\n useSDKConfig,\n // 语言管理\n getLanguage,\n setLanguage,\n initLanguage,\n subscribeLanguage,\n useLanguage,\n};\n\n"],"names":["getStoredToken","useState","useEffect","useCallback"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quantabit/sdk-config",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"
|
|
3
|
+
"version": "1.0.6",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "QuantaBit SDK 统一配置管理 - 所有SDK共享的API配置",
|
|
5
6
|
"main": "dist/index.js",
|
|
6
7
|
"module": "dist/index.esm.js",
|
|
7
8
|
"types": "dist/index.d.ts",
|
|
@@ -31,9 +32,16 @@
|
|
|
31
32
|
],
|
|
32
33
|
"author": "QuantaBit Team",
|
|
33
34
|
"license": "MIT",
|
|
34
|
-
"
|
|
35
|
-
"
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://github.com/quantabit-chain/qbit-sdk.git",
|
|
38
|
+
"directory": "packages/sdk-config"
|
|
36
39
|
},
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/quantabit-chain/qbit-sdk/issues"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://github.com/quantabit-chain/qbit-sdk#readme",
|
|
44
|
+
"dependencies": {},
|
|
37
45
|
"devDependencies": {
|
|
38
46
|
"@rollup/plugin-commonjs": "^25.0.0",
|
|
39
47
|
"@rollup/plugin-node-resolve": "^15.0.0",
|
|
@@ -45,18 +53,11 @@
|
|
|
45
53
|
"@rollup/plugin-babel": "^6.0.0",
|
|
46
54
|
"rollup-plugin-postcss": "^4.0.0"
|
|
47
55
|
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"react": ">=17.0.0"
|
|
58
|
+
},
|
|
48
59
|
"publishConfig": {
|
|
49
60
|
"access": "public",
|
|
50
61
|
"registry": "https://registry.npmjs.org"
|
|
51
|
-
},
|
|
52
|
-
"dependencies": {},
|
|
53
|
-
"repository": {
|
|
54
|
-
"type": "git",
|
|
55
|
-
"url": "https://github.com/quantabit-chain/qbit-sdk.git",
|
|
56
|
-
"directory": "packages/sdk-config"
|
|
57
|
-
},
|
|
58
|
-
"homepage": "https://github.com/quantabit-chain/qbit-sdk/tree/main/packages/sdk-config#readme",
|
|
59
|
-
"bugs": {
|
|
60
|
-
"url": "https://github.com/quantabit-chain/qbit-sdk/issues"
|
|
61
62
|
}
|
|
62
63
|
}
|