@kdcloudjs/kwc-shared-utils 0.0.3 → 0.0.5

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 ADDED
@@ -0,0 +1,109 @@
1
+ # KWC Shared Utils 使用文档
2
+
3
+ ## 概述
4
+ `@kdcloudjs/kwc-shared-utils` 是一个为 KWC 项目提供的共享工具库,包含:
5
+ - 客户端环境检测(`client`)
6
+ - 平台资源加载器(`platformResourceLoader`)
7
+ - OpenAPI 适配器与认证(`openApiAdapter`)
8
+ - 组件间消息中心(`messageService`)
9
+ - 其他实用模块(如 `kingdeeDataService`、`sendBosPlatformEvent`)
10
+
11
+ ## 安装
12
+ ```bash
13
+ npm install @kdcloudjs/kwc-shared-utils
14
+ ```
15
+
16
+ ## 导入
17
+ 支持 ES Module 和 CommonJS:
18
+ ```javascript
19
+ // ES Module
20
+ import { client, platformResourceLoader, openApiAdapter, messageService } from '@kdcloudjs/kwc-shared-utils'
21
+
22
+ // CommonJS
23
+ const { client, platformResourceLoader, openApiAdapter, messageService } = require('@kdcloudjs/kwc-shared-utils')
24
+ ```
25
+
26
+ ## 消息中心(发布-订阅)
27
+ 用于 React 组件与 Web Components 之间的解耦通信,支持本地与跨标签广播:
28
+ ```javascript
29
+ import { messageService } from '@kdcloudjs/kwc-shared-utils'
30
+
31
+ // 在组件实例上订阅(component 可为 React 组件实例或自定义元素实例)
32
+ const off = messageService.subscribe(component, 'user:login', (payload, { fromRemote }) => {
33
+ console.log('用户登录:', payload, '是否远程广播:', fromRemote)
34
+ })
35
+
36
+ // 发布消息(默认同时本地触发并跨标签广播)
37
+ messageService.publish('user:login', { id: 'u001', name: 'Alice' })
38
+
39
+ // 仅本地触发(不广播)
40
+ messageService.publish('user:login', { id: 'u001' }, { global: false })
41
+
42
+ // 取消订阅
43
+ off()
44
+
45
+ // 也可整体取消某组件在某事件上的订阅
46
+ messageService.unsubscribe(component, 'user:login')
47
+ ```
48
+ 特性:
49
+ - 使用 `BroadcastChannel`(自动降级到 `postMessage`)实现跨标签页/iframe 通信
50
+ - 每个组件实例的订阅以 `WeakMap` 管理,自动清理泄漏
51
+ - 错误隔离,单个订阅错误不会影响其他订阅者
52
+
53
+ ## OpenAPI 适配器与认证
54
+ 初始化认证并调用接口:
55
+ ```javascript
56
+ import { openApiAdapter } from '@kdcloudjs/kwc-shared-utils'
57
+
58
+ await openApiAdapter.initializeAuth({
59
+ endpoint: '/kapi/oauth2/getToken',
60
+ method: 'POST',
61
+ bodyParams: { /* appId、appSecret、nonce 等 */ },
62
+ // 仅内存存储(不持久化),无需也不接受其他存储策略
63
+ })
64
+
65
+ // 发起请求(示例:OpenAPI 服务调用)
66
+ const result = await openApiAdapter.doFetch({
67
+ endpointConfig: {
68
+ isv: 'kd', app: 'myapp', form: 'myform', serviceName: 'myservice', version: 'v2'
69
+ },
70
+ params: { query: 'test' }
71
+ })
72
+ ```
73
+
74
+ ### Token 存储安全
75
+ - 仅使用 `memory`(内存存储,不持久化),不支持 `session` 与 `local`,以最大限度降低 XSS 风险。
76
+ - 推荐由服务端设置 `HttpOnly`、`Secure`、`SameSite` 的 Cookie,通过接口换取临时访问令牌;前端不持久化 token。
77
+
78
+ ## 平台资源加载器
79
+ 动态加载外部脚本与样式:
80
+ ```javascript
81
+ import { platformResourceLoader } from '@kdcloudjs/kwc-shared-utils'
82
+
83
+ await platformResourceLoader.loadScript(document.head, 'https://example.com/script.js')
84
+ await platformResourceLoader.loadStyle(document.head, 'https://example.com/style.css')
85
+ ```
86
+ 特性:
87
+ - URL 级缓存,避免重复加载
88
+ - 支持 Promise 与回调
89
+
90
+ ## 客户端检测
91
+ 检测应用、浏览器与设备:
92
+ ```javascript
93
+ import { client } from '@kdcloudjs/kwc-shared-utils'
94
+
95
+ const appName = client.getAppName() // 'yunzhijia' | 'weixin' | 'dingding' 等
96
+ const isMobile = client.isMobile()
97
+ const browser = client.getBrowserName() // 'chrome' | 'edge' | 'safari' 等
98
+ ```
99
+
100
+ ## 构建与发布
101
+ 使用 Rollup 构建:
102
+ ```bash
103
+ npm run build
104
+ ```
105
+ 输出 `dist/`,含 CJS 与 ESM 两种格式,按模块分别打包并压缩。
106
+
107
+ ## 版本
108
+ - 当前版本:1.0.0
109
+ - 包名:`@kdcloudjs/kwc-shared-utils`
@@ -1,2 +1,2 @@
1
- "use strict";class t{constructor(){this.accessToken=null,this.refreshToken=null,this.isInitialized=!1,this.isAuthenticating=!1,this.authPromise=null,this.authConfig=null,this.listeners=new Set,this.loadTokensFromStorage()}async initialize(t){if(this.isInitialized&&this.accessToken)return!0;this.authConfig={endpoint:t.endpoint||"/kapi/oauth2/getToken",method:t.method||"POST",headers:t.headers||{"Content-Type":"application/json"},body:t.bodyParams||{},params:t.queryParams||{}};try{await this.authenticate(),this.isInitialized=!0,this.notifyListeners("initialized",{success:!0})}catch(t){throw console.error("AuthManager: Failed to initialize auth - ",t),this.notifyListeners("initialized",{success:!1,error:t}),t}}async authenticate(){if(this.isAuthenticating&&this.authPromise)return this.authPromise;this.isAuthenticating=!0,this.authPromise=this._performAuthentication();try{const t=await this.authPromise;return this.notifyListeners("authenticated",{success:!0}),t}catch(t){throw this.notifyListeners("authenticated",{success:!1,error:t}),t}finally{this.isAuthenticating=!1,this.authPromise=null}}async _performAuthentication(){if(!this.authConfig)throw new Error("Authentication configuration is missing.");const{endpoint:t,headers:e,body:s,method:a}=this.authConfig;try{const i=await fetch(t,{method:a,headers:e,body:JSON.stringify(s)});if(!i.ok)throw new Error(`Authentication failed: ${i.status} - ${i.statusText}`);const r=await i.json();if(!0===r.status&&"0"===r.errorCode)return this.accessToken=r.data.access_token,this.refreshToken=r.data.refresh_token,this.saveTokensToStorage(),r;throw new Error(`Authentication failed: ${r.errorCode} - ${r.message}`)}catch(t){throw console.error("AuthManager: Authentication failed -",t),t}}async refreshAccessToken(){return console.log("AuthManager: Refreshing access token..."),this.authConfig.body.nonce=this.generateNonce(),this.authConfig.body.timestamp=this.formatTimestamp(),this._performAuthentication()}generateNonce(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){const e=16*Math.random()|0;return("x"==t?e:3&e|8).toString(16)})}formatTimestamp(t=new Date){return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`}getAccessToken(){return this.accessToken}isAuthenticated(){return!!this.accessToken}isReady(){return this.isInitialized&&this.isAuthenticated()}logout(){this.clearTokens(),this.isInitialized=!1,this.authConfig=null,this.notifyListeners("logout",{})}clearTokens(){this.accessToken=null,this.refreshToken=null,this.clearTokensFromStorage()}loadTokensFromStorage(){try{this.accessToken=localStorage.getItem("__kapi_auth_manager_access_token__"),this.refreshToken=localStorage.getItem("__kapi_auth_manager_refresh_token__")}catch(t){console.warn("AuthManager: Error loading tokens from storage")}}saveTokensToStorage(){try{this.accessToken&&localStorage.setItem("__kapi_auth_manager_access_token__",this.accessToken),this.refreshToken&&localStorage.setItem("__kapi_auth_manager_refresh_token__",this.refreshToken)}catch(t){console.warn("AuthManager: Error saving tokens to storage")}}clearTokensFromStorage(){try{localStorage.removeItem("__kapi_auth_manager_access_token__"),localStorage.removeItem("__kapi_auth_manager_refresh_token__")}catch(t){console.warn("AuthManager: Error removing tokens to storage")}}addListener(t){this.listeners.add(t)}removeListener(t){this.listeners.delete(t)}notifyListeners(t,e){this.listeners.forEach(s=>{try{s(t,e)}catch(t){console.error("AuthManager: Error notifying listener")}})}async waitForAuth(){return!this.isAuthenticated()||(this.isAuthenticating&&this.authPromise?(await this.authPromise,this.isAuthenticated()):void 0)}}const e=new t;class s{constructor(t){this.name="BosWireAdapter",this.dataCallback=t,this.config={},this.abortController=null,this.retryCount=0,this.maxRetries=3,this.retryDelay=1e3,this.cache=new Map,this.cacheTimeout=3e5,this.authManager=e,this.pendingRequests=new Map,this.requestQueue=[],this.isProcessingQueue=!1}connect(){}update(t){this.config={...t},this.retryCount=0,this.shouldFetchData(t)?this.fetchDataWithQueue(t):this.dataCallback({data:null,error:null})}disconnect(){this.abortController&&this.abortController.abort(),this.cache.clear(),this.pendingRequests.clear(),this.requestQueue=[],this.isProcessingQueue=!1}async waitForAuth(){try{return this.authManager.isReady()||await this.authManager.waitForAuth(),!0}catch(t){throw t}}getAccessToken(){return this.authManager.getAccessToken()}isAuthenticated(){return this.authManager.isAuthenticated()}shouldFetchData(t){return t&&t.endpoint&&void 0!==t.endpoint}async fetchDataWithQueue(t){const e=this.generateRequestKey(t);if(this.pendingRequests.has(e))console.log("Request is inqueue");else{this.requestQueue.push({config:t,requestKey:e,callback:this.callback}),this.pendingRequests.set(e,!0);try{await this.authManager.waitForAuth()}catch(t){return console.error("Bos Adapter: Authentication failed, no need to send any request"),this.dataCallback({data:null,error:{message:`Auth failed: ${t.message}`,status:"AUTH_FAILED",originalError:t}}),void this.pendingRequests.delete(e)}this.isProcessingQueue||this.processRequestQueue()}}async processRequestQueue(){for(this.isProcessingQueue=!0;this.requestQueue.length>0;){const t=this.requestQueue.shift();try{await this.fetchDataWithRetry(t.config)}catch(t){console.error("Error fetching data:",t)}finally{this.pendingRequests.delete(t.requestKey)}await this.delay(10)}this.isProcessingQueue=!1}async fetchDataWithRetry(t){const e=this.generateCacheKey(t);if(this.getCachedData(e))return void this.dataCallback(cacheData);let s=null;for(let a=0;a<this.maxRetries;a++)try{const s=await this.performRequest(t);return this.setCacheData(e,s),void this.dataCallback(s)}catch(t){s=t,a<this.maxRetries&&await this.delay(this.retryDelay*Math.pow(2,a))}this.dataCallback({data:null,error:{message:s.message,status:s.status||"NETWORK_ERROR",retries:this.maxRetries}})}async performRequest(t){const{endpoint:e,method:s="GET",params:a={},headers:i={}}=t;this.abortController&&this.abortController.abort(),this.abortController=new AbortController;let r=e;if("GET"===s&&a){r=`${r}?${new URLSearchParams(a).toString()}`}const n={method:s,headers:{"Content-Type":"application/json",access_token:this.authManager.getAccessToken(),...i},body:"GET"===s?null:JSON.stringify(a),signal:this.abortController.signal},o=await fetch(r,n);if(!o.ok)throw new Error(`HTTP error! Status: ${o.status} - ${o.statusText}`);const h=await o.json();return h?{data:h,error:null}:{data:null,error:{message:h.message,errorCode:h.errorCode,status:h.status}}}getCachedData(t){const e=this.cache.get(t);return e&&Date.now()-e.timestamp<this.cacheTimeout?e.data:(e&&this.cache.delete(t),null)}setCacheData(t,e){if(this.cache.set(t,{data:e,timestamp:Date.now()}),this.cache.size>100){const t=this.cache.keys().next().value;this.cache.delete(t)}}generateCacheKey(t){return JSON.stringify({endpoint:t.endpoint,params:t.params,method:t.method||"GET"})}generateRequestKey(t){return this.generateCacheKey(t)}delay(t){return new Promise(e=>setTimeout(e,t))}static clearAllCache(){this.cache=new Map}static configure(t){void 0!==t.maxRetries&&(BosWireAdapter.prototype.maxRetries=t.maxRetries),void 0!==t.retryDelay&&(BosWireAdapter.prototype.retryDelay=t.retryDelay),void 0!==t.cacheTimeout&&(BosWireAdapter.prototype.cacheTimeout=t.cacheTimeout)}}function a(t="GET",e={}){return function(a){if("function"==typeof a){const r=new s(a),n=r.update.bind(r);return r.update=function(s){const a={endpoint:i(s,e),method:t,...e,...s};return delete a.endpointConfig,s&&"object"==typeof s&&!s.endpoint&&(a.params=s.params),n(a)},r}return async function(t,e,a){const r={endpoint:i(a,e),method:t,...e,...a};delete r.endpointConfig,a&&"object"==typeof a&&!a.endpoint&&(r.params=a.params);return new Promise((t,e)=>{const a=new s(s=>{s.error?e(s.error):t(s)});a.connect(),a.update(r)})}(t,e,a||{})}}function i(t,e){if(!t&&!e)throw new Error("No config provided");if(!t.endpointConfig&&!e.endpointConfig)throw new Error("No endpointConfig provided");let s=t.endpointConfig,a=e.endpointConfig;if("string"==typeof s)return s;if("string"==typeof a)return a;if(s&&s.endpoint)return s.endpoint;if(a&&a.endpoint)return a.endpoint;s=s||{},a=a||{};const i=s.isv||a.isv||"kd",r=s.app||a.app,n=s.source||a.source,o=s.version||a.version||"v1",h=s.sourceId||a.sourceId,c=s.subSource||a.subSource,u=s.action||a.action;if(!r)throw new Error("Invalid config app provided");if(!n)throw new Error("Invalid config source provided");let l=`${location.pathname}kwc/${o}/${i}/${r}/${n}`;return h&&(l+=`/${h}`,c&&(l+=`/${c}`),u&&(l+=`/${u}`)),l.startsWith("/")||(l=`/${l}`),l}const r=a("GET"),n=a("POST"),o=a("DELETE"),h=a("PUT"),c=a("PATCH");exports.AuthManager=t,exports.authManager=e,exports.doDelete=o,exports.doGet=r,exports.doPatch=c,exports.doPost=n,exports.doPut=h,exports.initializeAuth=async function(t){return await e.initialize(t)},exports.isAuthenticated=function(){return e.isAuthenticated()};
1
+ "use strict";var e=require("../shared/index-C96d8r7U.cjs.js");exports.AuthManager=e.AuthManager,exports.adapterApi=e.adapterApi,exports.authManager=e.authManager,exports.initializeAuth=e.initializeAuth,exports.isAuthenticated=e.isAuthenticated,exports.promiseApi=e.promiseApi;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../src/modules/api/authManager.js","../../src/modules/api/adapter.js","../../src/modules/api/factory.js"],"sourcesContent":["/**\n * Global open api auth manager\n */\n\nclass AuthManager {\n constructor() {\n this.accessToken = null;\n this.refreshToken = null;\n this.isInitialized = false;\n this.isAuthenticating = false;\n this.authPromise = null;\n this.authConfig = null;\n this.listeners = new Set();\n\n // Try to load tokens from storage\n this.loadTokensFromStorage();\n }\n\n async initialize(config) {\n if (this.isInitialized && this.accessToken) {\n return true;\n }\n\n this.authConfig = {\n endpoint: config.endpoint || '/kapi/oauth2/getToken',\n method: config.method || 'POST',\n headers: config.headers || {\n 'Content-Type': 'application/json'\n },\n body: config.bodyParams || {},\n params: config.queryParams || {}\n };\n\n try {\n await this.authenticate();\n this.isInitialized = true;\n this.notifyListeners('initialized', { success: true });\n } catch (error) {\n console.error('AuthManager: Failed to initialize auth - ', error);\n this.notifyListeners('initialized', { success: false, error });\n throw error;\n }\n }\n\n async authenticate() {\n if (this.isAuthenticating && this.authPromise) {\n return this.authPromise;\n }\n\n this.isAuthenticating = true;\n this.authPromise = this._performAuthentication();\n\n try {\n const result = await this.authPromise;\n this.notifyListeners('authenticated', { success: true });\n return result;\n } catch (error) {\n this.notifyListeners('authenticated', { success: false, error });\n throw error;\n } finally {\n this.isAuthenticating = false;\n this.authPromise = null;\n }\n }\n\n async _performAuthentication() {\n if (!this.authConfig) {\n throw new Error('Authentication configuration is missing.');\n }\n\n const { endpoint, headers, body, method } = this.authConfig;\n try {\n const response = await fetch(endpoint, {\n method,\n headers,\n body: JSON.stringify(body)\n });\n\n if (!response.ok) {\n throw new Error(`Authentication failed: ${response.status} - ${response.statusText}`);\n }\n\n const authData = await response.json();\n if (authData.status === true && authData.errorCode === '0') {\n this.accessToken = authData.data.access_token;\n this.refreshToken = authData.data.refresh_token;\n\n this.saveTokensToStorage();\n\n return authData;\n }\n throw new Error(`Authentication failed: ${authData.errorCode} - ${authData.message}`);\n } catch (error) {\n console.error('AuthManager: Authentication failed -', error);\n throw error;\n }\n }\n\n async refreshAccessToken() {\n console.log('AuthManager: Refreshing access token...')\n this.authConfig.body.nonce = this.generateNonce();\n this.authConfig.body.timestamp = this.formatTimestamp();\n return this._performAuthentication();\n }\n\n // 生成随机UUID作为nonce\n generateNonce() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = Math.random() * 16 | 0;\n const v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n // 格式化时间戳为 YYYY-MM-DD HH:mm:ss 格式\n formatTimestamp(date = new Date()) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n }\n\n getAccessToken() {\n return this.accessToken;\n }\n\n isAuthenticated() {\n return !!this.accessToken;\n }\n\n isReady() {\n return this.isInitialized && this.isAuthenticated();\n }\n\n logout() {\n this.clearTokens();\n this.isInitialized = false;\n this.authConfig = null;\n this.notifyListeners('logout', {});\n }\n\n clearTokens() {\n this.accessToken = null;\n this.refreshToken = null;\n this.clearTokensFromStorage();\n }\n\n loadTokensFromStorage() {\n try {\n this.accessToken = localStorage.getItem('__kapi_auth_manager_access_token__');\n this.refreshToken = localStorage.getItem('__kapi_auth_manager_refresh_token__');\n } catch (error) {\n console.warn('AuthManager: Error loading tokens from storage');\n }\n }\n\n saveTokensToStorage() {\n try {\n if (this.accessToken) {\n localStorage.setItem('__kapi_auth_manager_access_token__', this.accessToken);\n }\n\n if (this.refreshToken) {\n localStorage.setItem('__kapi_auth_manager_refresh_token__', this.refreshToken);\n }\n } catch (error) {\n console.warn('AuthManager: Error saving tokens to storage');\n }\n }\n\n clearTokensFromStorage() {\n try {\n localStorage.removeItem('__kapi_auth_manager_access_token__');\n localStorage.removeItem('__kapi_auth_manager_refresh_token__');\n } catch (error) {\n console.warn('AuthManager: Error removing tokens to storage');\n }\n }\n\n addListener(callback) {\n this.listeners.add(callback);\n }\n\n removeListener(callback) {\n this.listeners.delete(callback);\n }\n\n notifyListeners(event, data) {\n this.listeners.forEach((listener) => {\n try {\n listener(event, data);\n } catch (error) {\n console.error('AuthManager: Error notifying listener')\n }\n });\n }\n\n async waitForAuth() {\n if (!this.isAuthenticated()) {\n return true;\n }\n\n if (this.isAuthenticating && this.authPromise) {\n await this.authPromise;\n return this.isAuthenticated();\n }\n }\n}\n\nconst authManager = new AuthManager();\n\nexport { authManager, AuthManager };\nexport default authManager;\n\nexport async function initializeAuth(config) {\n return await authManager.initialize(config);\n}\n\nexport function isAuthenticated() {\n return authManager.isAuthenticated();\n}\n","import authManager from \"./authManager\";\n\nexport default class Adapter {\n constructor(dataCallback) {\n this.name = 'BosWireAdapter';\n\n this.dataCallback = dataCallback;\n this.config = {};\n this.abortController = null;\n\n this.retryCount = 0; // current retry count\n this.maxRetries = 3; // max retry times\n this.retryDelay = 1000;\n this.cache = new Map();\n this.cacheTimeout = 5 * 60 * 1000; // cache timeout in milliseconds, default is 5mins\n\n this.authManager = authManager;\n\n // Request queue\n this.pendingRequests = new Map();\n this.requestQueue = [];\n this.isProcessingQueue = false;\n }\n\n // Lifecycle - create connect\n connect() {}\n\n // Lifecycle - update data\n update(config) {\n this.config = { ...config };\n this.retryCount = 0;\n\n if (this.shouldFetchData(config)) {\n this.fetchDataWithQueue(config);\n } else {\n this.dataCallback({ data: null, error: null });\n }\n }\n\n // Lifecycle - destroy\n disconnect() {\n if (this.abortController) {\n this.abortController.abort();\n }\n\n this.cache.clear();\n this.pendingRequests.clear();\n this.requestQueue = [];\n this.isProcessingQueue = false;\n }\n\n async waitForAuth() {\n try {\n if (!this.authManager.isReady()) {\n await this.authManager.waitForAuth();\n }\n return true;\n } catch(error) {\n throw error;\n }\n }\n\n getAccessToken() {\n return this.authManager.getAccessToken();\n }\n\n isAuthenticated() {\n return this.authManager.isAuthenticated();\n }\n\n shouldFetchData (config) {\n return config && config.endpoint && config.endpoint !== undefined;\n }\n\n async fetchDataWithQueue(config) {\n const requestKey = this.generateRequestKey(config);\n\n if (this.pendingRequests.has(requestKey)) {\n console.log('Request is inqueue');\n return;\n }\n\n this.requestQueue.push({ config, requestKey, callback: this.callback });\n this.pendingRequests.set(requestKey, true);\n\n try {\n await this.authManager.waitForAuth();\n } catch (error) {\n console.error('Bos Adapter: Authentication failed, no need to send any request');\n this.dataCallback({\n data: null,\n error: {\n message: `Auth failed: ${error.message}`,\n status: 'AUTH_FAILED',\n originalError: error\n }\n });\n this.pendingRequests.delete(requestKey);\n return;\n }\n\n if (!this.isProcessingQueue) {\n this.processRequestQueue();\n }\n }\n\n async processRequestQueue() { \n this.isProcessingQueue = true;\n while (this.requestQueue.length > 0) {\n const request = this.requestQueue.shift();\n try {\n await this.fetchDataWithRetry(request.config);\n } catch (error) {\n console.error('Error fetching data:', error)\n } finally {\n this.pendingRequests.delete(request.requestKey);\n }\n\n // avoid too fast\n await this.delay(10);\n }\n this.isProcessingQueue = false;\n }\n\n async fetchDataWithRetry(config) { \n const cacheKey = this.generateCacheKey(config);\n \n const cachedData = this.getCachedData(cacheKey);\n if (cachedData) {\n this.dataCallback(cacheData);\n return;\n }\n\n let lastError = null;\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n const result = await this.performRequest(config);\n\n this.setCacheData(cacheKey, result);\n this.dataCallback(result);\n return;\n } catch (error) {\n lastError = error;\n\n if (attempt < this.maxRetries) {\n await this.delay(this.retryDelay * Math.pow(2, attempt));\n }\n }\n }\n\n this.dataCallback({\n data: null,\n error: {\n message: lastError.message,\n status: lastError.status || 'NETWORK_ERROR',\n retries: this.maxRetries\n }\n })\n }\n\n async performRequest(config) {\n const { endpoint, method = 'GET', params = {}, headers = {} } = config;\n\n if (this.abortController) {\n this.abortController.abort();\n }\n\n this.abortController = new AbortController();\n\n let url = endpoint;\n if (method === 'GET' && params) {\n const searchParams = new URLSearchParams(params);\n url = `${url}?${searchParams.toString()}`\n }\n\n const requestOptions = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'access_token': this.authManager.getAccessToken(),\n ...headers\n },\n body: method === 'GET' ? null : JSON.stringify(params),\n signal: this.abortController.signal\n }\n\n const response = await fetch(url, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status} - ${response.statusText}`);\n }\n\n const data = await response.json();\n if (data) {\n return { data: data, error: null };\n }\n\n return {\n data: null,\n error: {\n message: data.message,\n errorCode: data.errorCode,\n status: data.status\n }\n }\n }\n\n getCachedData(cacheKey) {\n const cached = this.cache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < this.cacheTimeout) {\n return cached.data;\n }\n\n if (cached) {\n this.cache.delete(cacheKey);\n }\n return null;\n }\n\n setCacheData(cacheKey, data) {\n this.cache.set(cacheKey, {\n data,\n timestamp: Date.now(),\n });\n\n if (this.cache.size > 100) {\n const firstKey = this.cache.keys().next().value;\n this.cache.delete(firstKey);\n }\n }\n\n generateCacheKey(config) {\n return JSON.stringify({\n endpoint: config.endpoint,\n params: config.params,\n method: config.method || 'GET'\n })\n }\n\n generateRequestKey(config) {\n return this.generateCacheKey(config);\n }\n\n delay(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n static clearAllCache() {\n this.cache = new Map();\n }\n\n static configure(options) {\n if (options.maxRetries !== undefined) {\n BosWireAdapter.prototype.maxRetries = options.maxRetries;\n }\n\n if (options.retryDelay !== undefined) {\n BosWireAdapter.prototype.retryDelay = options.retryDelay;\n }\n\n if (options.cacheTimeout !== undefined) {\n BosWireAdapter.prototype.cacheTimeout = options.cacheTimeout;\n }\n }\n}\n","import OpenApiWireAdapter from \"./adapter\";\n\nfunction createWireAdapter(defaultMethod = 'GET', defaultConfig = {}) {\n function wireAdapterFunction(configOrDataCallback) {\n if (typeof configOrDataCallback === 'function') {\n const adapter = new OpenApiWireAdapter(configOrDataCallback);\n\n const originalUpdate = adapter.update.bind(adapter);\n adapter.update = function (config) {\n const fullConfig = {\n endpoint: getEndpoint(config, defaultConfig),\n method: defaultMethod,\n ...defaultConfig,\n ...config\n }\n delete fullConfig.endpointConfig;\n\n if (config && typeof config === 'object' && !config.endpoint) {\n fullConfig.params = config.params;\n }\n\n return originalUpdate(fullConfig);\n }\n return adapter;\n } else {\n const config = configOrDataCallback || {};\n return createPromiseCall(defaultMethod, defaultConfig, config);\n }\n\n }\n return wireAdapterFunction;\n}\n\n// 创建 Promise 调用的辅助函数\nasync function createPromiseCall(defaultMethod, defaultConfig, config) {\n // 等待认证完成\n // await authManager.waitForAuth();\n\n // 合并默认配置和传入的配置\n const fullConfig = {\n endpoint: getEndpoint(config, defaultConfig),\n method: defaultMethod,\n ...defaultConfig,\n ...config\n }\n delete fullConfig.endpointConfig;\n\n // 如果传入的是 params,直接使用\n if (config && typeof config === 'object' && !config.endpoint) {\n fullConfig.params = config.params;\n }\n\n return new Promise((resolve, reject) => {\n const adapter = new OpenApiWireAdapter((result) => {\n if (result.error) {\n reject(result.error);\n } else {\n resolve(result);\n }\n });\n\n // 连接并更新配置\n adapter.connect();\n adapter.update(fullConfig);\n });\n}\n\nfunction getEndpoint(config, defaultConfig) {\n if (!config && !defaultConfig) {\n throw new Error('No config provided');\n }\n\n if (!config.endpointConfig && !defaultConfig.endpointConfig) {\n throw new Error('No endpointConfig provided');\n }\n\n let endpointConfig = config.endpointConfig;\n let defaultEndpointConfig = defaultConfig.endpointConfig;\n if (typeof endpointConfig === 'string') return endpointConfig;\n if (typeof defaultEndpointConfig === 'string') return defaultEndpointConfig;\n\n if (endpointConfig && endpointConfig.endpoint) {\n return endpointConfig.endpoint;\n }\n\n if (defaultEndpointConfig && defaultEndpointConfig.endpoint) {\n return defaultEndpointConfig.endpoint;\n }\n\n endpointConfig = endpointConfig || {};\n defaultEndpointConfig = defaultEndpointConfig || {};\n\n const isv = endpointConfig.isv || defaultEndpointConfig.isv || 'kd';\n const app = endpointConfig.app || defaultEndpointConfig.app;\n const source = endpointConfig.source || defaultEndpointConfig.source;\n const version = endpointConfig.version || defaultEndpointConfig.version || 'v1';\n const sourceId = endpointConfig.sourceId || defaultEndpointConfig.sourceId;\n const subSource = endpointConfig.subSource || defaultEndpointConfig.subSource;\n const action = endpointConfig.action || defaultEndpointConfig.action;\n\n if (!app) {\n throw new Error('Invalid config app provided');\n }\n\n if (!source) {\n throw new Error('Invalid config source provided');\n }\n\n let result = `${location.pathname}kwc/${version}/${isv}/${app}/${source}`\n if (sourceId) {\n result += `/${sourceId}`\n\n if (subSource) {\n result += `/${subSource}`\n }\n\n if (action) {\n result += `/${action}`\n }\n }\n\n if (!result.startsWith('/')) {\n result = `/${result}`\n }\n\n return result\n}\n\n\nexport const doGet = createWireAdapter('GET')\nexport const doPost = createWireAdapter('POST')\nexport const doDelete = createWireAdapter('DELETE')\nexport const doPut = createWireAdapter('PUT')\nexport const doPatch = createWireAdapter('PATCH')\n"],"names":["AuthManager","constructor","this","accessToken","refreshToken","isInitialized","isAuthenticating","authPromise","authConfig","listeners","Set","loadTokensFromStorage","initialize","config","endpoint","method","headers","body","bodyParams","params","queryParams","authenticate","notifyListeners","success","error","console","_performAuthentication","result","Error","response","fetch","JSON","stringify","ok","status","statusText","authData","json","errorCode","data","access_token","refresh_token","saveTokensToStorage","message","refreshAccessToken","log","nonce","generateNonce","timestamp","formatTimestamp","replace","c","r","Math","random","toString","date","Date","getFullYear","String","getMonth","padStart","getDate","getHours","getMinutes","getSeconds","getAccessToken","isAuthenticated","isReady","logout","clearTokens","clearTokensFromStorage","localStorage","getItem","warn","setItem","removeItem","addListener","callback","add","removeListener","delete","event","forEach","listener","waitForAuth","authManager","Adapter","dataCallback","name","abortController","retryCount","maxRetries","retryDelay","cache","Map","cacheTimeout","pendingRequests","requestQueue","isProcessingQueue","connect","update","shouldFetchData","fetchDataWithQueue","disconnect","abort","clear","undefined","requestKey","generateRequestKey","has","push","set","originalError","processRequestQueue","length","request","shift","fetchDataWithRetry","delay","cacheKey","generateCacheKey","getCachedData","cacheData","lastError","attempt","performRequest","setCacheData","pow","retries","AbortController","url","URLSearchParams","requestOptions","signal","cached","get","now","size","firstKey","keys","next","value","ms","Promise","resolve","setTimeout","clearAllCache","configure","options","BosWireAdapter","prototype","createWireAdapter","defaultMethod","defaultConfig","configOrDataCallback","adapter","OpenApiWireAdapter","originalUpdate","bind","fullConfig","getEndpoint","endpointConfig","async","reject","createPromiseCall","defaultEndpointConfig","isv","app","source","version","sourceId","subSource","action","location","pathname","startsWith","doGet","doPost","doDelete","doPut","doPatch"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,2 +1,2 @@
1
- class t{constructor(){this.accessToken=null,this.refreshToken=null,this.isInitialized=!1,this.isAuthenticating=!1,this.authPromise=null,this.authConfig=null,this.listeners=new Set,this.loadTokensFromStorage()}async initialize(t){if(this.isInitialized&&this.accessToken)return!0;this.authConfig={endpoint:t.endpoint||"/kapi/oauth2/getToken",method:t.method||"POST",headers:t.headers||{"Content-Type":"application/json"},body:t.bodyParams||{},params:t.queryParams||{}};try{await this.authenticate(),this.isInitialized=!0,this.notifyListeners("initialized",{success:!0})}catch(t){throw console.error("AuthManager: Failed to initialize auth - ",t),this.notifyListeners("initialized",{success:!1,error:t}),t}}async authenticate(){if(this.isAuthenticating&&this.authPromise)return this.authPromise;this.isAuthenticating=!0,this.authPromise=this._performAuthentication();try{const t=await this.authPromise;return this.notifyListeners("authenticated",{success:!0}),t}catch(t){throw this.notifyListeners("authenticated",{success:!1,error:t}),t}finally{this.isAuthenticating=!1,this.authPromise=null}}async _performAuthentication(){if(!this.authConfig)throw new Error("Authentication configuration is missing.");const{endpoint:t,headers:e,body:s,method:a}=this.authConfig;try{const i=await fetch(t,{method:a,headers:e,body:JSON.stringify(s)});if(!i.ok)throw new Error(`Authentication failed: ${i.status} - ${i.statusText}`);const r=await i.json();if(!0===r.status&&"0"===r.errorCode)return this.accessToken=r.data.access_token,this.refreshToken=r.data.refresh_token,this.saveTokensToStorage(),r;throw new Error(`Authentication failed: ${r.errorCode} - ${r.message}`)}catch(t){throw console.error("AuthManager: Authentication failed -",t),t}}async refreshAccessToken(){return console.log("AuthManager: Refreshing access token..."),this.authConfig.body.nonce=this.generateNonce(),this.authConfig.body.timestamp=this.formatTimestamp(),this._performAuthentication()}generateNonce(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){const e=16*Math.random()|0;return("x"==t?e:3&e|8).toString(16)})}formatTimestamp(t=new Date){return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`}getAccessToken(){return this.accessToken}isAuthenticated(){return!!this.accessToken}isReady(){return this.isInitialized&&this.isAuthenticated()}logout(){this.clearTokens(),this.isInitialized=!1,this.authConfig=null,this.notifyListeners("logout",{})}clearTokens(){this.accessToken=null,this.refreshToken=null,this.clearTokensFromStorage()}loadTokensFromStorage(){try{this.accessToken=localStorage.getItem("__kapi_auth_manager_access_token__"),this.refreshToken=localStorage.getItem("__kapi_auth_manager_refresh_token__")}catch(t){console.warn("AuthManager: Error loading tokens from storage")}}saveTokensToStorage(){try{this.accessToken&&localStorage.setItem("__kapi_auth_manager_access_token__",this.accessToken),this.refreshToken&&localStorage.setItem("__kapi_auth_manager_refresh_token__",this.refreshToken)}catch(t){console.warn("AuthManager: Error saving tokens to storage")}}clearTokensFromStorage(){try{localStorage.removeItem("__kapi_auth_manager_access_token__"),localStorage.removeItem("__kapi_auth_manager_refresh_token__")}catch(t){console.warn("AuthManager: Error removing tokens to storage")}}addListener(t){this.listeners.add(t)}removeListener(t){this.listeners.delete(t)}notifyListeners(t,e){this.listeners.forEach(s=>{try{s(t,e)}catch(t){console.error("AuthManager: Error notifying listener")}})}async waitForAuth(){return!this.isAuthenticated()||(this.isAuthenticating&&this.authPromise?(await this.authPromise,this.isAuthenticated()):void 0)}}const e=new t;async function s(t){return await e.initialize(t)}function a(){return e.isAuthenticated()}class i{constructor(t){this.name="BosWireAdapter",this.dataCallback=t,this.config={},this.abortController=null,this.retryCount=0,this.maxRetries=3,this.retryDelay=1e3,this.cache=new Map,this.cacheTimeout=3e5,this.authManager=e,this.pendingRequests=new Map,this.requestQueue=[],this.isProcessingQueue=!1}connect(){}update(t){this.config={...t},this.retryCount=0,this.shouldFetchData(t)?this.fetchDataWithQueue(t):this.dataCallback({data:null,error:null})}disconnect(){this.abortController&&this.abortController.abort(),this.cache.clear(),this.pendingRequests.clear(),this.requestQueue=[],this.isProcessingQueue=!1}async waitForAuth(){try{return this.authManager.isReady()||await this.authManager.waitForAuth(),!0}catch(t){throw t}}getAccessToken(){return this.authManager.getAccessToken()}isAuthenticated(){return this.authManager.isAuthenticated()}shouldFetchData(t){return t&&t.endpoint&&void 0!==t.endpoint}async fetchDataWithQueue(t){const e=this.generateRequestKey(t);if(this.pendingRequests.has(e))console.log("Request is inqueue");else{this.requestQueue.push({config:t,requestKey:e,callback:this.callback}),this.pendingRequests.set(e,!0);try{await this.authManager.waitForAuth()}catch(t){return console.error("Bos Adapter: Authentication failed, no need to send any request"),this.dataCallback({data:null,error:{message:`Auth failed: ${t.message}`,status:"AUTH_FAILED",originalError:t}}),void this.pendingRequests.delete(e)}this.isProcessingQueue||this.processRequestQueue()}}async processRequestQueue(){for(this.isProcessingQueue=!0;this.requestQueue.length>0;){const t=this.requestQueue.shift();try{await this.fetchDataWithRetry(t.config)}catch(t){console.error("Error fetching data:",t)}finally{this.pendingRequests.delete(t.requestKey)}await this.delay(10)}this.isProcessingQueue=!1}async fetchDataWithRetry(t){const e=this.generateCacheKey(t);if(this.getCachedData(e))return void this.dataCallback(cacheData);let s=null;for(let a=0;a<this.maxRetries;a++)try{const s=await this.performRequest(t);return this.setCacheData(e,s),void this.dataCallback(s)}catch(t){s=t,a<this.maxRetries&&await this.delay(this.retryDelay*Math.pow(2,a))}this.dataCallback({data:null,error:{message:s.message,status:s.status||"NETWORK_ERROR",retries:this.maxRetries}})}async performRequest(t){const{endpoint:e,method:s="GET",params:a={},headers:i={}}=t;this.abortController&&this.abortController.abort(),this.abortController=new AbortController;let r=e;if("GET"===s&&a){r=`${r}?${new URLSearchParams(a).toString()}`}const n={method:s,headers:{"Content-Type":"application/json",access_token:this.authManager.getAccessToken(),...i},body:"GET"===s?null:JSON.stringify(a),signal:this.abortController.signal},o=await fetch(r,n);if(!o.ok)throw new Error(`HTTP error! Status: ${o.status} - ${o.statusText}`);const h=await o.json();return h?{data:h,error:null}:{data:null,error:{message:h.message,errorCode:h.errorCode,status:h.status}}}getCachedData(t){const e=this.cache.get(t);return e&&Date.now()-e.timestamp<this.cacheTimeout?e.data:(e&&this.cache.delete(t),null)}setCacheData(t,e){if(this.cache.set(t,{data:e,timestamp:Date.now()}),this.cache.size>100){const t=this.cache.keys().next().value;this.cache.delete(t)}}generateCacheKey(t){return JSON.stringify({endpoint:t.endpoint,params:t.params,method:t.method||"GET"})}generateRequestKey(t){return this.generateCacheKey(t)}delay(t){return new Promise(e=>setTimeout(e,t))}static clearAllCache(){this.cache=new Map}static configure(t){void 0!==t.maxRetries&&(BosWireAdapter.prototype.maxRetries=t.maxRetries),void 0!==t.retryDelay&&(BosWireAdapter.prototype.retryDelay=t.retryDelay),void 0!==t.cacheTimeout&&(BosWireAdapter.prototype.cacheTimeout=t.cacheTimeout)}}function r(t="GET",e={}){return function(s){if("function"==typeof s){const a=new i(s),r=a.update.bind(a);return a.update=function(s){const a={endpoint:n(s,e),method:t,...e,...s};return delete a.endpointConfig,s&&"object"==typeof s&&!s.endpoint&&(a.params=s.params),r(a)},a}return async function(t,e,s){const a={endpoint:n(s,e),method:t,...e,...s};delete a.endpointConfig,s&&"object"==typeof s&&!s.endpoint&&(a.params=s.params);return new Promise((t,e)=>{const s=new i(s=>{s.error?e(s.error):t(s)});s.connect(),s.update(a)})}(t,e,s||{})}}function n(t,e){if(!t&&!e)throw new Error("No config provided");if(!t.endpointConfig&&!e.endpointConfig)throw new Error("No endpointConfig provided");let s=t.endpointConfig,a=e.endpointConfig;if("string"==typeof s)return s;if("string"==typeof a)return a;if(s&&s.endpoint)return s.endpoint;if(a&&a.endpoint)return a.endpoint;s=s||{},a=a||{};const i=s.isv||a.isv||"kd",r=s.app||a.app,n=s.source||a.source,o=s.version||a.version||"v1",h=s.sourceId||a.sourceId,c=s.subSource||a.subSource,u=s.action||a.action;if(!r)throw new Error("Invalid config app provided");if(!n)throw new Error("Invalid config source provided");let l=`${location.pathname}kwc/${o}/${i}/${r}/${n}`;return h&&(l+=`/${h}`,c&&(l+=`/${c}`),u&&(l+=`/${u}`)),l.startsWith("/")||(l=`/${l}`),l}const o=r("GET"),h=r("POST"),c=r("DELETE"),u=r("PUT"),l=r("PATCH");export{t as AuthManager,e as authManager,c as doDelete,o as doGet,l as doPatch,h as doPost,u as doPut,s as initializeAuth,a as isAuthenticated};
1
+ export{A as AuthManager,a as adapterApi,b as authManager,c as initializeAuth,d as isAuthenticated,p as promiseApi}from"../shared/index-RQMVLnNM.esm.js";
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../src/modules/api/authManager.js","../../src/modules/api/adapter.js","../../src/modules/api/factory.js"],"sourcesContent":["/**\n * Global open api auth manager\n */\n\nclass AuthManager {\n constructor() {\n this.accessToken = null;\n this.refreshToken = null;\n this.isInitialized = false;\n this.isAuthenticating = false;\n this.authPromise = null;\n this.authConfig = null;\n this.listeners = new Set();\n\n // Try to load tokens from storage\n this.loadTokensFromStorage();\n }\n\n async initialize(config) {\n if (this.isInitialized && this.accessToken) {\n return true;\n }\n\n this.authConfig = {\n endpoint: config.endpoint || '/kapi/oauth2/getToken',\n method: config.method || 'POST',\n headers: config.headers || {\n 'Content-Type': 'application/json'\n },\n body: config.bodyParams || {},\n params: config.queryParams || {}\n };\n\n try {\n await this.authenticate();\n this.isInitialized = true;\n this.notifyListeners('initialized', { success: true });\n } catch (error) {\n console.error('AuthManager: Failed to initialize auth - ', error);\n this.notifyListeners('initialized', { success: false, error });\n throw error;\n }\n }\n\n async authenticate() {\n if (this.isAuthenticating && this.authPromise) {\n return this.authPromise;\n }\n\n this.isAuthenticating = true;\n this.authPromise = this._performAuthentication();\n\n try {\n const result = await this.authPromise;\n this.notifyListeners('authenticated', { success: true });\n return result;\n } catch (error) {\n this.notifyListeners('authenticated', { success: false, error });\n throw error;\n } finally {\n this.isAuthenticating = false;\n this.authPromise = null;\n }\n }\n\n async _performAuthentication() {\n if (!this.authConfig) {\n throw new Error('Authentication configuration is missing.');\n }\n\n const { endpoint, headers, body, method } = this.authConfig;\n try {\n const response = await fetch(endpoint, {\n method,\n headers,\n body: JSON.stringify(body)\n });\n\n if (!response.ok) {\n throw new Error(`Authentication failed: ${response.status} - ${response.statusText}`);\n }\n\n const authData = await response.json();\n if (authData.status === true && authData.errorCode === '0') {\n this.accessToken = authData.data.access_token;\n this.refreshToken = authData.data.refresh_token;\n\n this.saveTokensToStorage();\n\n return authData;\n }\n throw new Error(`Authentication failed: ${authData.errorCode} - ${authData.message}`);\n } catch (error) {\n console.error('AuthManager: Authentication failed -', error);\n throw error;\n }\n }\n\n async refreshAccessToken() {\n console.log('AuthManager: Refreshing access token...')\n this.authConfig.body.nonce = this.generateNonce();\n this.authConfig.body.timestamp = this.formatTimestamp();\n return this._performAuthentication();\n }\n\n // 生成随机UUID作为nonce\n generateNonce() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = Math.random() * 16 | 0;\n const v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n // 格式化时间戳为 YYYY-MM-DD HH:mm:ss 格式\n formatTimestamp(date = new Date()) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n }\n\n getAccessToken() {\n return this.accessToken;\n }\n\n isAuthenticated() {\n return !!this.accessToken;\n }\n\n isReady() {\n return this.isInitialized && this.isAuthenticated();\n }\n\n logout() {\n this.clearTokens();\n this.isInitialized = false;\n this.authConfig = null;\n this.notifyListeners('logout', {});\n }\n\n clearTokens() {\n this.accessToken = null;\n this.refreshToken = null;\n this.clearTokensFromStorage();\n }\n\n loadTokensFromStorage() {\n try {\n this.accessToken = localStorage.getItem('__kapi_auth_manager_access_token__');\n this.refreshToken = localStorage.getItem('__kapi_auth_manager_refresh_token__');\n } catch (error) {\n console.warn('AuthManager: Error loading tokens from storage');\n }\n }\n\n saveTokensToStorage() {\n try {\n if (this.accessToken) {\n localStorage.setItem('__kapi_auth_manager_access_token__', this.accessToken);\n }\n\n if (this.refreshToken) {\n localStorage.setItem('__kapi_auth_manager_refresh_token__', this.refreshToken);\n }\n } catch (error) {\n console.warn('AuthManager: Error saving tokens to storage');\n }\n }\n\n clearTokensFromStorage() {\n try {\n localStorage.removeItem('__kapi_auth_manager_access_token__');\n localStorage.removeItem('__kapi_auth_manager_refresh_token__');\n } catch (error) {\n console.warn('AuthManager: Error removing tokens to storage');\n }\n }\n\n addListener(callback) {\n this.listeners.add(callback);\n }\n\n removeListener(callback) {\n this.listeners.delete(callback);\n }\n\n notifyListeners(event, data) {\n this.listeners.forEach((listener) => {\n try {\n listener(event, data);\n } catch (error) {\n console.error('AuthManager: Error notifying listener')\n }\n });\n }\n\n async waitForAuth() {\n if (!this.isAuthenticated()) {\n return true;\n }\n\n if (this.isAuthenticating && this.authPromise) {\n await this.authPromise;\n return this.isAuthenticated();\n }\n }\n}\n\nconst authManager = new AuthManager();\n\nexport { authManager, AuthManager };\nexport default authManager;\n\nexport async function initializeAuth(config) {\n return await authManager.initialize(config);\n}\n\nexport function isAuthenticated() {\n return authManager.isAuthenticated();\n}\n","import authManager from \"./authManager\";\n\nexport default class Adapter {\n constructor(dataCallback) {\n this.name = 'BosWireAdapter';\n\n this.dataCallback = dataCallback;\n this.config = {};\n this.abortController = null;\n\n this.retryCount = 0; // current retry count\n this.maxRetries = 3; // max retry times\n this.retryDelay = 1000;\n this.cache = new Map();\n this.cacheTimeout = 5 * 60 * 1000; // cache timeout in milliseconds, default is 5mins\n\n this.authManager = authManager;\n\n // Request queue\n this.pendingRequests = new Map();\n this.requestQueue = [];\n this.isProcessingQueue = false;\n }\n\n // Lifecycle - create connect\n connect() {}\n\n // Lifecycle - update data\n update(config) {\n this.config = { ...config };\n this.retryCount = 0;\n\n if (this.shouldFetchData(config)) {\n this.fetchDataWithQueue(config);\n } else {\n this.dataCallback({ data: null, error: null });\n }\n }\n\n // Lifecycle - destroy\n disconnect() {\n if (this.abortController) {\n this.abortController.abort();\n }\n\n this.cache.clear();\n this.pendingRequests.clear();\n this.requestQueue = [];\n this.isProcessingQueue = false;\n }\n\n async waitForAuth() {\n try {\n if (!this.authManager.isReady()) {\n await this.authManager.waitForAuth();\n }\n return true;\n } catch(error) {\n throw error;\n }\n }\n\n getAccessToken() {\n return this.authManager.getAccessToken();\n }\n\n isAuthenticated() {\n return this.authManager.isAuthenticated();\n }\n\n shouldFetchData (config) {\n return config && config.endpoint && config.endpoint !== undefined;\n }\n\n async fetchDataWithQueue(config) {\n const requestKey = this.generateRequestKey(config);\n\n if (this.pendingRequests.has(requestKey)) {\n console.log('Request is inqueue');\n return;\n }\n\n this.requestQueue.push({ config, requestKey, callback: this.callback });\n this.pendingRequests.set(requestKey, true);\n\n try {\n await this.authManager.waitForAuth();\n } catch (error) {\n console.error('Bos Adapter: Authentication failed, no need to send any request');\n this.dataCallback({\n data: null,\n error: {\n message: `Auth failed: ${error.message}`,\n status: 'AUTH_FAILED',\n originalError: error\n }\n });\n this.pendingRequests.delete(requestKey);\n return;\n }\n\n if (!this.isProcessingQueue) {\n this.processRequestQueue();\n }\n }\n\n async processRequestQueue() { \n this.isProcessingQueue = true;\n while (this.requestQueue.length > 0) {\n const request = this.requestQueue.shift();\n try {\n await this.fetchDataWithRetry(request.config);\n } catch (error) {\n console.error('Error fetching data:', error)\n } finally {\n this.pendingRequests.delete(request.requestKey);\n }\n\n // avoid too fast\n await this.delay(10);\n }\n this.isProcessingQueue = false;\n }\n\n async fetchDataWithRetry(config) { \n const cacheKey = this.generateCacheKey(config);\n \n const cachedData = this.getCachedData(cacheKey);\n if (cachedData) {\n this.dataCallback(cacheData);\n return;\n }\n\n let lastError = null;\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n const result = await this.performRequest(config);\n\n this.setCacheData(cacheKey, result);\n this.dataCallback(result);\n return;\n } catch (error) {\n lastError = error;\n\n if (attempt < this.maxRetries) {\n await this.delay(this.retryDelay * Math.pow(2, attempt));\n }\n }\n }\n\n this.dataCallback({\n data: null,\n error: {\n message: lastError.message,\n status: lastError.status || 'NETWORK_ERROR',\n retries: this.maxRetries\n }\n })\n }\n\n async performRequest(config) {\n const { endpoint, method = 'GET', params = {}, headers = {} } = config;\n\n if (this.abortController) {\n this.abortController.abort();\n }\n\n this.abortController = new AbortController();\n\n let url = endpoint;\n if (method === 'GET' && params) {\n const searchParams = new URLSearchParams(params);\n url = `${url}?${searchParams.toString()}`\n }\n\n const requestOptions = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'access_token': this.authManager.getAccessToken(),\n ...headers\n },\n body: method === 'GET' ? null : JSON.stringify(params),\n signal: this.abortController.signal\n }\n\n const response = await fetch(url, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status} - ${response.statusText}`);\n }\n\n const data = await response.json();\n if (data) {\n return { data: data, error: null };\n }\n\n return {\n data: null,\n error: {\n message: data.message,\n errorCode: data.errorCode,\n status: data.status\n }\n }\n }\n\n getCachedData(cacheKey) {\n const cached = this.cache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < this.cacheTimeout) {\n return cached.data;\n }\n\n if (cached) {\n this.cache.delete(cacheKey);\n }\n return null;\n }\n\n setCacheData(cacheKey, data) {\n this.cache.set(cacheKey, {\n data,\n timestamp: Date.now(),\n });\n\n if (this.cache.size > 100) {\n const firstKey = this.cache.keys().next().value;\n this.cache.delete(firstKey);\n }\n }\n\n generateCacheKey(config) {\n return JSON.stringify({\n endpoint: config.endpoint,\n params: config.params,\n method: config.method || 'GET'\n })\n }\n\n generateRequestKey(config) {\n return this.generateCacheKey(config);\n }\n\n delay(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n static clearAllCache() {\n this.cache = new Map();\n }\n\n static configure(options) {\n if (options.maxRetries !== undefined) {\n BosWireAdapter.prototype.maxRetries = options.maxRetries;\n }\n\n if (options.retryDelay !== undefined) {\n BosWireAdapter.prototype.retryDelay = options.retryDelay;\n }\n\n if (options.cacheTimeout !== undefined) {\n BosWireAdapter.prototype.cacheTimeout = options.cacheTimeout;\n }\n }\n}\n","import OpenApiWireAdapter from \"./adapter\";\n\nfunction createWireAdapter(defaultMethod = 'GET', defaultConfig = {}) {\n function wireAdapterFunction(configOrDataCallback) {\n if (typeof configOrDataCallback === 'function') {\n const adapter = new OpenApiWireAdapter(configOrDataCallback);\n\n const originalUpdate = adapter.update.bind(adapter);\n adapter.update = function (config) {\n const fullConfig = {\n endpoint: getEndpoint(config, defaultConfig),\n method: defaultMethod,\n ...defaultConfig,\n ...config\n }\n delete fullConfig.endpointConfig;\n\n if (config && typeof config === 'object' && !config.endpoint) {\n fullConfig.params = config.params;\n }\n\n return originalUpdate(fullConfig);\n }\n return adapter;\n } else {\n const config = configOrDataCallback || {};\n return createPromiseCall(defaultMethod, defaultConfig, config);\n }\n\n }\n return wireAdapterFunction;\n}\n\n// 创建 Promise 调用的辅助函数\nasync function createPromiseCall(defaultMethod, defaultConfig, config) {\n // 等待认证完成\n // await authManager.waitForAuth();\n\n // 合并默认配置和传入的配置\n const fullConfig = {\n endpoint: getEndpoint(config, defaultConfig),\n method: defaultMethod,\n ...defaultConfig,\n ...config\n }\n delete fullConfig.endpointConfig;\n\n // 如果传入的是 params,直接使用\n if (config && typeof config === 'object' && !config.endpoint) {\n fullConfig.params = config.params;\n }\n\n return new Promise((resolve, reject) => {\n const adapter = new OpenApiWireAdapter((result) => {\n if (result.error) {\n reject(result.error);\n } else {\n resolve(result);\n }\n });\n\n // 连接并更新配置\n adapter.connect();\n adapter.update(fullConfig);\n });\n}\n\nfunction getEndpoint(config, defaultConfig) {\n if (!config && !defaultConfig) {\n throw new Error('No config provided');\n }\n\n if (!config.endpointConfig && !defaultConfig.endpointConfig) {\n throw new Error('No endpointConfig provided');\n }\n\n let endpointConfig = config.endpointConfig;\n let defaultEndpointConfig = defaultConfig.endpointConfig;\n if (typeof endpointConfig === 'string') return endpointConfig;\n if (typeof defaultEndpointConfig === 'string') return defaultEndpointConfig;\n\n if (endpointConfig && endpointConfig.endpoint) {\n return endpointConfig.endpoint;\n }\n\n if (defaultEndpointConfig && defaultEndpointConfig.endpoint) {\n return defaultEndpointConfig.endpoint;\n }\n\n endpointConfig = endpointConfig || {};\n defaultEndpointConfig = defaultEndpointConfig || {};\n\n const isv = endpointConfig.isv || defaultEndpointConfig.isv || 'kd';\n const app = endpointConfig.app || defaultEndpointConfig.app;\n const source = endpointConfig.source || defaultEndpointConfig.source;\n const version = endpointConfig.version || defaultEndpointConfig.version || 'v1';\n const sourceId = endpointConfig.sourceId || defaultEndpointConfig.sourceId;\n const subSource = endpointConfig.subSource || defaultEndpointConfig.subSource;\n const action = endpointConfig.action || defaultEndpointConfig.action;\n\n if (!app) {\n throw new Error('Invalid config app provided');\n }\n\n if (!source) {\n throw new Error('Invalid config source provided');\n }\n\n let result = `${location.pathname}kwc/${version}/${isv}/${app}/${source}`\n if (sourceId) {\n result += `/${sourceId}`\n\n if (subSource) {\n result += `/${subSource}`\n }\n\n if (action) {\n result += `/${action}`\n }\n }\n\n if (!result.startsWith('/')) {\n result = `/${result}`\n }\n\n return result\n}\n\n\nexport const doGet = createWireAdapter('GET')\nexport const doPost = createWireAdapter('POST')\nexport const doDelete = createWireAdapter('DELETE')\nexport const doPut = createWireAdapter('PUT')\nexport const doPatch = createWireAdapter('PATCH')\n"],"names":["AuthManager","constructor","this","accessToken","refreshToken","isInitialized","isAuthenticating","authPromise","authConfig","listeners","Set","loadTokensFromStorage","initialize","config","endpoint","method","headers","body","bodyParams","params","queryParams","authenticate","notifyListeners","success","error","console","_performAuthentication","result","Error","response","fetch","JSON","stringify","ok","status","statusText","authData","json","errorCode","data","access_token","refresh_token","saveTokensToStorage","message","refreshAccessToken","log","nonce","generateNonce","timestamp","formatTimestamp","replace","c","r","Math","random","toString","date","Date","getFullYear","String","getMonth","padStart","getDate","getHours","getMinutes","getSeconds","getAccessToken","isAuthenticated","isReady","logout","clearTokens","clearTokensFromStorage","localStorage","getItem","warn","setItem","removeItem","addListener","callback","add","removeListener","delete","event","forEach","listener","waitForAuth","authManager","async","initializeAuth","Adapter","dataCallback","name","abortController","retryCount","maxRetries","retryDelay","cache","Map","cacheTimeout","pendingRequests","requestQueue","isProcessingQueue","connect","update","shouldFetchData","fetchDataWithQueue","disconnect","abort","clear","undefined","requestKey","generateRequestKey","has","push","set","originalError","processRequestQueue","length","request","shift","fetchDataWithRetry","delay","cacheKey","generateCacheKey","getCachedData","cacheData","lastError","attempt","performRequest","setCacheData","pow","retries","AbortController","url","URLSearchParams","requestOptions","signal","cached","get","now","size","firstKey","keys","next","value","ms","Promise","resolve","setTimeout","clearAllCache","configure","options","BosWireAdapter","prototype","createWireAdapter","defaultMethod","defaultConfig","configOrDataCallback","adapter","OpenApiWireAdapter","originalUpdate","bind","fullConfig","getEndpoint","endpointConfig","reject","createPromiseCall","defaultEndpointConfig","isv","app","source","version","sourceId","subSource","action","location","pathname","startsWith","doGet","doPost","doDelete","doPut","doPatch"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,2 +1,2 @@
1
- "use strict";var s=require("../shared/index-DSwttGxP.cjs.js");exports.getAppName=s.getApp,exports.getBrowserName=s.getBrowser,exports.isChrome=s.isChrome,exports.isChromiumEdge=s.isChromiumEdge,exports.isDD=s.isDD,exports.isEdge=s.isEdge,exports.isFeiShu=s.isFeiShu,exports.isFirefox=s.isFirefox,exports.isIE=s.isIE,exports.isLegacyEdge=s.isLegacyEdge,exports.isMobile=s.isMobile,exports.isPC=s.isPC,exports.isSafari=s.isSafari,exports.isWX=s.isWX,exports.isWeLink=s.isWeLink,exports.isWxWork=s.isWxWork,exports.isYzj=s.isYzj,exports.isYzjDesktop=s.isYzjDesktop,exports.isYzjOldDesktop=s.isYzjOldDesktop;
1
+ "use strict";var s=require("../shared/index-CNBHeIX7.cjs.js");exports.getAppName=s.getApp,exports.getBrowserName=s.getBrowser,exports.isChrome=s.isChrome,exports.isChromiumEdge=s.isChromiumEdge,exports.isDD=s.isDD,exports.isEdge=s.isEdge,exports.isFeiShu=s.isFeiShu,exports.isFirefox=s.isFirefox,exports.isIE=s.isIE,exports.isLegacyEdge=s.isLegacyEdge,exports.isMobile=s.isMobile,exports.isPC=s.isPC,exports.isSafari=s.isSafari,exports.isWX=s.isWX,exports.isWeLink=s.isWeLink,exports.isWxWork=s.isWxWork,exports.isYzj=s.isYzj,exports.isYzjDesktop=s.isYzjDesktop,exports.isYzjOldDesktop=s.isYzjOldDesktop;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1,2 +1,2 @@
1
- export{g as getAppName,k as getBrowserName,l as isChrome,m as isChromiumEdge,a as isDD,n as isEdge,b as isFeiShu,p as isFirefox,q as isIE,o as isLegacyEdge,s as isMobile,t as isPC,r as isSafari,e as isWX,c as isWeLink,d as isWxWork,f as isYzj,h as isYzjDesktop,j as isYzjOldDesktop}from"../shared/index-BvVdlixE.esm.js";
1
+ export{g as getAppName,k as getBrowserName,l as isChrome,m as isChromiumEdge,a as isDD,n as isEdge,b as isFeiShu,p as isFirefox,q as isIE,o as isLegacyEdge,s as isMobile,t as isPC,r as isSafari,e as isWX,c as isWeLink,d as isWxWork,f as isYzj,h as isYzjDesktop,j as isYzjOldDesktop}from"../shared/index-Cqlu4UVy.esm.js";
2
2
  //# sourceMappingURL=index.esm.js.map
package/dist/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("./shared/index-C0BYHh-4.cjs.js"),r=require("./shared/index-B0ILkJm3.cjs.js"),s=require("./shared/index-DSwttGxP.cjs.js"),i=require("./shared/index-Dtu_3V-z.cjs.js"),d=require("./shared/index-UhtWZvgp.cjs.js"),x=require("./shared/index-CGzlSIt0.cjs.js");exports.platformResourceLoader=e.index,exports.openApiAdapter=r.index,exports.client=s.index,exports.messageService=i.index,exports.kingdeeDataService=d.index,exports.sendBosPlatformEvent=x.index;
1
+ "use strict";var e=require("./shared/index-CKzrFqj6.cjs.js"),r=require("./shared/index-B0ILkJm3.cjs.js"),s=require("./shared/index-C96d8r7U.cjs.js"),i=require("./shared/index-CNBHeIX7.cjs.js"),d=require("./shared/index-Dtu_3V-z.cjs.js"),x=require("./shared/index-UhtWZvgp.cjs.js"),n=require("./shared/index-CGzlSIt0.cjs.js");exports.platformResourceLoader=e.index,exports.openApiAdapter=r.index,exports.bosApi=s.index,exports.client=i.index,exports.messageService=d.index,exports.kingdeeDataService=x.index,exports.sendBosPlatformEvent=n.index;
2
2
  //# sourceMappingURL=index.cjs.js.map
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- export{i as platformResourceLoader}from"./shared/index-DF7VNMGI.esm.js";export{i as openApiAdapter}from"./shared/index-CXYAeW-7.esm.js";export{i as client}from"./shared/index-BvVdlixE.esm.js";export{i as messageService}from"./shared/index-ChQWdmu9.esm.js";export{i as kingdeeDataService}from"./shared/index-KT-nyvfl.esm.js";export{i as sendBosPlatformEvent}from"./shared/index-qaD2HVRQ.esm.js";
1
+ export{i as platformResourceLoader}from"./shared/index-D_DekteB.esm.js";export{i as openApiAdapter}from"./shared/index-CXYAeW-7.esm.js";export{i as bosApi}from"./shared/index-RQMVLnNM.esm.js";export{i as client}from"./shared/index-Cqlu4UVy.esm.js";export{i as messageService}from"./shared/index-ChQWdmu9.esm.js";export{i as kingdeeDataService}from"./shared/index-KT-nyvfl.esm.js";export{i as sendBosPlatformEvent}from"./shared/index-qaD2HVRQ.esm.js";
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("../shared/index-C0BYHh-4.cjs.js");exports.loadScript=e.loadScript,exports.loadStyle=e.loadStyle;
1
+ "use strict";var e=require("../shared/index-CKzrFqj6.cjs.js");exports.loadScript=e.loadScript,exports.loadStyle=e.loadStyle;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1,2 +1,2 @@
1
- export{l as loadScript,a as loadStyle}from"../shared/index-DF7VNMGI.esm.js";
1
+ export{l as loadScript,a as loadStyle}from"../shared/index-D_DekteB.esm.js";
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1,2 @@
1
+ "use strict";class t{constructor(){this.accessToken=null,this.refreshToken=null,this.isInitialized=!1,this.isAuthenticating=!1,this.authPromise=null,this.authConfig=null,this.listeners=new Set,this.loadTokensFromStorage()}async initialize(t){if(this.isInitialized&&this.accessToken)return!0;this.authConfig={endpoint:t.endpoint||"/kapi/oauth2/getToken",method:t.method||"POST",headers:t.headers||{"Content-Type":"application/json"},body:t.bodyParams||{},params:t.queryParams||{}};try{await this.authenticate(),this.isInitialized=!0,this.notifyListeners("initialized",{success:!0})}catch(t){throw console.error("AuthManager: Failed to initialize auth - ",t),this.notifyListeners("initialized",{success:!1,error:t}),t}}async authenticate(){if(this.isAuthenticating&&this.authPromise)return this.authPromise;this.isAuthenticating=!0,this.authPromise=this._performAuthentication();try{const t=await this.authPromise;return this.notifyListeners("authenticated",{success:!0}),t}catch(t){throw this.notifyListeners("authenticated",{success:!1,error:t}),t}finally{this.isAuthenticating=!1,this.authPromise=null}}async _performAuthentication(){if(!this.authConfig)throw new Error("Authentication configuration is missing.");const{endpoint:t,headers:e,body:r,method:i}=this.authConfig;try{const n=await fetch(t,{method:i,headers:e,body:JSON.stringify(r)});if(!n.ok)throw new Error(`Authentication failed: ${n.status} - ${n.statusText}`);const a=await n.json();if(!0===a.status&&"0"===a.errorCode)return this.accessToken=a.data.access_token,this.refreshToken=a.data.refresh_token,this.saveTokensToStorage(),a;throw new Error(`Authentication failed: ${a.errorCode} - ${a.message}`)}catch(t){throw console.error("AuthManager: Authentication failed -",t),t}}async refreshAccessToken(){return console.log("AuthManager: Refreshing access token..."),this.authConfig.body.nonce=this.generateNonce(),this.authConfig.body.timestamp=this.formatTimestamp(),this._performAuthentication()}generateNonce(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){const e=16*Math.random()|0;return("x"==t?e:3&e|8).toString(16)})}formatTimestamp(t=new Date){return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`}getAccessToken(){return this.accessToken}isAuthenticated(){return!!this.accessToken}isReady(){return this.isInitialized&&this.isAuthenticated()}logout(){this.clearTokens(),this.isInitialized=!1,this.authConfig=null,this.notifyListeners("logout",{})}clearTokens(){this.accessToken=null,this.refreshToken=null,this.clearTokensFromStorage()}loadTokensFromStorage(){try{this.accessToken=localStorage.getItem("__kapi_auth_manager_access_token__"),this.refreshToken=localStorage.getItem("__kapi_auth_manager_refresh_token__")}catch(t){console.warn("AuthManager: Error loading tokens from storage")}}saveTokensToStorage(){try{this.accessToken&&localStorage.setItem("__kapi_auth_manager_access_token__",this.accessToken),this.refreshToken&&localStorage.setItem("__kapi_auth_manager_refresh_token__",this.refreshToken)}catch(t){console.warn("AuthManager: Error saving tokens to storage")}}clearTokensFromStorage(){try{localStorage.removeItem("__kapi_auth_manager_access_token__"),localStorage.removeItem("__kapi_auth_manager_refresh_token__")}catch(t){console.warn("AuthManager: Error removing tokens to storage")}}addListener(t){this.listeners.add(t)}removeListener(t){this.listeners.delete(t)}notifyListeners(t,e){this.listeners.forEach(r=>{try{r(t,e)}catch(t){console.error("AuthManager: Error notifying listener")}})}async waitForAuth(){return!this.isAuthenticated()||(this.isAuthenticating&&this.authPromise?(await this.authPromise,this.isAuthenticated()):void 0)}}const e=new t;async function r(t){return await e.initialize(t)}function i(){return e.isAuthenticated()}class n{constructor(t){this.name="BosWireAdapter",this.dataCallback=t,this.config={},this.abortController=null,this.retryCount=0,this.maxRetries=3,this.retryDelay=1e3,this.cache=new Map,this.cacheTimeout=3e5,this.authManager=e,this.pendingRequests=new Map,this.requestQueue=[],this.isProcessingQueue=!1}connect(){}update(t){this.config={...t},this.retryCount=0,this.shouldFetchData(t)?this.fetchDataWithQueue(t):this.dataCallback({data:null,error:null})}disconnect(){this.abortController&&this.abortController.abort(),this.cache.clear(),this.pendingRequests.clear(),this.requestQueue=[],this.isProcessingQueue=!1}async waitForAuth(){try{return this.authManager.isReady()||await this.authManager.waitForAuth(),!0}catch(t){throw t}}getAccessToken(){return this.authManager.getAccessToken()}isAuthenticated(){return this.authManager.isAuthenticated()}shouldFetchData(t){return t&&t.endpoint&&void 0!==t.endpoint}async fetchDataWithQueue(t){const e=this.generateRequestKey(t);if(this.pendingRequests.has(e))console.log("Request is inqueue");else{this.requestQueue.push({config:t,requestKey:e,callback:this.callback}),this.pendingRequests.set(e,!0);try{await this.authManager.waitForAuth()}catch(t){return console.error("Bos Adapter: Authentication failed, no need to send any request"),this.dataCallback({data:null,error:{message:`Auth failed: ${t.message}`,status:"AUTH_FAILED",originalError:t}}),void this.pendingRequests.delete(e)}this.isProcessingQueue||this.processRequestQueue()}}async processRequestQueue(){for(this.isProcessingQueue=!0;this.requestQueue.length>0;){const t=this.requestQueue.shift();try{await this.fetchDataWithRetry(t.config)}catch(t){console.error("Error fetching data:",t)}finally{this.pendingRequests.delete(t.requestKey)}await this.delay(10)}this.isProcessingQueue=!1}async fetchDataWithRetry(t){const e=this.generateCacheKey(t),r=this.getCachedData(e);if(r)return void this.dataCallback(r);let i=null;for(let r=0;r<this.maxRetries;r++)try{const r=await this.performRequest(t);return this.setCacheData(e,r),void this.dataCallback(r)}catch(t){if(i=t,t&&"AbortError"===t.name)return;r<this.maxRetries&&await this.delay(this.retryDelay*Math.pow(2,r))}this.dataCallback({data:null,error:{message:i.message,status:i.status||"NETWORK_ERROR",retries:this.maxRetries}})}async performRequest(t){const{endpoint:e,method:r="GET",params:i={},headers:n={}}=t;this.abortController&&this.abortController.abort(),this.abortController=new AbortController;let a=e;if("GET"===r&&i){a=`${a}?${new URLSearchParams(i).toString()}`}const s={method:r,headers:{"Content-Type":"application/json",access_token:this.authManager.getAccessToken(),...n},body:"GET"===r?null:JSON.stringify(i),signal:this.abortController.signal},o=await fetch(a,s);if(!o.ok)throw new Error(`HTTP error! Status: ${o.status} - ${o.statusText}`);const c=await o.json();return c?{data:c,error:null}:{data:null,error:{message:c.message,errorCode:c.errorCode,status:c.status}}}getCachedData(t){const e=this.cache.get(t);return e&&Date.now()-e.timestamp<this.cacheTimeout?e.data:(e&&this.cache.delete(t),null)}setCacheData(t,e){if(this.cache.set(t,{data:e,timestamp:Date.now()}),this.cache.size>100){const t=this.cache.keys().next().value;this.cache.delete(t)}}generateCacheKey(t){return JSON.stringify({endpoint:t.endpoint,params:t.params,method:t.method||"GET"})}generateRequestKey(t){return this.generateCacheKey(t)}delay(t){return new Promise(e=>setTimeout(e,t))}static clearAllCache(){this.cache=new Map}static configure(t){void 0!==t.maxRetries&&(BosWireAdapter.prototype.maxRetries=t.maxRetries),void 0!==t.retryDelay&&(BosWireAdapter.prototype.retryDelay=t.retryDelay),void 0!==t.cacheTimeout&&(BosWireAdapter.prototype.cacheTimeout=t.cacheTimeout)}}function a(t,e){if(!t&&!e)throw new Error("No config provided");if(!t?.endpointConfig&&!e?.endpointConfig)throw new Error("No endpointConfig provided");let r=t?.endpointConfig,i=e?.endpointConfig;if("string"==typeof r)return r;if("string"==typeof i)return i;if(r&&r.endpoint)return r.endpoint;if(i&&i.endpoint)return i.endpoint;r=r||{},i=i||{};const n=r.isv||i.isv||"kd",a=r.app||i.app,s=r.source||i.source,o=r.version||i.version||"v1",c=r.sourceId||i.sourceId,h=r.subSource||i.subSource,u=r.action||i.action;if(!a)throw new Error("Invalid config app provided");if(!s)throw new Error("Invalid config source provided");let d=`${location.pathname}kwc/${o}/${n}/${a}/${s}`;return c&&(d+=`/${c}`,h&&(d+=`/${h}`),u&&(d+=`/${u}`)),d.startsWith("/")||(d=`/${d}`),d}function s(t="GET",e={}){return function(r){if("function"!=typeof r)throw new Error("Adapter API expects a data callback function");const i=new n(r),s=i.update.bind(i);return i.update=function(r){const i={endpoint:a(r,e),method:t,...e,...r};return delete i.endpointConfig,r&&"object"==typeof r&&!r.endpoint&&(i.params=r.params),s(i)},i}}const o=s("GET"),c=s("POST"),h=s("DELETE"),u=s("PUT"),d=s("PATCH");var l=Object.freeze({__proto__:null,doDelete:h,doGet:o,doPatch:d,doPost:c,doPut:u});function g(t,e){if(!t&&!e)throw new Error("No config provided");if(!t?.endpointConfig&&!e?.endpointConfig)throw new Error("No endpointConfig provided");let r=t?.endpointConfig,i=e?.endpointConfig;if("string"==typeof r)return r;if("string"==typeof i)return i;if(r&&r.endpoint)return r.endpoint;if(i&&i.endpoint)return i.endpoint;r=r||{},i=i||{};const n=r.isv||i.isv||"kd",a=r.app||i.app,s=r.source||i.source,o=r.version||i.version||"v1",c=r.sourceId||i.sourceId,h=r.subSource||i.subSource,u=r.action||i.action;if(!a)throw new Error("Invalid config app provided");if(!s)throw new Error("Invalid config source provided");let d=`${location.pathname}kwc/${o}/${n}/${a}/${s}`;return c&&(d+=`/${c}`,h&&(d+=`/${h}`),u&&(d+=`/${u}`)),d.startsWith("/")||(d=`/${d}`),d}function p(t="GET",e={}){return function(r={}){const i={endpoint:g(r,e),method:t,...e,...r};delete i.endpointConfig,r&&"object"==typeof r&&!r.endpoint&&(i.params=r.params);let a=null,s=!1,o=null;return function(t,e,r){const i=t=>{try{Object.defineProperty(t,"cancel",{value:e,configurable:!0,enumerable:!1}),Object.defineProperty(t,"adapter",{get:()=>r,configurable:!0,enumerable:!1})}catch{}const n=t.then.bind(t),a=t.catch.bind(t),s=t.finally?t.finally.bind(t):void 0;return t.then=(...t)=>{const e=n(...t);return i(e),e},t.catch=(...t)=>{const e=a(...t);return i(e),e},s&&(t.finally=(...t)=>{const e=s(...t);return i(e),e}),t};return i(t)}(new Promise((t,e)=>{o=e,a=new n(r=>{if(!s){s=!0;try{a&&a.disconnect()}catch{}r.error?e(r.error):t(r)}}),a.connect(),a.update(i)}),()=>{if(!a)return{aborted:!1,removed:!1};let t=!1;try{a.abortController&&(a.abortController.abort(),t=!0)}catch{}!s&&o&&(s=!0,o({message:"Request canceled",status:"CANCELED"}));try{a.disconnect()}catch{}return{aborted:t,removed:!1}},a)}}const f=p("GET"),m=p("POST"),y=p("DELETE"),w=p("PUT"),_=p("PATCH");var k=Object.freeze({__proto__:null,doDelete:y,doGet:f,doPatch:_,doPost:m,doPut:w}),T=Object.freeze({__proto__:null,AuthManager:t,adapterApi:l,authManager:e,initializeAuth:r,isAuthenticated:i,promiseApi:k});exports.AuthManager=t,exports.adapterApi=l,exports.authManager=e,exports.index=T,exports.initializeAuth=r,exports.isAuthenticated=i,exports.promiseApi=k;
2
+ //# sourceMappingURL=index-C96d8r7U.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-C96d8r7U.cjs.js","sources":["../../src/modules/api/authManager.js","../../src/modules/api/adapter.js","../../src/modules/api/adapterApi.js","../../src/modules/api/promiseApi.js"],"sourcesContent":["/**\n * Global open api auth manager\n */\n\nclass AuthManager {\n constructor() {\n this.accessToken = null;\n this.refreshToken = null;\n this.isInitialized = false;\n this.isAuthenticating = false;\n this.authPromise = null;\n this.authConfig = null;\n this.listeners = new Set();\n\n // Try to load tokens from storage\n this.loadTokensFromStorage();\n }\n\n async initialize(config) {\n if (this.isInitialized && this.accessToken) {\n return true;\n }\n\n this.authConfig = {\n endpoint: config.endpoint || '/kapi/oauth2/getToken',\n method: config.method || 'POST',\n headers: config.headers || {\n 'Content-Type': 'application/json'\n },\n body: config.bodyParams || {},\n params: config.queryParams || {}\n };\n\n try {\n await this.authenticate();\n this.isInitialized = true;\n this.notifyListeners('initialized', { success: true });\n } catch (error) {\n console.error('AuthManager: Failed to initialize auth - ', error);\n this.notifyListeners('initialized', { success: false, error });\n throw error;\n }\n }\n\n async authenticate() {\n if (this.isAuthenticating && this.authPromise) {\n return this.authPromise;\n }\n\n this.isAuthenticating = true;\n this.authPromise = this._performAuthentication();\n\n try {\n const result = await this.authPromise;\n this.notifyListeners('authenticated', { success: true });\n return result;\n } catch (error) {\n this.notifyListeners('authenticated', { success: false, error });\n throw error;\n } finally {\n this.isAuthenticating = false;\n this.authPromise = null;\n }\n }\n\n async _performAuthentication() {\n if (!this.authConfig) {\n throw new Error('Authentication configuration is missing.');\n }\n\n const { endpoint, headers, body, method } = this.authConfig;\n try {\n const response = await fetch(endpoint, {\n method,\n headers,\n body: JSON.stringify(body)\n });\n\n if (!response.ok) {\n throw new Error(`Authentication failed: ${response.status} - ${response.statusText}`);\n }\n\n const authData = await response.json();\n if (authData.status === true && authData.errorCode === '0') {\n this.accessToken = authData.data.access_token;\n this.refreshToken = authData.data.refresh_token;\n\n this.saveTokensToStorage();\n\n return authData;\n }\n throw new Error(`Authentication failed: ${authData.errorCode} - ${authData.message}`);\n } catch (error) {\n console.error('AuthManager: Authentication failed -', error);\n throw error;\n }\n }\n\n async refreshAccessToken() {\n console.log('AuthManager: Refreshing access token...')\n this.authConfig.body.nonce = this.generateNonce();\n this.authConfig.body.timestamp = this.formatTimestamp();\n return this._performAuthentication();\n }\n\n // 生成随机UUID作为nonce\n generateNonce() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = Math.random() * 16 | 0;\n const v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n // 格式化时间戳为 YYYY-MM-DD HH:mm:ss 格式\n formatTimestamp(date = new Date()) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n }\n\n getAccessToken() {\n return this.accessToken;\n }\n\n isAuthenticated() {\n return !!this.accessToken;\n }\n\n isReady() {\n return this.isInitialized && this.isAuthenticated();\n }\n\n logout() {\n this.clearTokens();\n this.isInitialized = false;\n this.authConfig = null;\n this.notifyListeners('logout', {});\n }\n\n clearTokens() {\n this.accessToken = null;\n this.refreshToken = null;\n this.clearTokensFromStorage();\n }\n\n loadTokensFromStorage() {\n try {\n this.accessToken = localStorage.getItem('__kapi_auth_manager_access_token__');\n this.refreshToken = localStorage.getItem('__kapi_auth_manager_refresh_token__');\n } catch (error) {\n console.warn('AuthManager: Error loading tokens from storage');\n }\n }\n\n saveTokensToStorage() {\n try {\n if (this.accessToken) {\n localStorage.setItem('__kapi_auth_manager_access_token__', this.accessToken);\n }\n\n if (this.refreshToken) {\n localStorage.setItem('__kapi_auth_manager_refresh_token__', this.refreshToken);\n }\n } catch (error) {\n console.warn('AuthManager: Error saving tokens to storage');\n }\n }\n\n clearTokensFromStorage() {\n try {\n localStorage.removeItem('__kapi_auth_manager_access_token__');\n localStorage.removeItem('__kapi_auth_manager_refresh_token__');\n } catch (error) {\n console.warn('AuthManager: Error removing tokens to storage');\n }\n }\n\n addListener(callback) {\n this.listeners.add(callback);\n }\n\n removeListener(callback) {\n this.listeners.delete(callback);\n }\n\n notifyListeners(event, data) {\n this.listeners.forEach((listener) => {\n try {\n listener(event, data);\n } catch (error) {\n console.error('AuthManager: Error notifying listener')\n }\n });\n }\n\n async waitForAuth() {\n if (!this.isAuthenticated()) {\n return true;\n }\n\n if (this.isAuthenticating && this.authPromise) {\n await this.authPromise;\n return this.isAuthenticated();\n }\n }\n}\n\nconst authManager = new AuthManager();\n\nexport { authManager, AuthManager };\nexport default authManager;\n\nexport async function initializeAuth(config) {\n return await authManager.initialize(config);\n}\n\nexport function isAuthenticated() {\n return authManager.isAuthenticated();\n}","import authManager from \"./authManager\";\n\nexport default class Adapter {\n constructor(dataCallback) {\n this.name = 'BosWireAdapter';\n\n this.dataCallback = dataCallback;\n this.config = {};\n this.abortController = null;\n\n this.retryCount = 0; // current retry count\n this.maxRetries = 3; // max retry times\n this.retryDelay = 1000;\n this.cache = new Map();\n this.cacheTimeout = 5 * 60 * 1000; // cache timeout in milliseconds, default is 5mins\n\n this.authManager = authManager;\n\n // Request queue\n this.pendingRequests = new Map();\n this.requestQueue = [];\n this.isProcessingQueue = false;\n }\n\n // Lifecycle - create connect\n connect() {}\n\n // Lifecycle - update data\n update(config) {\n this.config = { ...config };\n this.retryCount = 0;\n\n if (this.shouldFetchData(config)) {\n this.fetchDataWithQueue(config);\n } else {\n this.dataCallback({ data: null, error: null });\n }\n }\n\n // Lifecycle - destroy\n disconnect() {\n if (this.abortController) {\n this.abortController.abort();\n }\n\n this.cache.clear();\n this.pendingRequests.clear();\n this.requestQueue = [];\n this.isProcessingQueue = false;\n }\n\n async waitForAuth() {\n try {\n if (!this.authManager.isReady()) {\n await this.authManager.waitForAuth();\n }\n return true;\n } catch(error) {\n throw error;\n }\n }\n\n getAccessToken() {\n return this.authManager.getAccessToken();\n }\n\n isAuthenticated() {\n return this.authManager.isAuthenticated();\n }\n\n shouldFetchData (config) {\n return config && config.endpoint && config.endpoint !== undefined;\n }\n\n async fetchDataWithQueue(config) {\n const requestKey = this.generateRequestKey(config);\n\n if (this.pendingRequests.has(requestKey)) {\n console.log('Request is inqueue');\n return;\n }\n\n this.requestQueue.push({ config, requestKey, callback: this.callback });\n this.pendingRequests.set(requestKey, true);\n\n try {\n await this.authManager.waitForAuth();\n } catch (error) {\n console.error('Bos Adapter: Authentication failed, no need to send any request');\n this.dataCallback({\n data: null,\n error: {\n message: `Auth failed: ${error.message}`,\n status: 'AUTH_FAILED',\n originalError: error\n }\n });\n this.pendingRequests.delete(requestKey);\n return;\n }\n\n if (!this.isProcessingQueue) {\n this.processRequestQueue();\n }\n }\n\n async processRequestQueue() { \n this.isProcessingQueue = true;\n while (this.requestQueue.length > 0) {\n const request = this.requestQueue.shift();\n try {\n await this.fetchDataWithRetry(request.config);\n } catch (error) {\n console.error('Error fetching data:', error)\n } finally {\n this.pendingRequests.delete(request.requestKey);\n }\n\n // avoid too fast\n await this.delay(10);\n }\n this.isProcessingQueue = false;\n }\n\n async fetchDataWithRetry(config) { \n const cacheKey = this.generateCacheKey(config);\n \n const cachedData = this.getCachedData(cacheKey);\n if (cachedData) {\n this.dataCallback(cachedData);\n return;\n }\n\n let lastError = null;\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n const result = await this.performRequest(config);\n\n this.setCacheData(cacheKey, result);\n this.dataCallback(result);\n return;\n } catch (error) {\n lastError = error;\n\n if (error && error.name === 'AbortError') {\n return;\n }\n\n if (attempt < this.maxRetries) {\n await this.delay(this.retryDelay * Math.pow(2, attempt));\n }\n }\n }\n\n this.dataCallback({\n data: null,\n error: {\n message: lastError.message,\n status: lastError.status || 'NETWORK_ERROR',\n retries: this.maxRetries\n }\n })\n }\n\n async performRequest(config) {\n const { endpoint, method = 'GET', params = {}, headers = {} } = config;\n\n if (this.abortController) {\n this.abortController.abort();\n }\n\n this.abortController = new AbortController();\n\n let url = endpoint;\n if (method === 'GET' && params) {\n const searchParams = new URLSearchParams(params);\n url = `${url}?${searchParams.toString()}`\n }\n\n const requestOptions = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'access_token': this.authManager.getAccessToken(),\n ...headers\n },\n body: method === 'GET' ? null : JSON.stringify(params),\n signal: this.abortController.signal\n }\n\n const response = await fetch(url, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status} - ${response.statusText}`);\n }\n\n const data = await response.json();\n if (data) {\n return { data: data, error: null };\n }\n\n return {\n data: null,\n error: {\n message: data.message,\n errorCode: data.errorCode,\n status: data.status\n }\n }\n }\n\n getCachedData(cacheKey) {\n const cached = this.cache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < this.cacheTimeout) {\n return cached.data;\n }\n\n if (cached) {\n this.cache.delete(cacheKey);\n }\n return null;\n }\n\n setCacheData(cacheKey, data) {\n this.cache.set(cacheKey, {\n data,\n timestamp: Date.now(),\n });\n\n if (this.cache.size > 100) {\n const firstKey = this.cache.keys().next().value;\n this.cache.delete(firstKey);\n }\n }\n\n generateCacheKey(config) {\n return JSON.stringify({\n endpoint: config.endpoint,\n params: config.params,\n method: config.method || 'GET'\n })\n }\n\n generateRequestKey(config) {\n return this.generateCacheKey(config);\n }\n\n delay(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n static clearAllCache() {\n this.cache = new Map();\n }\n\n static configure(options) {\n if (options.maxRetries !== undefined) {\n BosWireAdapter.prototype.maxRetries = options.maxRetries;\n }\n\n if (options.retryDelay !== undefined) {\n BosWireAdapter.prototype.retryDelay = options.retryDelay;\n }\n\n if (options.cacheTimeout !== undefined) {\n BosWireAdapter.prototype.cacheTimeout = options.cacheTimeout;\n }\n }\n}\n","import Adapter from './adapter'\n\nfunction getEndpoint(config, defaultConfig) {\n if (!config && !defaultConfig) {\n throw new Error('No config provided');\n }\n\n if (!config?.endpointConfig && !defaultConfig?.endpointConfig) {\n throw new Error('No endpointConfig provided');\n }\n\n let endpointConfig = config?.endpointConfig;\n let defaultEndpointConfig = defaultConfig?.endpointConfig;\n if (typeof endpointConfig === 'string') return endpointConfig;\n if (typeof defaultEndpointConfig === 'string') return defaultEndpointConfig;\n\n if (endpointConfig && endpointConfig.endpoint) {\n return endpointConfig.endpoint;\n }\n\n if (defaultEndpointConfig && defaultEndpointConfig.endpoint) {\n return defaultEndpointConfig.endpoint;\n }\n\n endpointConfig = endpointConfig || {};\n defaultEndpointConfig = defaultEndpointConfig || {};\n\n const isv = endpointConfig.isv || defaultEndpointConfig.isv || 'kd';\n const app = endpointConfig.app || defaultEndpointConfig.app;\n const source = endpointConfig.source || defaultEndpointConfig.source;\n const version = endpointConfig.version || defaultEndpointConfig.version || 'v1';\n const sourceId = endpointConfig.sourceId || defaultEndpointConfig.sourceId;\n const subSource = endpointConfig.subSource || defaultEndpointConfig.subSource;\n const action = endpointConfig.action || defaultEndpointConfig.action;\n\n if (!app) {\n throw new Error('Invalid config app provided');\n }\n\n if (!source) {\n throw new Error('Invalid config source provided');\n }\n\n let result = `${location.pathname}kwc/${version}/${isv}/${app}/${source}`\n if (sourceId) {\n result += `/${sourceId}`\n\n if (subSource) {\n result += `/${subSource}`\n }\n\n if (action) {\n result += `/${action}`\n }\n }\n\n if (!result.startsWith('/')) {\n result = `/${result}`\n }\n\n return result\n}\n\nfunction createAdapterMethod(defaultMethod = 'GET', defaultConfig = {}) {\n return function adapterFactory(dataCallback) {\n if (typeof dataCallback !== 'function') {\n throw new Error('Adapter API expects a data callback function');\n }\n\n const adapter = new Adapter(dataCallback);\n\n const originalUpdate = adapter.update.bind(adapter);\n adapter.update = function (config) {\n const fullConfig = {\n endpoint: getEndpoint(config, defaultConfig),\n method: defaultMethod,\n ...defaultConfig,\n ...config\n }\n delete fullConfig.endpointConfig;\n\n if (config && typeof config === 'object' && !config.endpoint) {\n fullConfig.params = config.params;\n }\n\n return originalUpdate(fullConfig);\n }\n\n // 注:适配器方式不提供取消能力;如需取消请使用 promiseApi。\n\n return adapter;\n }\n}\n\nexport const doGet = createAdapterMethod('GET')\nexport const doPost = createAdapterMethod('POST')\nexport const doDelete = createAdapterMethod('DELETE')\nexport const doPut = createAdapterMethod('PUT')\nexport const doPatch = createAdapterMethod('PATCH')","import Adapter from './adapter'\n\n// 将取消能力附加到 Promise,并在链式调用中继承\nfunction attachCancelable(basePromise, cancel, adapter) {\n const setCancelable = (p) => {\n try {\n Object.defineProperty(p, 'cancel', { value: cancel, configurable: true, enumerable: false });\n Object.defineProperty(p, 'adapter', { get: () => adapter, configurable: true, enumerable: false });\n } catch {}\n\n const nativeThen = p.then.bind(p);\n const nativeCatch = p.catch.bind(p);\n const nativeFinally = p.finally ? p.finally.bind(p) : undefined;\n\n p.then = (...args) => {\n const next = nativeThen(...args);\n setCancelable(next);\n return next;\n }\n\n p.catch = (...args) => {\n const next = nativeCatch(...args);\n setCancelable(next);\n return next;\n }\n\n if (nativeFinally) {\n p.finally = (...args) => {\n const next = nativeFinally(...args);\n setCancelable(next);\n return next;\n }\n }\n\n return p;\n }\n\n return setCancelable(basePromise);\n}\n\nfunction getEndpoint(config, defaultConfig) {\n if (!config && !defaultConfig) {\n throw new Error('No config provided');\n }\n\n if (!config?.endpointConfig && !defaultConfig?.endpointConfig) {\n throw new Error('No endpointConfig provided');\n }\n\n let endpointConfig = config?.endpointConfig;\n let defaultEndpointConfig = defaultConfig?.endpointConfig;\n if (typeof endpointConfig === 'string') return endpointConfig;\n if (typeof defaultEndpointConfig === 'string') return defaultEndpointConfig;\n\n if (endpointConfig && endpointConfig.endpoint) {\n return endpointConfig.endpoint;\n }\n\n if (defaultEndpointConfig && defaultEndpointConfig.endpoint) {\n return defaultEndpointConfig.endpoint;\n }\n\n endpointConfig = endpointConfig || {};\n defaultEndpointConfig = defaultEndpointConfig || {};\n\n const isv = endpointConfig.isv || defaultEndpointConfig.isv || 'kd';\n const app = endpointConfig.app || defaultEndpointConfig.app;\n const source = endpointConfig.source || defaultEndpointConfig.source;\n const version = endpointConfig.version || defaultEndpointConfig.version || 'v1';\n const sourceId = endpointConfig.sourceId || defaultEndpointConfig.sourceId;\n const subSource = endpointConfig.subSource || defaultEndpointConfig.subSource;\n const action = endpointConfig.action || defaultEndpointConfig.action;\n\n if (!app) {\n throw new Error('Invalid config app provided');\n }\n\n if (!source) {\n throw new Error('Invalid config source provided');\n }\n\n let result = `${location.pathname}kwc/${version}/${isv}/${app}/${source}`\n if (sourceId) {\n result += `/${sourceId}`\n\n if (subSource) {\n result += `/${subSource}`\n }\n\n if (action) {\n result += `/${action}`\n }\n }\n\n if (!result.startsWith('/')) {\n result = `/${result}`\n }\n\n return result\n}\n\nfunction createPromiseMethod(defaultMethod = 'GET', defaultConfig = {}) {\n return function promiseCall(config = {}) {\n const fullConfig = {\n endpoint: getEndpoint(config, defaultConfig),\n method: defaultMethod,\n ...defaultConfig,\n ...config\n }\n delete fullConfig.endpointConfig;\n\n if (config && typeof config === 'object' && !config.endpoint) {\n fullConfig.params = config.params;\n }\n\n let adapter = null;\n let isSettled = false;\n let rejectRef = null;\n\n const promise = new Promise((resolve, reject) => {\n rejectRef = reject;\n adapter = new Adapter((result) => {\n if (isSettled) return;\n isSettled = true;\n try { adapter && adapter.disconnect(); } catch {}\n\n if (result.error) {\n reject(result.error);\n } else {\n resolve(result);\n }\n });\n\n adapter.connect();\n adapter.update(fullConfig);\n });\n\n const cancel = () => {\n if (!adapter) return { aborted: false, removed: false };\n let aborted = false;\n try {\n if (adapter.abortController) {\n adapter.abortController.abort();\n aborted = true;\n }\n } catch {}\n if (!isSettled && rejectRef) {\n isSettled = true;\n rejectRef({ message: 'Request canceled', status: 'CANCELED' });\n }\n try { adapter.disconnect(); } catch {}\n return { aborted, removed: false };\n }\n\n return attachCancelable(promise, cancel, adapter);\n }\n}\n\nexport const doGet = createPromiseMethod('GET')\nexport const doPost = createPromiseMethod('POST')\nexport const doDelete = createPromiseMethod('DELETE')\nexport const doPut = createPromiseMethod('PUT')\nexport const doPatch = createPromiseMethod('PATCH')"],"names":["AuthManager","constructor","this","accessToken","refreshToken","isInitialized","isAuthenticating","authPromise","authConfig","listeners","Set","loadTokensFromStorage","initialize","config","endpoint","method","headers","body","bodyParams","params","queryParams","authenticate","notifyListeners","success","error","console","_performAuthentication","result","Error","response","fetch","JSON","stringify","ok","status","statusText","authData","json","errorCode","data","access_token","refresh_token","saveTokensToStorage","message","refreshAccessToken","log","nonce","generateNonce","timestamp","formatTimestamp","replace","c","r","Math","random","toString","date","Date","getFullYear","String","getMonth","padStart","getDate","getHours","getMinutes","getSeconds","getAccessToken","isAuthenticated","isReady","logout","clearTokens","clearTokensFromStorage","localStorage","getItem","warn","setItem","removeItem","addListener","callback","add","removeListener","delete","event","forEach","listener","waitForAuth","authManager","async","initializeAuth","Adapter","dataCallback","name","abortController","retryCount","maxRetries","retryDelay","cache","Map","cacheTimeout","pendingRequests","requestQueue","isProcessingQueue","connect","update","shouldFetchData","fetchDataWithQueue","disconnect","abort","clear","undefined","requestKey","generateRequestKey","has","push","set","originalError","processRequestQueue","length","request","shift","fetchDataWithRetry","delay","cacheKey","generateCacheKey","cachedData","getCachedData","lastError","attempt","performRequest","setCacheData","pow","retries","AbortController","url","URLSearchParams","requestOptions","signal","cached","get","now","size","firstKey","keys","next","value","ms","Promise","resolve","setTimeout","clearAllCache","configure","options","BosWireAdapter","prototype","getEndpoint","defaultConfig","endpointConfig","defaultEndpointConfig","isv","app","source","version","sourceId","subSource","action","location","pathname","startsWith","createAdapterMethod","defaultMethod","adapter","originalUpdate","bind","fullConfig","doGet","doPost","doDelete","doPut","doPatch","createPromiseMethod","isSettled","rejectRef","basePromise","cancel","setCancelable","p","Object","defineProperty","configurable","enumerable","nativeThen","then","nativeCatch","catch","nativeFinally","finally","args","attachCancelable","reject","aborted","removed"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=new Set;function t(t,n,o){if(t||(t=document.head),!n||"string"!=typeof n)throw new TypeError("Invalid script URL");return e.has(n)?("function"==typeof o&&o(null,n),Promise.resolve(n)):new Promise((r,l)=>{const i=document.createElement("script");i.src=n,i.type="text/javascript",i.async=!0,i.onload=()=>{e.add(n),"function"==typeof o&&o(null,n),r(n)},i.onerror=e=>{"function"==typeof o&&o(e,n),l(e)};(t.template||t).appendChild(i)})}function n(t,n,o){if(t||(t=document.head),!n||"string"!=typeof n)throw new TypeError("Invalid CSS URL");return e.has(n)?("function"==typeof o&&o(null,n),Promise.resolve(n)):new Promise((r,l)=>{const i=document.createElement("link");i.rel="stylesheet",i.type="text/css",i.href=n,i.onload=()=>{e.add(n),"function"==typeof o&&o(null,n),r(n)},i.onerror=e=>{"function"==typeof o&&o(e,n),l(e)};(t.template||t).appendChild(i)})}var o=Object.freeze({__proto__:null,loadScript:t,loadStyle:n});exports.index=o,exports.loadScript=t,exports.loadStyle=n;
2
+ //# sourceMappingURL=index-CKzrFqj6.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CKzrFqj6.cjs.js","sources":["../../src/modules/platformResourceLoader/index.js"],"sourcesContent":["// 用于缓存已加载资源的URL,避免重复加载\nconst loadedResources = new Set();\n\n/**\n * 加载一个外部脚本资源\n * @param {element} elm - 需要将资源注入到该元素下,通常是 document.head\n * @param {string} url - 脚本的URL\n * @param {Function} callback - 加载成功或失败后的回调函数\n * @returns {Promise} - 返回一个Promise,便于异步处理\n */\nexport function loadScript(elm, url, callback) {\n // 参数校验\n if (!elm) {\n elm = document.head\n }\n if (!url || typeof url !== 'string') {\n throw new TypeError('Invalid script URL');\n }\n // 如果URL已经加载过,直接回调\n if (loadedResources.has(url)) {\n if (typeof callback === 'function') {\n callback(null, url);\n }\n return Promise.resolve(url);\n }\n\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = url;\n script.type = 'text/javascript';\n script.async = true;\n\n script.onload = () => {\n loadedResources.add(url); // 添加到已加载缓存\n if (typeof callback === 'function') {\n callback(null, url);\n }\n resolve(url);\n };\n\n script.onerror = (error) => {\n if (typeof callback === 'function') {\n callback(error, url);\n }\n reject(error);\n };\n\n const target = elm.template || elm\n target.appendChild(script);\n });\n}\n\n/**\n * 加载一个外部CSS样式表资源\n * @param {element} elm - 需要将资源注入到该元素下,通常是 document.head\n * @param {string} url - 样式表的URL\n * @param {Function} callback - 加载成功或失败后的回调函数\n * @returns {Promise} - 返回一个Promise,便于异步处理\n */\nexport function loadStyle(elm, url, callback) {\n // 参数校验\n if (!elm) {\n elm = document.head\n }\n if (!url || typeof url !== 'string') {\n throw new TypeError('Invalid CSS URL');\n }\n if (loadedResources.has(url)) {\n if (typeof callback === 'function') {\n callback(null, url);\n }\n return Promise.resolve(url);\n }\n\n return new Promise((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.type = 'text/css';\n link.href = url;\n\n link.onload = () => {\n loadedResources.add(url);\n if (typeof callback === 'function') {\n callback(null, url);\n }\n resolve(url);\n };\n\n link.onerror = (error) => {\n if (typeof callback === 'function') {\n callback(error, url);\n }\n reject(error);\n };\n\n const target = elm.template || elm\n target.appendChild(link);\n });\n}"],"names":["loadedResources","Set","loadScript","elm","url","callback","document","head","TypeError","has","Promise","resolve","reject","script","createElement","src","type","async","onload","add","onerror","error","template","appendChild","loadStyle","link","rel","href"],"mappings":"aACA,MAAMA,EAAkB,IAAIC,IASrB,SAASC,EAAWC,EAAKC,EAAKC,GAKnC,GAHKF,IACHA,EAAMG,SAASC,OAEZH,GAAsB,iBAARA,EACjB,MAAM,IAAII,UAAU,sBAGtB,OAAIR,EAAgBS,IAAIL,IACE,mBAAbC,GACTA,EAAS,KAAMD,GAEVM,QAAQC,QAAQP,IAGlB,IAAIM,QAAQ,CAACC,EAASC,KAC3B,MAAMC,EAASP,SAASQ,cAAc,UACtCD,EAAOE,IAAMX,EACbS,EAAOG,KAAO,kBACdH,EAAOI,OAAQ,EAEfJ,EAAOK,OAAS,KACdlB,EAAgBmB,IAAIf,GACI,mBAAbC,GACTA,EAAS,KAAMD,GAEjBO,EAAQP,IAGVS,EAAOO,QAAWC,IACQ,mBAAbhB,GACTA,EAASgB,EAAOjB,GAElBQ,EAAOS,KAGMlB,EAAImB,UAAYnB,GACxBoB,YAAYV,IAEvB,CASO,SAASW,EAAUrB,EAAKC,EAAKC,GAKlC,GAHKF,IACHA,EAAMG,SAASC,OAEZH,GAAsB,iBAARA,EACjB,MAAM,IAAII,UAAU,mBAEtB,OAAIR,EAAgBS,IAAIL,IACE,mBAAbC,GACTA,EAAS,KAAMD,GAEVM,QAAQC,QAAQP,IAGlB,IAAIM,QAAQ,CAACC,EAASC,KAC3B,MAAMa,EAAOnB,SAASQ,cAAc,QACpCW,EAAKC,IAAM,aACXD,EAAKT,KAAO,WACZS,EAAKE,KAAOvB,EAEZqB,EAAKP,OAAS,KACZlB,EAAgBmB,IAAIf,GACI,mBAAbC,GACTA,EAAS,KAAMD,GAEjBO,EAAQP,IAGVqB,EAAKL,QAAWC,IACU,mBAAbhB,GACTA,EAASgB,EAAOjB,GAElBQ,EAAOS,KAGMlB,EAAImB,UAAYnB,GACxBoB,YAAYE,IAEvB"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e="yunzhijia",t="yunzhijia_desktop",n="yunzhijia_old_desktop",r="weixin",o="dingding",i="wxwork",s="welink",u="feishu",a="unknown";function g(){const e=navigator.userAgent;return/Qing\/.*;(iOS|iPhone|Android|iPadOS|Harmony)/.test(e)}function c(){const e=navigator.userAgent;return/App\/cloudhub/.test(e)}function d(){const e=navigator.userAgent;return/clientId:10204/.test(e)}function x(){const e=navigator.userAgent;return e.indexOf("MicroMessenger")>-1&&e.indexOf("wxwork")<0}function f(){const e=navigator.userAgent;return e.indexOf("MicroMessenger")>-1&&e.indexOf("wxwork")>-1}function p(){const e=navigator.userAgent,t=e.indexOf("DingTalk")>-1,n=-1===e.indexOf("MiniProgram")&&-1===e.indexOf("dd-web");return t&&n}function w(){const e=navigator.userAgent;return e.indexOf("welink")>-1||e.indexOf("cloudlink")>-1}function k(){return navigator.userAgent.indexOf("Lark/")>-1}function A(){return g()?e:c()?t:d()?n:x()?r:f()?i:p()?o:w?s:k()?u:a}function h(){const e=navigator.userAgent.toLowerCase();return/chrome|crios/.test(e)&&!/edg|edge|opr|opera|fxios|samsungbrowser/.test(e)}function m(){const e=navigator.userAgent.toLowerCase();return/edg/.test(e)}function v(){const e=navigator.userAgent.toLowerCase();return/edge/.test(e)&&!/edg/.test(e)}function l(){return m()||v()}function O(){const e=navigator.userAgent.toLowerCase();return/firefox|fxios/.test(e)}function C(){const e=navigator.userAgent.toLowerCase();return/msie|trident/.test(e)}function L(){const e=navigator.userAgent.toLowerCase();return/safari/.test(e)&&!/chrome|crios|edg|edge|fxios|opr|opera/.test(e)}const j="chrome",z="edge",D="firefox",M="ie",E="safari",P="unknown";function W(){return h()?j:l()?z:O()?D:L()?E:C()?M:P}function b(){const e=navigator.userAgent.toLowerCase(),t=/Android|iPhone|iPad/i.test(e)||/Harmony/i.test(e)&&/Mobile/i.test(e),n="ontouchstart"in window||navigator.maxTouchPoints>0,r=/Macintosh/i.test(e)&&n;return t||r}function y(){return!b()}var _=Object.freeze({__proto__:null,getAppName:A,getBrowserName:W,isChrome:h,isChromiumEdge:m,isDD:p,isEdge:l,isFeiShu:k,isFirefox:O,isIE:C,isLegacyEdge:v,isMobile:b,isPC:y,isSafari:L,isWX:x,isWeLink:w,isWxWork:f,isYzj:g,isYzjDesktop:c,isYzjOldDesktop:d});exports.getApp=A,exports.getBrowser=W,exports.index=_,exports.isChrome=h,exports.isChromiumEdge=m,exports.isDD=p,exports.isEdge=l,exports.isFeiShu=k,exports.isFirefox=O,exports.isIE=C,exports.isLegacyEdge=v,exports.isMobile=b,exports.isPC=y,exports.isSafari=L,exports.isWX=x,exports.isWeLink=w,exports.isWxWork=f,exports.isYzj=g,exports.isYzjDesktop=c,exports.isYzjOldDesktop=d;
2
+ //# sourceMappingURL=index-CNBHeIX7.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-DSwttGxP.cjs.js","sources":["../../src/modules/client/app.js","../../src/modules/client/browser.js","../../src/modules/client/device.js"],"sourcesContent":["const App = {\n yzj: 'yunzhijia',\n yzjDesktop: 'yunzhijia_desktop',\n yzjOldDesktop: 'yunzhijia_old_desktop',\n wx: 'weixin',\n dd: 'dingding',\n wxwork: 'wxwork',\n welink: 'welink',\n feishu: 'feishu',\n unknown: 'unknown'\n}\n\nexport function isYzj() {\n const agent = navigator.userAgent;\n return /Qing\\/.*;(iOS|iPhone|Android|iPadOS|Harmony)/.test(agent);\n}\n\nexport function isYzjDesktop() {\n const agent = navigator.userAgent;\n return /App\\/cloudhub/.test(agent);\n}\n\nexport function isYzjOldDesktop() {\n const agent = navigator.userAgent;\n return /clientId:10204/.test(agent);\n}\n\nexport function isWX() {\n const agent = navigator.userAgent;\n return agent.indexOf('MicroMessenger') > -1 && agent.indexOf('wxwork') < 0;\n}\n\nexport function isWxWork() {\n const agent = navigator.userAgent;\n return agent.indexOf('MicroMessenger') > -1 && agent.indexOf('wxwork') > -1;\n}\n\nexport function isDD() {\n const agent = navigator.userAgent;\n const _isDD = agent.indexOf('DingTalk') > -1;\n const isDDMiniProgram = agent.indexOf('MiniProgram') === -1 && agent.indexOf('dd-web') === -1;\n return _isDD && isDDMiniProgram;\n}\n\nexport function isWeLink() {\n const agent = navigator.userAgent;\n return agent.indexOf('welink') > -1 || agent.indexOf('cloudlink') > -1;\n}\n\nexport function isFeiShu() {\n const agent = navigator.userAgent;\n return agent.indexOf('Lark/') > -1;\n}\n\nexport function getApp() {\n if (isYzj()) return App.yzj;\n else if (isYzjDesktop()) return App.yzjDesktop;\n else if (isYzjOldDesktop()) return App.yzjOldDesktop;\n else if (isWX()) return App.wx;\n else if (isWxWork()) return App.wxwork;\n else if (isDD()) return App.dd;\n else if (isWeLink) return App.welink;\n else if (isFeiShu()) return App.feishu;\n else return App.unknown;\n}\n\nexport default getApp;\n","export function isChrome() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /chrome|crios/.test(userAgent) && !/edg|edge|opr|opera|fxios|samsungbrowser/.test(userAgent);\n}\n\nexport function isChromiumEdge() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /edg/.test(userAgent);\n}\n\nexport function isLegacyEdge() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /edge/.test(userAgent) && !/edg/.test(userAgent);\n}\n\nexport function isEdge() {\n return isChromiumEdge() || isLegacyEdge();\n}\n\nexport function isFirefox() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /firefox|fxios/.test(userAgent);\n}\n\nexport function isIE() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /msie|trident/.test(userAgent);\n}\n\nexport function isSafari() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /safari/.test(userAgent) && !/chrome|crios|edg|edge|fxios|opr|opera/.test(userAgent);\n}\n\nconst Browser = {\n chrome: 'chrome',\n edge: 'edge',\n firefox: 'firefox',\n ie: 'ie',\n safari: 'safari',\n unknown: 'unknown'\n}\n\nexport function getBrowser() {\n if (isChrome()) return Browser.chrome;\n else if (isEdge()) return Browser.edge;\n else if (isFirefox()) return Browser.firefox;\n else if (isSafari()) return Browser.safari;\n else if (isIE()) return Browser.ie;\n else return Browser.unknown;\n}\n\nexport default getBrowser;\n","export function isMobile() {\n const agent = navigator.userAgent.toLowerCase();\n const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;\n const maxMobileWidth = 1024;\n return (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(agent)) || (isTouchDevice && window.innerWidth <= maxMobileWidth)\n}\n\nexport function isPC() {\n return !isMobile();\n}"],"names":["App","isYzj","agent","navigator","userAgent","test","isYzjDesktop","isYzjOldDesktop","isWX","indexOf","isWxWork","isDD","_isDD","isDDMiniProgram","isWeLink","isFeiShu","getApp","isChrome","toLowerCase","isChromiumEdge","isLegacyEdge","isEdge","isFirefox","isIE","isSafari","Browser","getBrowser","isMobile","isTouchDevice","window","maxTouchPoints","msMaxTouchPoints","innerWidth","isPC"],"mappings":"aAAA,MAAMA,EACC,YADDA,EAEQ,oBAFRA,EAGW,wBAHXA,EAIA,SAJAA,EAKA,WALAA,EAMI,SANJA,EAOI,SAPJA,EAQI,SARJA,EASK,UAGJ,SAASC,IACd,MAAMC,EAAQC,UAAUC,UACxB,MAAO,+CAA+CC,KAAKH,EAC7D,CAEO,SAASI,IACd,MAAMJ,EAAQC,UAAUC,UACxB,MAAO,gBAAgBC,KAAKH,EAC9B,CAEO,SAASK,IACd,MAAML,EAAQC,UAAUC,UACxB,MAAO,iBAAiBC,KAAKH,EAC/B,CAEO,SAASM,IACd,MAAMN,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,mBAAoB,GAAMP,EAAMO,QAAQ,UAAY,CAC3E,CAEO,SAASC,IACd,MAAMR,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,mBAAoB,GAAMP,EAAMO,QAAQ,WAAY,CAC3E,CAEO,SAASE,IACd,MAAMT,EAAQC,UAAUC,UAClBQ,EAAQV,EAAMO,QAAQ,aAAc,EACpCI,GAAmD,IAAjCX,EAAMO,QAAQ,iBAAqD,IAA5BP,EAAMO,QAAQ,UAC7E,OAAOG,GAASC,CAClB,CAEO,SAASC,IACd,MAAMZ,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,WAAY,GAAMP,EAAMO,QAAQ,cAAe,CACtE,CAEO,SAASM,IAEd,OADcZ,UAAUC,UACXK,QAAQ,UAAW,CAClC,CAEO,SAASO,IACd,OAAIf,IAAgBD,EACXM,IAAuBN,EACvBO,IAA0BP,EAC1BQ,IAAeR,EACfU,IAAmBV,EACnBW,IAAeX,EACfc,EAAiBd,EACjBe,IAAmBf,EAChBA,CACd,CChEO,SAASiB,IACd,MAAMb,EAAYD,UAAUC,UAAUc,cACtC,MAAO,eAAeb,KAAKD,KAAe,0CAA0CC,KAAKD,EAC3F,CAEO,SAASe,IACd,MAAMf,EAAYD,UAAUC,UAAUc,cACtC,MAAO,MAAMb,KAAKD,EACpB,CAEO,SAASgB,IACd,MAAMhB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,OAAOb,KAAKD,KAAe,MAAMC,KAAKD,EAC/C,CAEO,SAASiB,IACd,OAAOF,KAAoBC,GAC7B,CAEO,SAASE,IACd,MAAMlB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,gBAAgBb,KAAKD,EAC9B,CAEO,SAASmB,IACd,MAAMnB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,eAAeb,KAAKD,EAC7B,CAEO,SAASoB,IACd,MAAMpB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,SAASb,KAAKD,KAAe,wCAAwCC,KAAKD,EACnF,CAEA,MAAMqB,EACI,SADJA,EAEE,OAFFA,EAGK,UAHLA,EAIA,KAJAA,EAKI,SALJA,EAMK,UAGJ,SAASC,IACd,OAAIT,IAAmBQ,EACdJ,IAAiBI,EACjBH,IAAoBG,EACpBD,IAAmBC,EACnBF,IAAeE,EACZA,CACd,CClDO,SAASE,IACd,MAAMzB,EAAQC,UAAUC,UAAUc,cAC5BU,EAAgB,iBAAkBC,QAAU1B,UAAU2B,eAAiB,GAAK3B,UAAU4B,iBAAmB,EAE/G,MAAQ,iEAAiE1B,KAAKH,IAAY0B,GAAiBC,OAAOG,YAD3F,IAEzB,CAEO,SAASC,IACd,OAAQN,GACV"}
1
+ {"version":3,"file":"index-CNBHeIX7.cjs.js","sources":["../../src/modules/client/app.js","../../src/modules/client/browser.js","../../src/modules/client/device.js"],"sourcesContent":["const App = {\n yzj: 'yunzhijia',\n yzjDesktop: 'yunzhijia_desktop',\n yzjOldDesktop: 'yunzhijia_old_desktop',\n wx: 'weixin',\n dd: 'dingding',\n wxwork: 'wxwork',\n welink: 'welink',\n feishu: 'feishu',\n unknown: 'unknown'\n}\n\nexport function isYzj() {\n const agent = navigator.userAgent;\n return /Qing\\/.*;(iOS|iPhone|Android|iPadOS|Harmony)/.test(agent);\n}\n\nexport function isYzjDesktop() {\n const agent = navigator.userAgent;\n return /App\\/cloudhub/.test(agent);\n}\n\nexport function isYzjOldDesktop() {\n const agent = navigator.userAgent;\n return /clientId:10204/.test(agent);\n}\n\nexport function isWX() {\n const agent = navigator.userAgent;\n return agent.indexOf('MicroMessenger') > -1 && agent.indexOf('wxwork') < 0;\n}\n\nexport function isWxWork() {\n const agent = navigator.userAgent;\n return agent.indexOf('MicroMessenger') > -1 && agent.indexOf('wxwork') > -1;\n}\n\nexport function isDD() {\n const agent = navigator.userAgent;\n const _isDD = agent.indexOf('DingTalk') > -1;\n const isDDMiniProgram = agent.indexOf('MiniProgram') === -1 && agent.indexOf('dd-web') === -1;\n return _isDD && isDDMiniProgram;\n}\n\nexport function isWeLink() {\n const agent = navigator.userAgent;\n return agent.indexOf('welink') > -1 || agent.indexOf('cloudlink') > -1;\n}\n\nexport function isFeiShu() {\n const agent = navigator.userAgent;\n return agent.indexOf('Lark/') > -1;\n}\n\nexport function getApp() {\n if (isYzj()) return App.yzj;\n else if (isYzjDesktop()) return App.yzjDesktop;\n else if (isYzjOldDesktop()) return App.yzjOldDesktop;\n else if (isWX()) return App.wx;\n else if (isWxWork()) return App.wxwork;\n else if (isDD()) return App.dd;\n else if (isWeLink) return App.welink;\n else if (isFeiShu()) return App.feishu;\n else return App.unknown;\n}\n\nexport default getApp;\n","export function isChrome() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /chrome|crios/.test(userAgent) && !/edg|edge|opr|opera|fxios|samsungbrowser/.test(userAgent);\n}\n\nexport function isChromiumEdge() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /edg/.test(userAgent);\n}\n\nexport function isLegacyEdge() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /edge/.test(userAgent) && !/edg/.test(userAgent);\n}\n\nexport function isEdge() {\n return isChromiumEdge() || isLegacyEdge();\n}\n\nexport function isFirefox() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /firefox|fxios/.test(userAgent);\n}\n\nexport function isIE() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /msie|trident/.test(userAgent);\n}\n\nexport function isSafari() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /safari/.test(userAgent) && !/chrome|crios|edg|edge|fxios|opr|opera/.test(userAgent);\n}\n\nconst Browser = {\n chrome: 'chrome',\n edge: 'edge',\n firefox: 'firefox',\n ie: 'ie',\n safari: 'safari',\n unknown: 'unknown'\n}\n\nexport function getBrowser() {\n if (isChrome()) return Browser.chrome;\n else if (isEdge()) return Browser.edge;\n else if (isFirefox()) return Browser.firefox;\n else if (isSafari()) return Browser.safari;\n else if (isIE()) return Browser.ie;\n else return Browser.unknown;\n}\n\nexport default getBrowser;\n","export function isMobile() {\n const userAgent = navigator.userAgent.toLowerCase()\n const _isMobile = /Android|iPhone|iPad/i.test(userAgent) || (/Harmony/i.test(userAgent) && /Mobile/i.test(userAgent))\n\n // 检测触摸屏设备(增强平板识别)\n const isTouchScreen = 'ontouchstart' in window || navigator.maxTouchPoints > 0\n\n // 特殊处理iPad:iPadOS 13+的UA包含Macintosh但支持触摸\n const isiPad = /Macintosh/i.test(userAgent) && isTouchScreen\n\n return _isMobile || isiPad\n}\n\nexport function isPC() {\n return !isMobile();\n}"],"names":["App","isYzj","agent","navigator","userAgent","test","isYzjDesktop","isYzjOldDesktop","isWX","indexOf","isWxWork","isDD","_isDD","isDDMiniProgram","isWeLink","isFeiShu","getApp","isChrome","toLowerCase","isChromiumEdge","isLegacyEdge","isEdge","isFirefox","isIE","isSafari","Browser","getBrowser","isMobile","_isMobile","isTouchScreen","window","maxTouchPoints","isiPad","isPC"],"mappings":"aAAA,MAAMA,EACC,YADDA,EAEQ,oBAFRA,EAGW,wBAHXA,EAIA,SAJAA,EAKA,WALAA,EAMI,SANJA,EAOI,SAPJA,EAQI,SARJA,EASK,UAGJ,SAASC,IACd,MAAMC,EAAQC,UAAUC,UACxB,MAAO,+CAA+CC,KAAKH,EAC7D,CAEO,SAASI,IACd,MAAMJ,EAAQC,UAAUC,UACxB,MAAO,gBAAgBC,KAAKH,EAC9B,CAEO,SAASK,IACd,MAAML,EAAQC,UAAUC,UACxB,MAAO,iBAAiBC,KAAKH,EAC/B,CAEO,SAASM,IACd,MAAMN,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,mBAAoB,GAAMP,EAAMO,QAAQ,UAAY,CAC3E,CAEO,SAASC,IACd,MAAMR,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,mBAAoB,GAAMP,EAAMO,QAAQ,WAAY,CAC3E,CAEO,SAASE,IACd,MAAMT,EAAQC,UAAUC,UAClBQ,EAAQV,EAAMO,QAAQ,aAAc,EACpCI,GAAmD,IAAjCX,EAAMO,QAAQ,iBAAqD,IAA5BP,EAAMO,QAAQ,UAC7E,OAAOG,GAASC,CAClB,CAEO,SAASC,IACd,MAAMZ,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,WAAY,GAAMP,EAAMO,QAAQ,cAAe,CACtE,CAEO,SAASM,IAEd,OADcZ,UAAUC,UACXK,QAAQ,UAAW,CAClC,CAEO,SAASO,IACd,OAAIf,IAAgBD,EACXM,IAAuBN,EACvBO,IAA0BP,EAC1BQ,IAAeR,EACfU,IAAmBV,EACnBW,IAAeX,EACfc,EAAiBd,EACjBe,IAAmBf,EAChBA,CACd,CChEO,SAASiB,IACd,MAAMb,EAAYD,UAAUC,UAAUc,cACtC,MAAO,eAAeb,KAAKD,KAAe,0CAA0CC,KAAKD,EAC3F,CAEO,SAASe,IACd,MAAMf,EAAYD,UAAUC,UAAUc,cACtC,MAAO,MAAMb,KAAKD,EACpB,CAEO,SAASgB,IACd,MAAMhB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,OAAOb,KAAKD,KAAe,MAAMC,KAAKD,EAC/C,CAEO,SAASiB,IACd,OAAOF,KAAoBC,GAC7B,CAEO,SAASE,IACd,MAAMlB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,gBAAgBb,KAAKD,EAC9B,CAEO,SAASmB,IACd,MAAMnB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,eAAeb,KAAKD,EAC7B,CAEO,SAASoB,IACd,MAAMpB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,SAASb,KAAKD,KAAe,wCAAwCC,KAAKD,EACnF,CAEA,MAAMqB,EACI,SADJA,EAEE,OAFFA,EAGK,UAHLA,EAIA,KAJAA,EAKI,SALJA,EAMK,UAGJ,SAASC,IACd,OAAIT,IAAmBQ,EACdJ,IAAiBI,EACjBH,IAAoBG,EACpBD,IAAmBC,EACnBF,IAAeE,EACZA,CACd,CClDO,SAASE,IACd,MAAMvB,EAAYD,UAAUC,UAAUc,cAChCU,EAAY,uBAAuBvB,KAAKD,IAAe,WAAWC,KAAKD,IAAc,UAAUC,KAAKD,GAGpGyB,EAAgB,iBAAkBC,QAAU3B,UAAU4B,eAAiB,EAGvEC,EAAS,aAAa3B,KAAKD,IAAcyB,EAE/C,OAAOD,GAAaI,CACtB,CAEO,SAASC,IACd,OAAQN,GACV"}
@@ -0,0 +1,2 @@
1
+ const e="yunzhijia",n="yunzhijia_desktop",t="yunzhijia_old_desktop",r="weixin",i="dingding",o="wxwork",s="welink",a="feishu",u="unknown";function g(){const e=navigator.userAgent;return/Qing\/.*;(iOS|iPhone|Android|iPadOS|Harmony)/.test(e)}function c(){const e=navigator.userAgent;return/App\/cloudhub/.test(e)}function f(){const e=navigator.userAgent;return/clientId:10204/.test(e)}function d(){const e=navigator.userAgent;return e.indexOf("MicroMessenger")>-1&&e.indexOf("wxwork")<0}function w(){const e=navigator.userAgent;return e.indexOf("MicroMessenger")>-1&&e.indexOf("wxwork")>-1}function x(){const e=navigator.userAgent,n=e.indexOf("DingTalk")>-1,t=-1===e.indexOf("MiniProgram")&&-1===e.indexOf("dd-web");return n&&t}function A(){const e=navigator.userAgent;return e.indexOf("welink")>-1||e.indexOf("cloudlink")>-1}function h(){return navigator.userAgent.indexOf("Lark/")>-1}function k(){return g()?e:c()?n:f()?t:d()?r:w()?o:x()?i:A?s:h()?a:u}function v(){const e=navigator.userAgent.toLowerCase();return/chrome|crios/.test(e)&&!/edg|edge|opr|opera|fxios|samsungbrowser/.test(e)}function m(){const e=navigator.userAgent.toLowerCase();return/edg/.test(e)}function p(){const e=navigator.userAgent.toLowerCase();return/edge/.test(e)&&!/edg/.test(e)}function l(){return m()||p()}function O(){const e=navigator.userAgent.toLowerCase();return/firefox|fxios/.test(e)}function C(){const e=navigator.userAgent.toLowerCase();return/msie|trident/.test(e)}function L(){const e=navigator.userAgent.toLowerCase();return/safari/.test(e)&&!/chrome|crios|edg|edge|fxios|opr|opera/.test(e)}const j="chrome",M="edge",b="firefox",z="ie",P="safari",_="unknown";function y(){return v()?j:l()?M:O()?b:L()?P:C()?z:_}function D(){const e=navigator.userAgent.toLowerCase(),n=/Android|iPhone|iPad/i.test(e)||/Harmony/i.test(e)&&/Mobile/i.test(e),t="ontouchstart"in window||navigator.maxTouchPoints>0,r=/Macintosh/i.test(e)&&t;return n||r}function E(){return!D()}var S=Object.freeze({__proto__:null,getAppName:k,getBrowserName:y,isChrome:v,isChromiumEdge:m,isDD:x,isEdge:l,isFeiShu:h,isFirefox:O,isIE:C,isLegacyEdge:p,isMobile:D,isPC:E,isSafari:L,isWX:d,isWeLink:A,isWxWork:w,isYzj:g,isYzjDesktop:c,isYzjOldDesktop:f});export{x as a,h as b,A as c,w as d,d as e,g as f,k as g,c as h,S as i,f as j,y as k,v as l,m,l as n,p as o,O as p,C as q,L as r,D as s,E as t};
2
+ //# sourceMappingURL=index-Cqlu4UVy.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-BvVdlixE.esm.js","sources":["../../src/modules/client/app.js","../../src/modules/client/browser.js","../../src/modules/client/device.js"],"sourcesContent":["const App = {\n yzj: 'yunzhijia',\n yzjDesktop: 'yunzhijia_desktop',\n yzjOldDesktop: 'yunzhijia_old_desktop',\n wx: 'weixin',\n dd: 'dingding',\n wxwork: 'wxwork',\n welink: 'welink',\n feishu: 'feishu',\n unknown: 'unknown'\n}\n\nexport function isYzj() {\n const agent = navigator.userAgent;\n return /Qing\\/.*;(iOS|iPhone|Android|iPadOS|Harmony)/.test(agent);\n}\n\nexport function isYzjDesktop() {\n const agent = navigator.userAgent;\n return /App\\/cloudhub/.test(agent);\n}\n\nexport function isYzjOldDesktop() {\n const agent = navigator.userAgent;\n return /clientId:10204/.test(agent);\n}\n\nexport function isWX() {\n const agent = navigator.userAgent;\n return agent.indexOf('MicroMessenger') > -1 && agent.indexOf('wxwork') < 0;\n}\n\nexport function isWxWork() {\n const agent = navigator.userAgent;\n return agent.indexOf('MicroMessenger') > -1 && agent.indexOf('wxwork') > -1;\n}\n\nexport function isDD() {\n const agent = navigator.userAgent;\n const _isDD = agent.indexOf('DingTalk') > -1;\n const isDDMiniProgram = agent.indexOf('MiniProgram') === -1 && agent.indexOf('dd-web') === -1;\n return _isDD && isDDMiniProgram;\n}\n\nexport function isWeLink() {\n const agent = navigator.userAgent;\n return agent.indexOf('welink') > -1 || agent.indexOf('cloudlink') > -1;\n}\n\nexport function isFeiShu() {\n const agent = navigator.userAgent;\n return agent.indexOf('Lark/') > -1;\n}\n\nexport function getApp() {\n if (isYzj()) return App.yzj;\n else if (isYzjDesktop()) return App.yzjDesktop;\n else if (isYzjOldDesktop()) return App.yzjOldDesktop;\n else if (isWX()) return App.wx;\n else if (isWxWork()) return App.wxwork;\n else if (isDD()) return App.dd;\n else if (isWeLink) return App.welink;\n else if (isFeiShu()) return App.feishu;\n else return App.unknown;\n}\n\nexport default getApp;\n","export function isChrome() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /chrome|crios/.test(userAgent) && !/edg|edge|opr|opera|fxios|samsungbrowser/.test(userAgent);\n}\n\nexport function isChromiumEdge() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /edg/.test(userAgent);\n}\n\nexport function isLegacyEdge() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /edge/.test(userAgent) && !/edg/.test(userAgent);\n}\n\nexport function isEdge() {\n return isChromiumEdge() || isLegacyEdge();\n}\n\nexport function isFirefox() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /firefox|fxios/.test(userAgent);\n}\n\nexport function isIE() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /msie|trident/.test(userAgent);\n}\n\nexport function isSafari() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /safari/.test(userAgent) && !/chrome|crios|edg|edge|fxios|opr|opera/.test(userAgent);\n}\n\nconst Browser = {\n chrome: 'chrome',\n edge: 'edge',\n firefox: 'firefox',\n ie: 'ie',\n safari: 'safari',\n unknown: 'unknown'\n}\n\nexport function getBrowser() {\n if (isChrome()) return Browser.chrome;\n else if (isEdge()) return Browser.edge;\n else if (isFirefox()) return Browser.firefox;\n else if (isSafari()) return Browser.safari;\n else if (isIE()) return Browser.ie;\n else return Browser.unknown;\n}\n\nexport default getBrowser;\n","export function isMobile() {\n const agent = navigator.userAgent.toLowerCase();\n const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;\n const maxMobileWidth = 1024;\n return (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(agent)) || (isTouchDevice && window.innerWidth <= maxMobileWidth)\n}\n\nexport function isPC() {\n return !isMobile();\n}"],"names":["App","isYzj","agent","navigator","userAgent","test","isYzjDesktop","isYzjOldDesktop","isWX","indexOf","isWxWork","isDD","_isDD","isDDMiniProgram","isWeLink","isFeiShu","getApp","isChrome","toLowerCase","isChromiumEdge","isLegacyEdge","isEdge","isFirefox","isIE","isSafari","Browser","getBrowser","isMobile","isTouchDevice","window","maxTouchPoints","msMaxTouchPoints","innerWidth","isPC"],"mappings":"AAAA,MAAMA,EACC,YADDA,EAEQ,oBAFRA,EAGW,wBAHXA,EAIA,SAJAA,EAKA,WALAA,EAMI,SANJA,EAOI,SAPJA,EAQI,SARJA,EASK,UAGJ,SAASC,IACd,MAAMC,EAAQC,UAAUC,UACxB,MAAO,+CAA+CC,KAAKH,EAC7D,CAEO,SAASI,IACd,MAAMJ,EAAQC,UAAUC,UACxB,MAAO,gBAAgBC,KAAKH,EAC9B,CAEO,SAASK,IACd,MAAML,EAAQC,UAAUC,UACxB,MAAO,iBAAiBC,KAAKH,EAC/B,CAEO,SAASM,IACd,MAAMN,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,mBAAoB,GAAMP,EAAMO,QAAQ,UAAY,CAC3E,CAEO,SAASC,IACd,MAAMR,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,mBAAoB,GAAMP,EAAMO,QAAQ,WAAY,CAC3E,CAEO,SAASE,IACd,MAAMT,EAAQC,UAAUC,UAClBQ,EAAQV,EAAMO,QAAQ,aAAc,EACpCI,GAAmD,IAAjCX,EAAMO,QAAQ,iBAAqD,IAA5BP,EAAMO,QAAQ,UAC7E,OAAOG,GAASC,CAClB,CAEO,SAASC,IACd,MAAMZ,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,WAAY,GAAMP,EAAMO,QAAQ,cAAe,CACtE,CAEO,SAASM,IAEd,OADcZ,UAAUC,UACXK,QAAQ,UAAW,CAClC,CAEO,SAASO,IACd,OAAIf,IAAgBD,EACXM,IAAuBN,EACvBO,IAA0BP,EAC1BQ,IAAeR,EACfU,IAAmBV,EACnBW,IAAeX,EACfc,EAAiBd,EACjBe,IAAmBf,EAChBA,CACd,CChEO,SAASiB,IACd,MAAMb,EAAYD,UAAUC,UAAUc,cACtC,MAAO,eAAeb,KAAKD,KAAe,0CAA0CC,KAAKD,EAC3F,CAEO,SAASe,IACd,MAAMf,EAAYD,UAAUC,UAAUc,cACtC,MAAO,MAAMb,KAAKD,EACpB,CAEO,SAASgB,IACd,MAAMhB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,OAAOb,KAAKD,KAAe,MAAMC,KAAKD,EAC/C,CAEO,SAASiB,IACd,OAAOF,KAAoBC,GAC7B,CAEO,SAASE,IACd,MAAMlB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,gBAAgBb,KAAKD,EAC9B,CAEO,SAASmB,IACd,MAAMnB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,eAAeb,KAAKD,EAC7B,CAEO,SAASoB,IACd,MAAMpB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,SAASb,KAAKD,KAAe,wCAAwCC,KAAKD,EACnF,CAEA,MAAMqB,EACI,SADJA,EAEE,OAFFA,EAGK,UAHLA,EAIA,KAJAA,EAKI,SALJA,EAMK,UAGJ,SAASC,IACd,OAAIT,IAAmBQ,EACdJ,IAAiBI,EACjBH,IAAoBG,EACpBD,IAAmBC,EACnBF,IAAeE,EACZA,CACd,CClDO,SAASE,IACd,MAAMzB,EAAQC,UAAUC,UAAUc,cAC5BU,EAAgB,iBAAkBC,QAAU1B,UAAU2B,eAAiB,GAAK3B,UAAU4B,iBAAmB,EAE/G,MAAQ,iEAAiE1B,KAAKH,IAAY0B,GAAiBC,OAAOG,YAD3F,IAEzB,CAEO,SAASC,IACd,OAAQN,GACV"}
1
+ {"version":3,"file":"index-Cqlu4UVy.esm.js","sources":["../../src/modules/client/app.js","../../src/modules/client/browser.js","../../src/modules/client/device.js"],"sourcesContent":["const App = {\n yzj: 'yunzhijia',\n yzjDesktop: 'yunzhijia_desktop',\n yzjOldDesktop: 'yunzhijia_old_desktop',\n wx: 'weixin',\n dd: 'dingding',\n wxwork: 'wxwork',\n welink: 'welink',\n feishu: 'feishu',\n unknown: 'unknown'\n}\n\nexport function isYzj() {\n const agent = navigator.userAgent;\n return /Qing\\/.*;(iOS|iPhone|Android|iPadOS|Harmony)/.test(agent);\n}\n\nexport function isYzjDesktop() {\n const agent = navigator.userAgent;\n return /App\\/cloudhub/.test(agent);\n}\n\nexport function isYzjOldDesktop() {\n const agent = navigator.userAgent;\n return /clientId:10204/.test(agent);\n}\n\nexport function isWX() {\n const agent = navigator.userAgent;\n return agent.indexOf('MicroMessenger') > -1 && agent.indexOf('wxwork') < 0;\n}\n\nexport function isWxWork() {\n const agent = navigator.userAgent;\n return agent.indexOf('MicroMessenger') > -1 && agent.indexOf('wxwork') > -1;\n}\n\nexport function isDD() {\n const agent = navigator.userAgent;\n const _isDD = agent.indexOf('DingTalk') > -1;\n const isDDMiniProgram = agent.indexOf('MiniProgram') === -1 && agent.indexOf('dd-web') === -1;\n return _isDD && isDDMiniProgram;\n}\n\nexport function isWeLink() {\n const agent = navigator.userAgent;\n return agent.indexOf('welink') > -1 || agent.indexOf('cloudlink') > -1;\n}\n\nexport function isFeiShu() {\n const agent = navigator.userAgent;\n return agent.indexOf('Lark/') > -1;\n}\n\nexport function getApp() {\n if (isYzj()) return App.yzj;\n else if (isYzjDesktop()) return App.yzjDesktop;\n else if (isYzjOldDesktop()) return App.yzjOldDesktop;\n else if (isWX()) return App.wx;\n else if (isWxWork()) return App.wxwork;\n else if (isDD()) return App.dd;\n else if (isWeLink) return App.welink;\n else if (isFeiShu()) return App.feishu;\n else return App.unknown;\n}\n\nexport default getApp;\n","export function isChrome() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /chrome|crios/.test(userAgent) && !/edg|edge|opr|opera|fxios|samsungbrowser/.test(userAgent);\n}\n\nexport function isChromiumEdge() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /edg/.test(userAgent);\n}\n\nexport function isLegacyEdge() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /edge/.test(userAgent) && !/edg/.test(userAgent);\n}\n\nexport function isEdge() {\n return isChromiumEdge() || isLegacyEdge();\n}\n\nexport function isFirefox() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /firefox|fxios/.test(userAgent);\n}\n\nexport function isIE() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /msie|trident/.test(userAgent);\n}\n\nexport function isSafari() {\n const userAgent = navigator.userAgent.toLowerCase();\n return /safari/.test(userAgent) && !/chrome|crios|edg|edge|fxios|opr|opera/.test(userAgent);\n}\n\nconst Browser = {\n chrome: 'chrome',\n edge: 'edge',\n firefox: 'firefox',\n ie: 'ie',\n safari: 'safari',\n unknown: 'unknown'\n}\n\nexport function getBrowser() {\n if (isChrome()) return Browser.chrome;\n else if (isEdge()) return Browser.edge;\n else if (isFirefox()) return Browser.firefox;\n else if (isSafari()) return Browser.safari;\n else if (isIE()) return Browser.ie;\n else return Browser.unknown;\n}\n\nexport default getBrowser;\n","export function isMobile() {\n const userAgent = navigator.userAgent.toLowerCase()\n const _isMobile = /Android|iPhone|iPad/i.test(userAgent) || (/Harmony/i.test(userAgent) && /Mobile/i.test(userAgent))\n\n // 检测触摸屏设备(增强平板识别)\n const isTouchScreen = 'ontouchstart' in window || navigator.maxTouchPoints > 0\n\n // 特殊处理iPad:iPadOS 13+的UA包含Macintosh但支持触摸\n const isiPad = /Macintosh/i.test(userAgent) && isTouchScreen\n\n return _isMobile || isiPad\n}\n\nexport function isPC() {\n return !isMobile();\n}"],"names":["App","isYzj","agent","navigator","userAgent","test","isYzjDesktop","isYzjOldDesktop","isWX","indexOf","isWxWork","isDD","_isDD","isDDMiniProgram","isWeLink","isFeiShu","getApp","isChrome","toLowerCase","isChromiumEdge","isLegacyEdge","isEdge","isFirefox","isIE","isSafari","Browser","getBrowser","isMobile","_isMobile","isTouchScreen","window","maxTouchPoints","isiPad","isPC"],"mappings":"AAAA,MAAMA,EACC,YADDA,EAEQ,oBAFRA,EAGW,wBAHXA,EAIA,SAJAA,EAKA,WALAA,EAMI,SANJA,EAOI,SAPJA,EAQI,SARJA,EASK,UAGJ,SAASC,IACd,MAAMC,EAAQC,UAAUC,UACxB,MAAO,+CAA+CC,KAAKH,EAC7D,CAEO,SAASI,IACd,MAAMJ,EAAQC,UAAUC,UACxB,MAAO,gBAAgBC,KAAKH,EAC9B,CAEO,SAASK,IACd,MAAML,EAAQC,UAAUC,UACxB,MAAO,iBAAiBC,KAAKH,EAC/B,CAEO,SAASM,IACd,MAAMN,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,mBAAoB,GAAMP,EAAMO,QAAQ,UAAY,CAC3E,CAEO,SAASC,IACd,MAAMR,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,mBAAoB,GAAMP,EAAMO,QAAQ,WAAY,CAC3E,CAEO,SAASE,IACd,MAAMT,EAAQC,UAAUC,UAClBQ,EAAQV,EAAMO,QAAQ,aAAc,EACpCI,GAAmD,IAAjCX,EAAMO,QAAQ,iBAAqD,IAA5BP,EAAMO,QAAQ,UAC7E,OAAOG,GAASC,CAClB,CAEO,SAASC,IACd,MAAMZ,EAAQC,UAAUC,UACxB,OAAOF,EAAMO,QAAQ,WAAY,GAAMP,EAAMO,QAAQ,cAAe,CACtE,CAEO,SAASM,IAEd,OADcZ,UAAUC,UACXK,QAAQ,UAAW,CAClC,CAEO,SAASO,IACd,OAAIf,IAAgBD,EACXM,IAAuBN,EACvBO,IAA0BP,EAC1BQ,IAAeR,EACfU,IAAmBV,EACnBW,IAAeX,EACfc,EAAiBd,EACjBe,IAAmBf,EAChBA,CACd,CChEO,SAASiB,IACd,MAAMb,EAAYD,UAAUC,UAAUc,cACtC,MAAO,eAAeb,KAAKD,KAAe,0CAA0CC,KAAKD,EAC3F,CAEO,SAASe,IACd,MAAMf,EAAYD,UAAUC,UAAUc,cACtC,MAAO,MAAMb,KAAKD,EACpB,CAEO,SAASgB,IACd,MAAMhB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,OAAOb,KAAKD,KAAe,MAAMC,KAAKD,EAC/C,CAEO,SAASiB,IACd,OAAOF,KAAoBC,GAC7B,CAEO,SAASE,IACd,MAAMlB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,gBAAgBb,KAAKD,EAC9B,CAEO,SAASmB,IACd,MAAMnB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,eAAeb,KAAKD,EAC7B,CAEO,SAASoB,IACd,MAAMpB,EAAYD,UAAUC,UAAUc,cACtC,MAAO,SAASb,KAAKD,KAAe,wCAAwCC,KAAKD,EACnF,CAEA,MAAMqB,EACI,SADJA,EAEE,OAFFA,EAGK,UAHLA,EAIA,KAJAA,EAKI,SALJA,EAMK,UAGJ,SAASC,IACd,OAAIT,IAAmBQ,EACdJ,IAAiBI,EACjBH,IAAoBG,EACpBD,IAAmBC,EACnBF,IAAeE,EACZA,CACd,CClDO,SAASE,IACd,MAAMvB,EAAYD,UAAUC,UAAUc,cAChCU,EAAY,uBAAuBvB,KAAKD,IAAe,WAAWC,KAAKD,IAAc,UAAUC,KAAKD,GAGpGyB,EAAgB,iBAAkBC,QAAU3B,UAAU4B,eAAiB,EAGvEC,EAAS,aAAa3B,KAAKD,IAAcyB,EAE/C,OAAOD,GAAaI,CACtB,CAEO,SAASC,IACd,OAAQN,GACV"}
@@ -0,0 +1,2 @@
1
+ const e=new Set;function t(t,n,o){if(t||(t=document.head),!n||"string"!=typeof n)throw new TypeError("Invalid script URL");return e.has(n)?("function"==typeof o&&o(null,n),Promise.resolve(n)):new Promise((r,l)=>{const a=document.createElement("script");a.src=n,a.type="text/javascript",a.async=!0,a.onload=()=>{e.add(n),"function"==typeof o&&o(null,n),r(n)},a.onerror=e=>{"function"==typeof o&&o(e,n),l(e)};(t.template||t).appendChild(a)})}function n(t,n,o){if(t||(t=document.head),!n||"string"!=typeof n)throw new TypeError("Invalid CSS URL");return e.has(n)?("function"==typeof o&&o(null,n),Promise.resolve(n)):new Promise((r,l)=>{const a=document.createElement("link");a.rel="stylesheet",a.type="text/css",a.href=n,a.onload=()=>{e.add(n),"function"==typeof o&&o(null,n),r(n)},a.onerror=e=>{"function"==typeof o&&o(e,n),l(e)};(t.template||t).appendChild(a)})}var o=Object.freeze({__proto__:null,loadScript:t,loadStyle:n});export{n as a,o as i,t as l};
2
+ //# sourceMappingURL=index-D_DekteB.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D_DekteB.esm.js","sources":["../../src/modules/platformResourceLoader/index.js"],"sourcesContent":["// 用于缓存已加载资源的URL,避免重复加载\nconst loadedResources = new Set();\n\n/**\n * 加载一个外部脚本资源\n * @param {element} elm - 需要将资源注入到该元素下,通常是 document.head\n * @param {string} url - 脚本的URL\n * @param {Function} callback - 加载成功或失败后的回调函数\n * @returns {Promise} - 返回一个Promise,便于异步处理\n */\nexport function loadScript(elm, url, callback) {\n // 参数校验\n if (!elm) {\n elm = document.head\n }\n if (!url || typeof url !== 'string') {\n throw new TypeError('Invalid script URL');\n }\n // 如果URL已经加载过,直接回调\n if (loadedResources.has(url)) {\n if (typeof callback === 'function') {\n callback(null, url);\n }\n return Promise.resolve(url);\n }\n\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = url;\n script.type = 'text/javascript';\n script.async = true;\n\n script.onload = () => {\n loadedResources.add(url); // 添加到已加载缓存\n if (typeof callback === 'function') {\n callback(null, url);\n }\n resolve(url);\n };\n\n script.onerror = (error) => {\n if (typeof callback === 'function') {\n callback(error, url);\n }\n reject(error);\n };\n\n const target = elm.template || elm\n target.appendChild(script);\n });\n}\n\n/**\n * 加载一个外部CSS样式表资源\n * @param {element} elm - 需要将资源注入到该元素下,通常是 document.head\n * @param {string} url - 样式表的URL\n * @param {Function} callback - 加载成功或失败后的回调函数\n * @returns {Promise} - 返回一个Promise,便于异步处理\n */\nexport function loadStyle(elm, url, callback) {\n // 参数校验\n if (!elm) {\n elm = document.head\n }\n if (!url || typeof url !== 'string') {\n throw new TypeError('Invalid CSS URL');\n }\n if (loadedResources.has(url)) {\n if (typeof callback === 'function') {\n callback(null, url);\n }\n return Promise.resolve(url);\n }\n\n return new Promise((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.type = 'text/css';\n link.href = url;\n\n link.onload = () => {\n loadedResources.add(url);\n if (typeof callback === 'function') {\n callback(null, url);\n }\n resolve(url);\n };\n\n link.onerror = (error) => {\n if (typeof callback === 'function') {\n callback(error, url);\n }\n reject(error);\n };\n\n const target = elm.template || elm\n target.appendChild(link);\n });\n}"],"names":["loadedResources","Set","loadScript","elm","url","callback","document","head","TypeError","has","Promise","resolve","reject","script","createElement","src","type","async","onload","add","onerror","error","template","appendChild","loadStyle","link","rel","href"],"mappings":"AACA,MAAMA,EAAkB,IAAIC,IASrB,SAASC,EAAWC,EAAKC,EAAKC,GAKnC,GAHKF,IACHA,EAAMG,SAASC,OAEZH,GAAsB,iBAARA,EACjB,MAAM,IAAII,UAAU,sBAGtB,OAAIR,EAAgBS,IAAIL,IACE,mBAAbC,GACTA,EAAS,KAAMD,GAEVM,QAAQC,QAAQP,IAGlB,IAAIM,QAAQ,CAACC,EAASC,KAC3B,MAAMC,EAASP,SAASQ,cAAc,UACtCD,EAAOE,IAAMX,EACbS,EAAOG,KAAO,kBACdH,EAAOI,OAAQ,EAEfJ,EAAOK,OAAS,KACdlB,EAAgBmB,IAAIf,GACI,mBAAbC,GACTA,EAAS,KAAMD,GAEjBO,EAAQP,IAGVS,EAAOO,QAAWC,IACQ,mBAAbhB,GACTA,EAASgB,EAAOjB,GAElBQ,EAAOS,KAGMlB,EAAImB,UAAYnB,GACxBoB,YAAYV,IAEvB,CASO,SAASW,EAAUrB,EAAKC,EAAKC,GAKlC,GAHKF,IACHA,EAAMG,SAASC,OAEZH,GAAsB,iBAARA,EACjB,MAAM,IAAII,UAAU,mBAEtB,OAAIR,EAAgBS,IAAIL,IACE,mBAAbC,GACTA,EAAS,KAAMD,GAEVM,QAAQC,QAAQP,IAGlB,IAAIM,QAAQ,CAACC,EAASC,KAC3B,MAAMa,EAAOnB,SAASQ,cAAc,QACpCW,EAAKC,IAAM,aACXD,EAAKT,KAAO,WACZS,EAAKE,KAAOvB,EAEZqB,EAAKP,OAAS,KACZlB,EAAgBmB,IAAIf,GACI,mBAAbC,GACTA,EAAS,KAAMD,GAEjBO,EAAQP,IAGVqB,EAAKL,QAAWC,IACU,mBAAbhB,GACTA,EAASgB,EAAOjB,GAElBQ,EAAOS,KAGMlB,EAAImB,UAAYnB,GACxBoB,YAAYE,IAEvB"}
@@ -0,0 +1,2 @@
1
+ class t{constructor(){this.accessToken=null,this.refreshToken=null,this.isInitialized=!1,this.isAuthenticating=!1,this.authPromise=null,this.authConfig=null,this.listeners=new Set,this.loadTokensFromStorage()}async initialize(t){if(this.isInitialized&&this.accessToken)return!0;this.authConfig={endpoint:t.endpoint||"/kapi/oauth2/getToken",method:t.method||"POST",headers:t.headers||{"Content-Type":"application/json"},body:t.bodyParams||{},params:t.queryParams||{}};try{await this.authenticate(),this.isInitialized=!0,this.notifyListeners("initialized",{success:!0})}catch(t){throw console.error("AuthManager: Failed to initialize auth - ",t),this.notifyListeners("initialized",{success:!1,error:t}),t}}async authenticate(){if(this.isAuthenticating&&this.authPromise)return this.authPromise;this.isAuthenticating=!0,this.authPromise=this._performAuthentication();try{const t=await this.authPromise;return this.notifyListeners("authenticated",{success:!0}),t}catch(t){throw this.notifyListeners("authenticated",{success:!1,error:t}),t}finally{this.isAuthenticating=!1,this.authPromise=null}}async _performAuthentication(){if(!this.authConfig)throw new Error("Authentication configuration is missing.");const{endpoint:t,headers:e,body:r,method:n}=this.authConfig;try{const i=await fetch(t,{method:n,headers:e,body:JSON.stringify(r)});if(!i.ok)throw new Error(`Authentication failed: ${i.status} - ${i.statusText}`);const a=await i.json();if(!0===a.status&&"0"===a.errorCode)return this.accessToken=a.data.access_token,this.refreshToken=a.data.refresh_token,this.saveTokensToStorage(),a;throw new Error(`Authentication failed: ${a.errorCode} - ${a.message}`)}catch(t){throw console.error("AuthManager: Authentication failed -",t),t}}async refreshAccessToken(){return console.log("AuthManager: Refreshing access token..."),this.authConfig.body.nonce=this.generateNonce(),this.authConfig.body.timestamp=this.formatTimestamp(),this._performAuthentication()}generateNonce(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){const e=16*Math.random()|0;return("x"==t?e:3&e|8).toString(16)})}formatTimestamp(t=new Date){return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`}getAccessToken(){return this.accessToken}isAuthenticated(){return!!this.accessToken}isReady(){return this.isInitialized&&this.isAuthenticated()}logout(){this.clearTokens(),this.isInitialized=!1,this.authConfig=null,this.notifyListeners("logout",{})}clearTokens(){this.accessToken=null,this.refreshToken=null,this.clearTokensFromStorage()}loadTokensFromStorage(){try{this.accessToken=localStorage.getItem("__kapi_auth_manager_access_token__"),this.refreshToken=localStorage.getItem("__kapi_auth_manager_refresh_token__")}catch(t){console.warn("AuthManager: Error loading tokens from storage")}}saveTokensToStorage(){try{this.accessToken&&localStorage.setItem("__kapi_auth_manager_access_token__",this.accessToken),this.refreshToken&&localStorage.setItem("__kapi_auth_manager_refresh_token__",this.refreshToken)}catch(t){console.warn("AuthManager: Error saving tokens to storage")}}clearTokensFromStorage(){try{localStorage.removeItem("__kapi_auth_manager_access_token__"),localStorage.removeItem("__kapi_auth_manager_refresh_token__")}catch(t){console.warn("AuthManager: Error removing tokens to storage")}}addListener(t){this.listeners.add(t)}removeListener(t){this.listeners.delete(t)}notifyListeners(t,e){this.listeners.forEach(r=>{try{r(t,e)}catch(t){console.error("AuthManager: Error notifying listener")}})}async waitForAuth(){return!this.isAuthenticated()||(this.isAuthenticating&&this.authPromise?(await this.authPromise,this.isAuthenticated()):void 0)}}const e=new t;async function r(t){return await e.initialize(t)}function n(){return e.isAuthenticated()}class i{constructor(t){this.name="BosWireAdapter",this.dataCallback=t,this.config={},this.abortController=null,this.retryCount=0,this.maxRetries=3,this.retryDelay=1e3,this.cache=new Map,this.cacheTimeout=3e5,this.authManager=e,this.pendingRequests=new Map,this.requestQueue=[],this.isProcessingQueue=!1}connect(){}update(t){this.config={...t},this.retryCount=0,this.shouldFetchData(t)?this.fetchDataWithQueue(t):this.dataCallback({data:null,error:null})}disconnect(){this.abortController&&this.abortController.abort(),this.cache.clear(),this.pendingRequests.clear(),this.requestQueue=[],this.isProcessingQueue=!1}async waitForAuth(){try{return this.authManager.isReady()||await this.authManager.waitForAuth(),!0}catch(t){throw t}}getAccessToken(){return this.authManager.getAccessToken()}isAuthenticated(){return this.authManager.isAuthenticated()}shouldFetchData(t){return t&&t.endpoint&&void 0!==t.endpoint}async fetchDataWithQueue(t){const e=this.generateRequestKey(t);if(this.pendingRequests.has(e))console.log("Request is inqueue");else{this.requestQueue.push({config:t,requestKey:e,callback:this.callback}),this.pendingRequests.set(e,!0);try{await this.authManager.waitForAuth()}catch(t){return console.error("Bos Adapter: Authentication failed, no need to send any request"),this.dataCallback({data:null,error:{message:`Auth failed: ${t.message}`,status:"AUTH_FAILED",originalError:t}}),void this.pendingRequests.delete(e)}this.isProcessingQueue||this.processRequestQueue()}}async processRequestQueue(){for(this.isProcessingQueue=!0;this.requestQueue.length>0;){const t=this.requestQueue.shift();try{await this.fetchDataWithRetry(t.config)}catch(t){console.error("Error fetching data:",t)}finally{this.pendingRequests.delete(t.requestKey)}await this.delay(10)}this.isProcessingQueue=!1}async fetchDataWithRetry(t){const e=this.generateCacheKey(t),r=this.getCachedData(e);if(r)return void this.dataCallback(r);let n=null;for(let r=0;r<this.maxRetries;r++)try{const r=await this.performRequest(t);return this.setCacheData(e,r),void this.dataCallback(r)}catch(t){if(n=t,t&&"AbortError"===t.name)return;r<this.maxRetries&&await this.delay(this.retryDelay*Math.pow(2,r))}this.dataCallback({data:null,error:{message:n.message,status:n.status||"NETWORK_ERROR",retries:this.maxRetries}})}async performRequest(t){const{endpoint:e,method:r="GET",params:n={},headers:i={}}=t;this.abortController&&this.abortController.abort(),this.abortController=new AbortController;let a=e;if("GET"===r&&n){a=`${a}?${new URLSearchParams(n).toString()}`}const s={method:r,headers:{"Content-Type":"application/json",access_token:this.authManager.getAccessToken(),...i},body:"GET"===r?null:JSON.stringify(n),signal:this.abortController.signal},o=await fetch(a,s);if(!o.ok)throw new Error(`HTTP error! Status: ${o.status} - ${o.statusText}`);const c=await o.json();return c?{data:c,error:null}:{data:null,error:{message:c.message,errorCode:c.errorCode,status:c.status}}}getCachedData(t){const e=this.cache.get(t);return e&&Date.now()-e.timestamp<this.cacheTimeout?e.data:(e&&this.cache.delete(t),null)}setCacheData(t,e){if(this.cache.set(t,{data:e,timestamp:Date.now()}),this.cache.size>100){const t=this.cache.keys().next().value;this.cache.delete(t)}}generateCacheKey(t){return JSON.stringify({endpoint:t.endpoint,params:t.params,method:t.method||"GET"})}generateRequestKey(t){return this.generateCacheKey(t)}delay(t){return new Promise(e=>setTimeout(e,t))}static clearAllCache(){this.cache=new Map}static configure(t){void 0!==t.maxRetries&&(BosWireAdapter.prototype.maxRetries=t.maxRetries),void 0!==t.retryDelay&&(BosWireAdapter.prototype.retryDelay=t.retryDelay),void 0!==t.cacheTimeout&&(BosWireAdapter.prototype.cacheTimeout=t.cacheTimeout)}}function a(t,e){if(!t&&!e)throw new Error("No config provided");if(!t?.endpointConfig&&!e?.endpointConfig)throw new Error("No endpointConfig provided");let r=t?.endpointConfig,n=e?.endpointConfig;if("string"==typeof r)return r;if("string"==typeof n)return n;if(r&&r.endpoint)return r.endpoint;if(n&&n.endpoint)return n.endpoint;r=r||{},n=n||{};const i=r.isv||n.isv||"kd",a=r.app||n.app,s=r.source||n.source,o=r.version||n.version||"v1",c=r.sourceId||n.sourceId,h=r.subSource||n.subSource,u=r.action||n.action;if(!a)throw new Error("Invalid config app provided");if(!s)throw new Error("Invalid config source provided");let d=`${location.pathname}kwc/${o}/${i}/${a}/${s}`;return c&&(d+=`/${c}`,h&&(d+=`/${h}`),u&&(d+=`/${u}`)),d.startsWith("/")||(d=`/${d}`),d}function s(t="GET",e={}){return function(r){if("function"!=typeof r)throw new Error("Adapter API expects a data callback function");const n=new i(r),s=n.update.bind(n);return n.update=function(r){const n={endpoint:a(r,e),method:t,...e,...r};return delete n.endpointConfig,r&&"object"==typeof r&&!r.endpoint&&(n.params=r.params),s(n)},n}}const o=s("GET"),c=s("POST"),h=s("DELETE"),u=s("PUT"),d=s("PATCH");var l=Object.freeze({__proto__:null,doDelete:h,doGet:o,doPatch:d,doPost:c,doPut:u});function g(t,e){if(!t&&!e)throw new Error("No config provided");if(!t?.endpointConfig&&!e?.endpointConfig)throw new Error("No endpointConfig provided");let r=t?.endpointConfig,n=e?.endpointConfig;if("string"==typeof r)return r;if("string"==typeof n)return n;if(r&&r.endpoint)return r.endpoint;if(n&&n.endpoint)return n.endpoint;r=r||{},n=n||{};const i=r.isv||n.isv||"kd",a=r.app||n.app,s=r.source||n.source,o=r.version||n.version||"v1",c=r.sourceId||n.sourceId,h=r.subSource||n.subSource,u=r.action||n.action;if(!a)throw new Error("Invalid config app provided");if(!s)throw new Error("Invalid config source provided");let d=`${location.pathname}kwc/${o}/${i}/${a}/${s}`;return c&&(d+=`/${c}`,h&&(d+=`/${h}`),u&&(d+=`/${u}`)),d.startsWith("/")||(d=`/${d}`),d}function p(t="GET",e={}){return function(r={}){const n={endpoint:g(r,e),method:t,...e,...r};delete n.endpointConfig,r&&"object"==typeof r&&!r.endpoint&&(n.params=r.params);let a=null,s=!1,o=null;return function(t,e,r){const n=t=>{try{Object.defineProperty(t,"cancel",{value:e,configurable:!0,enumerable:!1}),Object.defineProperty(t,"adapter",{get:()=>r,configurable:!0,enumerable:!1})}catch{}const i=t.then.bind(t),a=t.catch.bind(t),s=t.finally?t.finally.bind(t):void 0;return t.then=(...t)=>{const e=i(...t);return n(e),e},t.catch=(...t)=>{const e=a(...t);return n(e),e},s&&(t.finally=(...t)=>{const e=s(...t);return n(e),e}),t};return n(t)}(new Promise((t,e)=>{o=e,a=new i(r=>{if(!s){s=!0;try{a&&a.disconnect()}catch{}r.error?e(r.error):t(r)}}),a.connect(),a.update(n)}),()=>{if(!a)return{aborted:!1,removed:!1};let t=!1;try{a.abortController&&(a.abortController.abort(),t=!0)}catch{}!s&&o&&(s=!0,o({message:"Request canceled",status:"CANCELED"}));try{a.disconnect()}catch{}return{aborted:t,removed:!1}},a)}}const f=p("GET"),m=p("POST"),y=p("DELETE"),w=p("PUT"),_=p("PATCH");var k=Object.freeze({__proto__:null,doDelete:y,doGet:f,doPatch:_,doPost:m,doPut:w}),T=Object.freeze({__proto__:null,AuthManager:t,adapterApi:l,authManager:e,initializeAuth:r,isAuthenticated:n,promiseApi:k});export{t as A,l as a,e as b,r as c,n as d,T as i,k as p};
2
+ //# sourceMappingURL=index-RQMVLnNM.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-RQMVLnNM.esm.js","sources":["../../src/modules/api/authManager.js","../../src/modules/api/adapter.js","../../src/modules/api/adapterApi.js","../../src/modules/api/promiseApi.js"],"sourcesContent":["/**\n * Global open api auth manager\n */\n\nclass AuthManager {\n constructor() {\n this.accessToken = null;\n this.refreshToken = null;\n this.isInitialized = false;\n this.isAuthenticating = false;\n this.authPromise = null;\n this.authConfig = null;\n this.listeners = new Set();\n\n // Try to load tokens from storage\n this.loadTokensFromStorage();\n }\n\n async initialize(config) {\n if (this.isInitialized && this.accessToken) {\n return true;\n }\n\n this.authConfig = {\n endpoint: config.endpoint || '/kapi/oauth2/getToken',\n method: config.method || 'POST',\n headers: config.headers || {\n 'Content-Type': 'application/json'\n },\n body: config.bodyParams || {},\n params: config.queryParams || {}\n };\n\n try {\n await this.authenticate();\n this.isInitialized = true;\n this.notifyListeners('initialized', { success: true });\n } catch (error) {\n console.error('AuthManager: Failed to initialize auth - ', error);\n this.notifyListeners('initialized', { success: false, error });\n throw error;\n }\n }\n\n async authenticate() {\n if (this.isAuthenticating && this.authPromise) {\n return this.authPromise;\n }\n\n this.isAuthenticating = true;\n this.authPromise = this._performAuthentication();\n\n try {\n const result = await this.authPromise;\n this.notifyListeners('authenticated', { success: true });\n return result;\n } catch (error) {\n this.notifyListeners('authenticated', { success: false, error });\n throw error;\n } finally {\n this.isAuthenticating = false;\n this.authPromise = null;\n }\n }\n\n async _performAuthentication() {\n if (!this.authConfig) {\n throw new Error('Authentication configuration is missing.');\n }\n\n const { endpoint, headers, body, method } = this.authConfig;\n try {\n const response = await fetch(endpoint, {\n method,\n headers,\n body: JSON.stringify(body)\n });\n\n if (!response.ok) {\n throw new Error(`Authentication failed: ${response.status} - ${response.statusText}`);\n }\n\n const authData = await response.json();\n if (authData.status === true && authData.errorCode === '0') {\n this.accessToken = authData.data.access_token;\n this.refreshToken = authData.data.refresh_token;\n\n this.saveTokensToStorage();\n\n return authData;\n }\n throw new Error(`Authentication failed: ${authData.errorCode} - ${authData.message}`);\n } catch (error) {\n console.error('AuthManager: Authentication failed -', error);\n throw error;\n }\n }\n\n async refreshAccessToken() {\n console.log('AuthManager: Refreshing access token...')\n this.authConfig.body.nonce = this.generateNonce();\n this.authConfig.body.timestamp = this.formatTimestamp();\n return this._performAuthentication();\n }\n\n // 生成随机UUID作为nonce\n generateNonce() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = Math.random() * 16 | 0;\n const v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n // 格式化时间戳为 YYYY-MM-DD HH:mm:ss 格式\n formatTimestamp(date = new Date()) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n }\n\n getAccessToken() {\n return this.accessToken;\n }\n\n isAuthenticated() {\n return !!this.accessToken;\n }\n\n isReady() {\n return this.isInitialized && this.isAuthenticated();\n }\n\n logout() {\n this.clearTokens();\n this.isInitialized = false;\n this.authConfig = null;\n this.notifyListeners('logout', {});\n }\n\n clearTokens() {\n this.accessToken = null;\n this.refreshToken = null;\n this.clearTokensFromStorage();\n }\n\n loadTokensFromStorage() {\n try {\n this.accessToken = localStorage.getItem('__kapi_auth_manager_access_token__');\n this.refreshToken = localStorage.getItem('__kapi_auth_manager_refresh_token__');\n } catch (error) {\n console.warn('AuthManager: Error loading tokens from storage');\n }\n }\n\n saveTokensToStorage() {\n try {\n if (this.accessToken) {\n localStorage.setItem('__kapi_auth_manager_access_token__', this.accessToken);\n }\n\n if (this.refreshToken) {\n localStorage.setItem('__kapi_auth_manager_refresh_token__', this.refreshToken);\n }\n } catch (error) {\n console.warn('AuthManager: Error saving tokens to storage');\n }\n }\n\n clearTokensFromStorage() {\n try {\n localStorage.removeItem('__kapi_auth_manager_access_token__');\n localStorage.removeItem('__kapi_auth_manager_refresh_token__');\n } catch (error) {\n console.warn('AuthManager: Error removing tokens to storage');\n }\n }\n\n addListener(callback) {\n this.listeners.add(callback);\n }\n\n removeListener(callback) {\n this.listeners.delete(callback);\n }\n\n notifyListeners(event, data) {\n this.listeners.forEach((listener) => {\n try {\n listener(event, data);\n } catch (error) {\n console.error('AuthManager: Error notifying listener')\n }\n });\n }\n\n async waitForAuth() {\n if (!this.isAuthenticated()) {\n return true;\n }\n\n if (this.isAuthenticating && this.authPromise) {\n await this.authPromise;\n return this.isAuthenticated();\n }\n }\n}\n\nconst authManager = new AuthManager();\n\nexport { authManager, AuthManager };\nexport default authManager;\n\nexport async function initializeAuth(config) {\n return await authManager.initialize(config);\n}\n\nexport function isAuthenticated() {\n return authManager.isAuthenticated();\n}","import authManager from \"./authManager\";\n\nexport default class Adapter {\n constructor(dataCallback) {\n this.name = 'BosWireAdapter';\n\n this.dataCallback = dataCallback;\n this.config = {};\n this.abortController = null;\n\n this.retryCount = 0; // current retry count\n this.maxRetries = 3; // max retry times\n this.retryDelay = 1000;\n this.cache = new Map();\n this.cacheTimeout = 5 * 60 * 1000; // cache timeout in milliseconds, default is 5mins\n\n this.authManager = authManager;\n\n // Request queue\n this.pendingRequests = new Map();\n this.requestQueue = [];\n this.isProcessingQueue = false;\n }\n\n // Lifecycle - create connect\n connect() {}\n\n // Lifecycle - update data\n update(config) {\n this.config = { ...config };\n this.retryCount = 0;\n\n if (this.shouldFetchData(config)) {\n this.fetchDataWithQueue(config);\n } else {\n this.dataCallback({ data: null, error: null });\n }\n }\n\n // Lifecycle - destroy\n disconnect() {\n if (this.abortController) {\n this.abortController.abort();\n }\n\n this.cache.clear();\n this.pendingRequests.clear();\n this.requestQueue = [];\n this.isProcessingQueue = false;\n }\n\n async waitForAuth() {\n try {\n if (!this.authManager.isReady()) {\n await this.authManager.waitForAuth();\n }\n return true;\n } catch(error) {\n throw error;\n }\n }\n\n getAccessToken() {\n return this.authManager.getAccessToken();\n }\n\n isAuthenticated() {\n return this.authManager.isAuthenticated();\n }\n\n shouldFetchData (config) {\n return config && config.endpoint && config.endpoint !== undefined;\n }\n\n async fetchDataWithQueue(config) {\n const requestKey = this.generateRequestKey(config);\n\n if (this.pendingRequests.has(requestKey)) {\n console.log('Request is inqueue');\n return;\n }\n\n this.requestQueue.push({ config, requestKey, callback: this.callback });\n this.pendingRequests.set(requestKey, true);\n\n try {\n await this.authManager.waitForAuth();\n } catch (error) {\n console.error('Bos Adapter: Authentication failed, no need to send any request');\n this.dataCallback({\n data: null,\n error: {\n message: `Auth failed: ${error.message}`,\n status: 'AUTH_FAILED',\n originalError: error\n }\n });\n this.pendingRequests.delete(requestKey);\n return;\n }\n\n if (!this.isProcessingQueue) {\n this.processRequestQueue();\n }\n }\n\n async processRequestQueue() { \n this.isProcessingQueue = true;\n while (this.requestQueue.length > 0) {\n const request = this.requestQueue.shift();\n try {\n await this.fetchDataWithRetry(request.config);\n } catch (error) {\n console.error('Error fetching data:', error)\n } finally {\n this.pendingRequests.delete(request.requestKey);\n }\n\n // avoid too fast\n await this.delay(10);\n }\n this.isProcessingQueue = false;\n }\n\n async fetchDataWithRetry(config) { \n const cacheKey = this.generateCacheKey(config);\n \n const cachedData = this.getCachedData(cacheKey);\n if (cachedData) {\n this.dataCallback(cachedData);\n return;\n }\n\n let lastError = null;\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n const result = await this.performRequest(config);\n\n this.setCacheData(cacheKey, result);\n this.dataCallback(result);\n return;\n } catch (error) {\n lastError = error;\n\n if (error && error.name === 'AbortError') {\n return;\n }\n\n if (attempt < this.maxRetries) {\n await this.delay(this.retryDelay * Math.pow(2, attempt));\n }\n }\n }\n\n this.dataCallback({\n data: null,\n error: {\n message: lastError.message,\n status: lastError.status || 'NETWORK_ERROR',\n retries: this.maxRetries\n }\n })\n }\n\n async performRequest(config) {\n const { endpoint, method = 'GET', params = {}, headers = {} } = config;\n\n if (this.abortController) {\n this.abortController.abort();\n }\n\n this.abortController = new AbortController();\n\n let url = endpoint;\n if (method === 'GET' && params) {\n const searchParams = new URLSearchParams(params);\n url = `${url}?${searchParams.toString()}`\n }\n\n const requestOptions = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'access_token': this.authManager.getAccessToken(),\n ...headers\n },\n body: method === 'GET' ? null : JSON.stringify(params),\n signal: this.abortController.signal\n }\n\n const response = await fetch(url, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status} - ${response.statusText}`);\n }\n\n const data = await response.json();\n if (data) {\n return { data: data, error: null };\n }\n\n return {\n data: null,\n error: {\n message: data.message,\n errorCode: data.errorCode,\n status: data.status\n }\n }\n }\n\n getCachedData(cacheKey) {\n const cached = this.cache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < this.cacheTimeout) {\n return cached.data;\n }\n\n if (cached) {\n this.cache.delete(cacheKey);\n }\n return null;\n }\n\n setCacheData(cacheKey, data) {\n this.cache.set(cacheKey, {\n data,\n timestamp: Date.now(),\n });\n\n if (this.cache.size > 100) {\n const firstKey = this.cache.keys().next().value;\n this.cache.delete(firstKey);\n }\n }\n\n generateCacheKey(config) {\n return JSON.stringify({\n endpoint: config.endpoint,\n params: config.params,\n method: config.method || 'GET'\n })\n }\n\n generateRequestKey(config) {\n return this.generateCacheKey(config);\n }\n\n delay(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n static clearAllCache() {\n this.cache = new Map();\n }\n\n static configure(options) {\n if (options.maxRetries !== undefined) {\n BosWireAdapter.prototype.maxRetries = options.maxRetries;\n }\n\n if (options.retryDelay !== undefined) {\n BosWireAdapter.prototype.retryDelay = options.retryDelay;\n }\n\n if (options.cacheTimeout !== undefined) {\n BosWireAdapter.prototype.cacheTimeout = options.cacheTimeout;\n }\n }\n}\n","import Adapter from './adapter'\n\nfunction getEndpoint(config, defaultConfig) {\n if (!config && !defaultConfig) {\n throw new Error('No config provided');\n }\n\n if (!config?.endpointConfig && !defaultConfig?.endpointConfig) {\n throw new Error('No endpointConfig provided');\n }\n\n let endpointConfig = config?.endpointConfig;\n let defaultEndpointConfig = defaultConfig?.endpointConfig;\n if (typeof endpointConfig === 'string') return endpointConfig;\n if (typeof defaultEndpointConfig === 'string') return defaultEndpointConfig;\n\n if (endpointConfig && endpointConfig.endpoint) {\n return endpointConfig.endpoint;\n }\n\n if (defaultEndpointConfig && defaultEndpointConfig.endpoint) {\n return defaultEndpointConfig.endpoint;\n }\n\n endpointConfig = endpointConfig || {};\n defaultEndpointConfig = defaultEndpointConfig || {};\n\n const isv = endpointConfig.isv || defaultEndpointConfig.isv || 'kd';\n const app = endpointConfig.app || defaultEndpointConfig.app;\n const source = endpointConfig.source || defaultEndpointConfig.source;\n const version = endpointConfig.version || defaultEndpointConfig.version || 'v1';\n const sourceId = endpointConfig.sourceId || defaultEndpointConfig.sourceId;\n const subSource = endpointConfig.subSource || defaultEndpointConfig.subSource;\n const action = endpointConfig.action || defaultEndpointConfig.action;\n\n if (!app) {\n throw new Error('Invalid config app provided');\n }\n\n if (!source) {\n throw new Error('Invalid config source provided');\n }\n\n let result = `${location.pathname}kwc/${version}/${isv}/${app}/${source}`\n if (sourceId) {\n result += `/${sourceId}`\n\n if (subSource) {\n result += `/${subSource}`\n }\n\n if (action) {\n result += `/${action}`\n }\n }\n\n if (!result.startsWith('/')) {\n result = `/${result}`\n }\n\n return result\n}\n\nfunction createAdapterMethod(defaultMethod = 'GET', defaultConfig = {}) {\n return function adapterFactory(dataCallback) {\n if (typeof dataCallback !== 'function') {\n throw new Error('Adapter API expects a data callback function');\n }\n\n const adapter = new Adapter(dataCallback);\n\n const originalUpdate = adapter.update.bind(adapter);\n adapter.update = function (config) {\n const fullConfig = {\n endpoint: getEndpoint(config, defaultConfig),\n method: defaultMethod,\n ...defaultConfig,\n ...config\n }\n delete fullConfig.endpointConfig;\n\n if (config && typeof config === 'object' && !config.endpoint) {\n fullConfig.params = config.params;\n }\n\n return originalUpdate(fullConfig);\n }\n\n // 注:适配器方式不提供取消能力;如需取消请使用 promiseApi。\n\n return adapter;\n }\n}\n\nexport const doGet = createAdapterMethod('GET')\nexport const doPost = createAdapterMethod('POST')\nexport const doDelete = createAdapterMethod('DELETE')\nexport const doPut = createAdapterMethod('PUT')\nexport const doPatch = createAdapterMethod('PATCH')","import Adapter from './adapter'\n\n// 将取消能力附加到 Promise,并在链式调用中继承\nfunction attachCancelable(basePromise, cancel, adapter) {\n const setCancelable = (p) => {\n try {\n Object.defineProperty(p, 'cancel', { value: cancel, configurable: true, enumerable: false });\n Object.defineProperty(p, 'adapter', { get: () => adapter, configurable: true, enumerable: false });\n } catch {}\n\n const nativeThen = p.then.bind(p);\n const nativeCatch = p.catch.bind(p);\n const nativeFinally = p.finally ? p.finally.bind(p) : undefined;\n\n p.then = (...args) => {\n const next = nativeThen(...args);\n setCancelable(next);\n return next;\n }\n\n p.catch = (...args) => {\n const next = nativeCatch(...args);\n setCancelable(next);\n return next;\n }\n\n if (nativeFinally) {\n p.finally = (...args) => {\n const next = nativeFinally(...args);\n setCancelable(next);\n return next;\n }\n }\n\n return p;\n }\n\n return setCancelable(basePromise);\n}\n\nfunction getEndpoint(config, defaultConfig) {\n if (!config && !defaultConfig) {\n throw new Error('No config provided');\n }\n\n if (!config?.endpointConfig && !defaultConfig?.endpointConfig) {\n throw new Error('No endpointConfig provided');\n }\n\n let endpointConfig = config?.endpointConfig;\n let defaultEndpointConfig = defaultConfig?.endpointConfig;\n if (typeof endpointConfig === 'string') return endpointConfig;\n if (typeof defaultEndpointConfig === 'string') return defaultEndpointConfig;\n\n if (endpointConfig && endpointConfig.endpoint) {\n return endpointConfig.endpoint;\n }\n\n if (defaultEndpointConfig && defaultEndpointConfig.endpoint) {\n return defaultEndpointConfig.endpoint;\n }\n\n endpointConfig = endpointConfig || {};\n defaultEndpointConfig = defaultEndpointConfig || {};\n\n const isv = endpointConfig.isv || defaultEndpointConfig.isv || 'kd';\n const app = endpointConfig.app || defaultEndpointConfig.app;\n const source = endpointConfig.source || defaultEndpointConfig.source;\n const version = endpointConfig.version || defaultEndpointConfig.version || 'v1';\n const sourceId = endpointConfig.sourceId || defaultEndpointConfig.sourceId;\n const subSource = endpointConfig.subSource || defaultEndpointConfig.subSource;\n const action = endpointConfig.action || defaultEndpointConfig.action;\n\n if (!app) {\n throw new Error('Invalid config app provided');\n }\n\n if (!source) {\n throw new Error('Invalid config source provided');\n }\n\n let result = `${location.pathname}kwc/${version}/${isv}/${app}/${source}`\n if (sourceId) {\n result += `/${sourceId}`\n\n if (subSource) {\n result += `/${subSource}`\n }\n\n if (action) {\n result += `/${action}`\n }\n }\n\n if (!result.startsWith('/')) {\n result = `/${result}`\n }\n\n return result\n}\n\nfunction createPromiseMethod(defaultMethod = 'GET', defaultConfig = {}) {\n return function promiseCall(config = {}) {\n const fullConfig = {\n endpoint: getEndpoint(config, defaultConfig),\n method: defaultMethod,\n ...defaultConfig,\n ...config\n }\n delete fullConfig.endpointConfig;\n\n if (config && typeof config === 'object' && !config.endpoint) {\n fullConfig.params = config.params;\n }\n\n let adapter = null;\n let isSettled = false;\n let rejectRef = null;\n\n const promise = new Promise((resolve, reject) => {\n rejectRef = reject;\n adapter = new Adapter((result) => {\n if (isSettled) return;\n isSettled = true;\n try { adapter && adapter.disconnect(); } catch {}\n\n if (result.error) {\n reject(result.error);\n } else {\n resolve(result);\n }\n });\n\n adapter.connect();\n adapter.update(fullConfig);\n });\n\n const cancel = () => {\n if (!adapter) return { aborted: false, removed: false };\n let aborted = false;\n try {\n if (adapter.abortController) {\n adapter.abortController.abort();\n aborted = true;\n }\n } catch {}\n if (!isSettled && rejectRef) {\n isSettled = true;\n rejectRef({ message: 'Request canceled', status: 'CANCELED' });\n }\n try { adapter.disconnect(); } catch {}\n return { aborted, removed: false };\n }\n\n return attachCancelable(promise, cancel, adapter);\n }\n}\n\nexport const doGet = createPromiseMethod('GET')\nexport const doPost = createPromiseMethod('POST')\nexport const doDelete = createPromiseMethod('DELETE')\nexport const doPut = createPromiseMethod('PUT')\nexport const doPatch = createPromiseMethod('PATCH')"],"names":["AuthManager","constructor","this","accessToken","refreshToken","isInitialized","isAuthenticating","authPromise","authConfig","listeners","Set","loadTokensFromStorage","initialize","config","endpoint","method","headers","body","bodyParams","params","queryParams","authenticate","notifyListeners","success","error","console","_performAuthentication","result","Error","response","fetch","JSON","stringify","ok","status","statusText","authData","json","errorCode","data","access_token","refresh_token","saveTokensToStorage","message","refreshAccessToken","log","nonce","generateNonce","timestamp","formatTimestamp","replace","c","r","Math","random","toString","date","Date","getFullYear","String","getMonth","padStart","getDate","getHours","getMinutes","getSeconds","getAccessToken","isAuthenticated","isReady","logout","clearTokens","clearTokensFromStorage","localStorage","getItem","warn","setItem","removeItem","addListener","callback","add","removeListener","delete","event","forEach","listener","waitForAuth","authManager","async","initializeAuth","Adapter","dataCallback","name","abortController","retryCount","maxRetries","retryDelay","cache","Map","cacheTimeout","pendingRequests","requestQueue","isProcessingQueue","connect","update","shouldFetchData","fetchDataWithQueue","disconnect","abort","clear","undefined","requestKey","generateRequestKey","has","push","set","originalError","processRequestQueue","length","request","shift","fetchDataWithRetry","delay","cacheKey","generateCacheKey","cachedData","getCachedData","lastError","attempt","performRequest","setCacheData","pow","retries","AbortController","url","URLSearchParams","requestOptions","signal","cached","get","now","size","firstKey","keys","next","value","ms","Promise","resolve","setTimeout","clearAllCache","configure","options","BosWireAdapter","prototype","getEndpoint","defaultConfig","endpointConfig","defaultEndpointConfig","isv","app","source","version","sourceId","subSource","action","location","pathname","startsWith","createAdapterMethod","defaultMethod","adapter","originalUpdate","bind","fullConfig","doGet","doPost","doDelete","doPut","doPatch","createPromiseMethod","isSettled","rejectRef","basePromise","cancel","setCancelable","p","Object","defineProperty","configurable","enumerable","nativeThen","then","nativeCatch","catch","nativeFinally","finally","args","attachCancelable","reject","aborted","removed"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kdcloudjs/kwc-shared-utils",
3
- "version": "0.0.3",
4
- "description": "shared-utils for kwc",
3
+ "version": "0.0.5",
4
+ "description": "share-utils for kwc",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs.js",
7
7
  "module": "dist/index.esm.js",
@@ -25,10 +25,10 @@
25
25
  "dependencies": {
26
26
  "@rollup/plugin-commonjs": "^28.0.6",
27
27
  "@rollup/plugin-node-resolve": "^16.0.1",
28
- "rollup": "^4.50.0",
29
- "rollup-plugin-terser": "^7.0.2"
28
+ "rollup": "^4.50.0"
30
29
  },
31
30
  "devDependencies": {
31
+ "@rollup/plugin-terser": "^0.4.4",
32
32
  "rollup-plugin-clear": "^2.0.7"
33
33
  }
34
- }
34
+ }
@@ -1,2 +0,0 @@
1
- const n="yunzhijia",e="yunzhijia_desktop",t="yunzhijia_old_desktop",i="weixin",o="dingding",r="wxwork",s="welink",a="feishu",u="unknown";function g(){const n=navigator.userAgent;return/Qing\/.*;(iOS|iPhone|Android|iPadOS|Harmony)/.test(n)}function c(){const n=navigator.userAgent;return/App\/cloudhub/.test(n)}function d(){const n=navigator.userAgent;return/clientId:10204/.test(n)}function f(){const n=navigator.userAgent;return n.indexOf("MicroMessenger")>-1&&n.indexOf("wxwork")<0}function w(){const n=navigator.userAgent;return n.indexOf("MicroMessenger")>-1&&n.indexOf("wxwork")>-1}function x(){const n=navigator.userAgent,e=n.indexOf("DingTalk")>-1,t=-1===n.indexOf("MiniProgram")&&-1===n.indexOf("dd-web");return e&&t}function p(){const n=navigator.userAgent;return n.indexOf("welink")>-1||n.indexOf("cloudlink")>-1}function h(){return navigator.userAgent.indexOf("Lark/")>-1}function k(){return g()?n:c()?e:d()?t:f()?i:w()?r:x()?o:p?s:h()?a:u}function v(){const n=navigator.userAgent.toLowerCase();return/chrome|crios/.test(n)&&!/edg|edge|opr|opera|fxios|samsungbrowser/.test(n)}function A(){const n=navigator.userAgent.toLowerCase();return/edg/.test(n)}function m(){const n=navigator.userAgent.toLowerCase();return/edge/.test(n)&&!/edg/.test(n)}function l(){return A()||m()}function O(){const n=navigator.userAgent.toLowerCase();return/firefox|fxios/.test(n)}function b(){const n=navigator.userAgent.toLowerCase();return/msie|trident/.test(n)}function C(){const n=navigator.userAgent.toLowerCase();return/safari/.test(n)&&!/chrome|crios|edg|edge|fxios|opr|opera/.test(n)}const L="chrome",j="edge",z="firefox",M="ie",_="safari",y="unknown";function P(){return v()?L:l()?j:O()?z:C()?_:b()?M:y}function D(){const n=navigator.userAgent.toLowerCase(),e="ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0;return/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(n)||e&&window.innerWidth<=1024}function W(){return!D()}var E=Object.freeze({__proto__:null,getAppName:k,getBrowserName:P,isChrome:v,isChromiumEdge:A,isDD:x,isEdge:l,isFeiShu:h,isFirefox:O,isIE:b,isLegacyEdge:m,isMobile:D,isPC:W,isSafari:C,isWX:f,isWeLink:p,isWxWork:w,isYzj:g,isYzjDesktop:c,isYzjOldDesktop:d});export{x as a,h as b,p as c,w as d,f as e,g as f,k as g,c as h,E as i,d as j,P as k,v as l,A as m,l as n,m as o,O as p,b as q,C as r,D as s,W as t};
2
- //# sourceMappingURL=index-BvVdlixE.esm.js.map
@@ -1,2 +0,0 @@
1
- "use strict";const e=new Set,r=new Map,t=new WeakMap,n=document.createElement("a");function o(e){if(!e)return"";try{return new URL(e,window.location.href).href}catch{return n.href=e,n.href||String(e)}}function c(e){try{if(e&&e.template&&"function"==typeof e.template.appendChild)return e.template;if(e&&"function"==typeof e.appendChild)return e}catch{}return document.head}function i(e,r,t){if("function"==typeof e)try{e(r,t)}catch(e){console.error("[loadResource] callback error:",e)}}function s(n,s,l,a={}){if(n||(n=document.head),!s||"string"!=typeof s)throw new TypeError("Invalid script URL");const u="number"==typeof a.timeout?a.timeout:2e4,f=o(s);if(e.has(f))return i(l,null,f),Promise.resolve(f);const d=function(e){for(const r of Array.from(document.scripts)){if(!r.src)continue;try{if(o(r.src)!==e)continue}catch{continue}if(t.get(r))return r;const n=r.readyState;if("complete"===n||"loaded"===n)return t.set(r,!0),r}return null}(f);if(d)return e.add(f),i(l,null,f),Promise.resolve(f);if(r.has(f)){const e=r.get(f);return l&&e.callbacks.push(l),e.promise}let p,h;const m=new Promise((e,r)=>{p=e,h=r}),y={promise:m,callbacks:l?[l]:[],finished:!1};r.set(f,y);const w=document.createElement("script");function g(n){if(!y.finished)if(y.finished=!0,r.delete(f),clearTimeout(E),n){try{w.remove()}catch{}y.callbacks.forEach(e=>i(e,n,f)),h(n)}else t.set(w,!0),e.add(f),y.callbacks.forEach(e=>i(e,null,f)),p(f)}w.src=f,w.async=!0,a.typeModule&&(w.type="module"),a.crossOrigin&&(w.crossOrigin=a.crossOrigin);const E=setTimeout(()=>{g(new Error("Script load timeout: "+f))},u);w.onload=()=>g(null),w.onerror=()=>g(new Error("Script load error: "+f));const S=c(n);try{S.appendChild(w)}catch(e){g(new Error("Append target error: "+e.message))}return m}function l(n,s,l,a={}){if(n||(n=document.head),!s||"string"!=typeof s)throw new TypeError("Invalid CSS URL");const u="number"==typeof a.timeout?a.timeout:2e4,f=o(s);if(e.has(f))return i(l,null,f),Promise.resolve(f);const d=function(e){const r=Array.from(document.querySelectorAll('link[rel="stylesheet"]'));for(const n of r)if(n.href){try{if(o(n.href)!==e)continue}catch{continue}if(t.get(n))return n;try{if(n.sheet)return t.set(n,!0),n}catch{continue}}return null}(f);if(d)return e.add(f),i(l,null,f),Promise.resolve(f);if(r.has(f)){const e=r.get(f);return l&&e.callbacks.push(l),e.promise}let p,h;const m=new Promise((e,r)=>{p=e,h=r}),y={promise:m,callbacks:l?[l]:[],finished:!1};r.set(f,y);const w=document.createElement("link");function g(n){if(!y.finished)if(y.finished=!0,r.delete(f),clearTimeout(E),n){try{w.remove()}catch{}y.callbacks.forEach(e=>i(e,n,f)),h(n)}else t.set(w,!0),e.add(f),y.callbacks.forEach(e=>i(e,null,f)),p(f)}w.rel="stylesheet",w.href=f,a.crossOrigin&&(w.crossOrigin=a.crossOrigin);const E=setTimeout(()=>{g(new Error("Style load timeout: "+f))},u);w.onload=()=>g(null),w.onerror=()=>g(new Error("Style load error: "+f));const S=c(n);try{S.appendChild(w)}catch(e){g(new Error("Append target error: "+e.message))}return m}var a=Object.freeze({__proto__:null,loadScript:s,loadStyle:l});exports.index=a,exports.loadScript=s,exports.loadStyle=l;
2
- //# sourceMappingURL=index-C0BYHh-4.cjs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-C0BYHh-4.cjs.js","sources":["../../src/modules/platformResourceLoader/index.js"],"sourcesContent":["// 已成功加载的 URL\nconst loadedResources = new Set();\n\n// 正在加载中的资源(用于并发去重)\nconst inflight = new Map();\n\n// 节点加载状态(不污染 DOM)\nconst nodeLoaded = new WeakMap();\n\n// 默认超时时间(ms)\nconst DEFAULT_TIMEOUT = 20000;\n\nconst _a = document.createElement('a');\n\n/** 兼容所有浏览器的 URL 规范化 */\nfunction normalizeUrl(url) {\n if (!url) return '';\n try {\n return new URL(url, window.location.href).href;\n } catch {\n // 旧浏览器 fallback\n _a.href = url;\n return _a.href || String(url);\n }\n}\n\n/** 获取可安全 append 的目标节点(优先 template 再 elm 再 head) */\nfunction getAppendTarget(elm) {\n try{\n if (elm && elm.template && typeof elm.template.appendChild === 'function') return elm.template;\n if (elm && typeof elm.appendChild === 'function') return elm;\n } catch {}\n return document.head;\n}\n\n/** 查找并判断页面中是否存在已加载的 script */\nfunction findLoadedScript(normalizedUrl) {\n for (const s of Array.from(document.scripts)) {\n if (!s.src) continue;\n try {\n if (normalizeUrl(s.src) !== normalizedUrl) continue;\n } catch {\n continue;\n }\n\n if (nodeLoaded.get(s)) return s;\n\n // 老浏览器兼容(readyState)\n const rs = s.readyState;\n if (rs === 'complete' || rs === 'loaded') {\n nodeLoaded.set(s, true);\n return s;\n }\n }\n return null;\n}\n\n/** 查找并判断页面中是否存在已加载的 stylesheet */\nfunction findLoadedStyle(normalizedUrl) {\n const links = Array.from(document.querySelectorAll('link[rel=\"stylesheet\"]'));\n for (const l of links) {\n if (!l.href) continue;\n try {\n if (normalizeUrl(l.href) !== normalizedUrl) continue;\n } catch {\n continue;\n }\n\n if (nodeLoaded.get(l)) return l;\n\n // 若可访问 sheet,视为已加载\n try {\n if (l.sheet) {\n nodeLoaded.set(l, true);\n return l;\n }\n } catch {\n // 抛错时不要立即标记已加载,让 loadStyle 的 onload 正常回调处理\n continue;\n }\n }\n return null;\n}\n\n/** 安全调用回调 */\nfunction safeCallback(fn, err, url) {\n if (typeof fn === 'function') {\n try {\n fn(err, url);\n } catch (e) {\n console.error('[loadResource] callback error:', e);\n }\n }\n}\n\n/* ---------------------- loadScript ---------------------- */\nexport function loadScript(elm, url, callback, options = {}) {\n if (!elm) elm = document.head;\n if (!url || typeof url !== 'string') throw new TypeError('Invalid script URL');\n\n const timeoutMs = typeof options.timeout === 'number' ? options.timeout : DEFAULT_TIMEOUT;\n const normalizedUrl = normalizeUrl(url);\n\n // 已加载\n if (loadedResources.has(normalizedUrl)) {\n safeCallback(callback, null, normalizedUrl);\n return Promise.resolve(normalizedUrl);\n }\n\n const existing = findLoadedScript(normalizedUrl);\n if (existing) {\n loadedResources.add(normalizedUrl);\n safeCallback(callback, null, normalizedUrl);\n return Promise.resolve(normalizedUrl);\n }\n\n // 并发复用 inflight\n if (inflight.has(normalizedUrl)) {\n const entry = inflight.get(normalizedUrl);\n if (callback) entry.callbacks.push(callback);\n return entry.promise;\n }\n\n // 新建 entry\n let resolveFn, rejectFn;\n const promise = new Promise((resolve, reject) => {\n resolveFn = resolve;\n rejectFn = reject;\n });\n const entry = { promise, callbacks: callback ? [callback] : [], finished: false };\n inflight.set(normalizedUrl, entry);\n\n // 创建 script 元素\n const script = document.createElement('script');\n script.src = normalizedUrl;\n script.async = true;\n if (options.typeModule) script.type = 'module';\n if (options.crossOrigin) script.crossOrigin = options.crossOrigin;\n\n // 清理逻辑\n function cleanup(err) {\n if (entry.finished) return;\n entry.finished = true;\n inflight.delete(normalizedUrl);\n clearTimeout(timer);\n\n if (err) {\n try { script.remove(); } catch {}\n entry.callbacks.forEach(cb => safeCallback(cb, err, normalizedUrl));\n rejectFn(err);\n } else {\n nodeLoaded.set(script, true);\n loadedResources.add(normalizedUrl);\n entry.callbacks.forEach(cb => safeCallback(cb, null, normalizedUrl));\n resolveFn(normalizedUrl);\n }\n }\n\n const timer = setTimeout(() => {\n cleanup(new Error('Script load timeout: ' + normalizedUrl));\n }, timeoutMs);\n\n script.onload = () => cleanup(null);\n script.onerror = () => cleanup(new Error('Script load error: ' + normalizedUrl));\n\n const target = getAppendTarget(elm);\n try {\n target.appendChild(script);\n } catch (appendErr) {\n cleanup(new Error('Append target error: ' + appendErr.message));\n }\n\n return promise;\n}\n\n/* ---------------------- loadStyle ---------------------- */\nexport function loadStyle(elm, url, callback, options = {}) {\n if (!elm) elm = document.head;\n if (!url || typeof url !== 'string') throw new TypeError('Invalid CSS URL');\n\n const timeoutMs = typeof options.timeout === 'number' ? options.timeout : DEFAULT_TIMEOUT;\n const normalizedUrl = normalizeUrl(url);\n\n if (loadedResources.has(normalizedUrl)) {\n safeCallback(callback, null, normalizedUrl);\n return Promise.resolve(normalizedUrl);\n }\n\n const existing = findLoadedStyle(normalizedUrl);\n if (existing) {\n loadedResources.add(normalizedUrl);\n safeCallback(callback, null, normalizedUrl);\n return Promise.resolve(normalizedUrl);\n }\n\n if (inflight.has(normalizedUrl)) {\n const entry = inflight.get(normalizedUrl);\n if (callback) entry.callbacks.push(callback);\n return entry.promise;\n }\n\n let resolveFn, rejectFn;\n const promise = new Promise((resolve, reject) => {\n resolveFn = resolve;\n rejectFn = reject;\n });\n const entry = { promise, callbacks: callback ? [callback] : [], finished: false };\n inflight.set(normalizedUrl, entry);\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = normalizedUrl;\n if (options.crossOrigin) link.crossOrigin = options.crossOrigin;\n\n function cleanup(err) {\n if (entry.finished) return;\n entry.finished = true;\n inflight.delete(normalizedUrl);\n clearTimeout(timer);\n\n if (err) {\n try { link.remove(); } catch {}\n entry.callbacks.forEach(cb => safeCallback(cb, err, normalizedUrl));\n rejectFn(err);\n } else {\n nodeLoaded.set(link, true);\n loadedResources.add(normalizedUrl);\n entry.callbacks.forEach(cb => safeCallback(cb, null, normalizedUrl));\n resolveFn(normalizedUrl);\n }\n }\n\n const timer = setTimeout(() => {\n cleanup(new Error('Style load timeout: ' + normalizedUrl));\n }, timeoutMs);\n\n link.onload = () => cleanup(null);\n link.onerror = () => cleanup(new Error('Style load error: ' + normalizedUrl));\n\n const target = getAppendTarget(elm);\n try {\n target.appendChild(link);\n } catch (appendErr) {\n cleanup(new Error('Append target error: ' + appendErr.message));\n }\n\n return promise;\n}\n"],"names":["loadedResources","Set","inflight","Map","nodeLoaded","WeakMap","_a","document","createElement","normalizeUrl","url","URL","window","location","href","String","getAppendTarget","elm","template","appendChild","head","safeCallback","fn","err","e","console","error","loadScript","callback","options","TypeError","timeoutMs","timeout","normalizedUrl","has","Promise","resolve","existing","s","Array","from","scripts","src","get","rs","readyState","set","findLoadedScript","add","entry","callbacks","push","promise","resolveFn","rejectFn","reject","finished","script","cleanup","delete","clearTimeout","timer","remove","forEach","cb","async","typeModule","type","crossOrigin","setTimeout","Error","onload","onerror","target","appendErr","message","loadStyle","links","querySelectorAll","l","sheet","findLoadedStyle","link","rel"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- const e=new Set,r=new Map,t=new WeakMap,n=document.createElement("a");function o(e){if(!e)return"";try{return new URL(e,window.location.href).href}catch{return n.href=e,n.href||String(e)}}function c(e){try{if(e&&e.template&&"function"==typeof e.template.appendChild)return e.template;if(e&&"function"==typeof e.appendChild)return e}catch{}return document.head}function i(e,r,t){if("function"==typeof e)try{e(r,t)}catch(e){console.error("[loadResource] callback error:",e)}}function s(n,s,l,a={}){if(n||(n=document.head),!s||"string"!=typeof s)throw new TypeError("Invalid script URL");const u="number"==typeof a.timeout?a.timeout:2e4,f=o(s);if(e.has(f))return i(l,null,f),Promise.resolve(f);const d=function(e){for(const r of Array.from(document.scripts)){if(!r.src)continue;try{if(o(r.src)!==e)continue}catch{continue}if(t.get(r))return r;const n=r.readyState;if("complete"===n||"loaded"===n)return t.set(r,!0),r}return null}(f);if(d)return e.add(f),i(l,null,f),Promise.resolve(f);if(r.has(f)){const e=r.get(f);return l&&e.callbacks.push(l),e.promise}let h,m;const p=new Promise((e,r)=>{h=e,m=r}),y={promise:p,callbacks:l?[l]:[],finished:!1};r.set(f,y);const w=document.createElement("script");function g(n){if(!y.finished)if(y.finished=!0,r.delete(f),clearTimeout(E),n){try{w.remove()}catch{}y.callbacks.forEach(e=>i(e,n,f)),m(n)}else t.set(w,!0),e.add(f),y.callbacks.forEach(e=>i(e,null,f)),h(f)}w.src=f,w.async=!0,a.typeModule&&(w.type="module"),a.crossOrigin&&(w.crossOrigin=a.crossOrigin);const E=setTimeout(()=>{g(new Error("Script load timeout: "+f))},u);w.onload=()=>g(null),w.onerror=()=>g(new Error("Script load error: "+f));const b=c(n);try{b.appendChild(w)}catch(e){g(new Error("Append target error: "+e.message))}return p}function l(n,s,l,a={}){if(n||(n=document.head),!s||"string"!=typeof s)throw new TypeError("Invalid CSS URL");const u="number"==typeof a.timeout?a.timeout:2e4,f=o(s);if(e.has(f))return i(l,null,f),Promise.resolve(f);const d=function(e){const r=Array.from(document.querySelectorAll('link[rel="stylesheet"]'));for(const n of r)if(n.href){try{if(o(n.href)!==e)continue}catch{continue}if(t.get(n))return n;try{if(n.sheet)return t.set(n,!0),n}catch{continue}}return null}(f);if(d)return e.add(f),i(l,null,f),Promise.resolve(f);if(r.has(f)){const e=r.get(f);return l&&e.callbacks.push(l),e.promise}let h,m;const p=new Promise((e,r)=>{h=e,m=r}),y={promise:p,callbacks:l?[l]:[],finished:!1};r.set(f,y);const w=document.createElement("link");function g(n){if(!y.finished)if(y.finished=!0,r.delete(f),clearTimeout(E),n){try{w.remove()}catch{}y.callbacks.forEach(e=>i(e,n,f)),m(n)}else t.set(w,!0),e.add(f),y.callbacks.forEach(e=>i(e,null,f)),h(f)}w.rel="stylesheet",w.href=f,a.crossOrigin&&(w.crossOrigin=a.crossOrigin);const E=setTimeout(()=>{g(new Error("Style load timeout: "+f))},u);w.onload=()=>g(null),w.onerror=()=>g(new Error("Style load error: "+f));const b=c(n);try{b.appendChild(w)}catch(e){g(new Error("Append target error: "+e.message))}return p}var a=Object.freeze({__proto__:null,loadScript:s,loadStyle:l});export{l as a,a as i,s as l};
2
- //# sourceMappingURL=index-DF7VNMGI.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DF7VNMGI.esm.js","sources":["../../src/modules/platformResourceLoader/index.js"],"sourcesContent":["// 已成功加载的 URL\nconst loadedResources = new Set();\n\n// 正在加载中的资源(用于并发去重)\nconst inflight = new Map();\n\n// 节点加载状态(不污染 DOM)\nconst nodeLoaded = new WeakMap();\n\n// 默认超时时间(ms)\nconst DEFAULT_TIMEOUT = 20000;\n\nconst _a = document.createElement('a');\n\n/** 兼容所有浏览器的 URL 规范化 */\nfunction normalizeUrl(url) {\n if (!url) return '';\n try {\n return new URL(url, window.location.href).href;\n } catch {\n // 旧浏览器 fallback\n _a.href = url;\n return _a.href || String(url);\n }\n}\n\n/** 获取可安全 append 的目标节点(优先 template 再 elm 再 head) */\nfunction getAppendTarget(elm) {\n try{\n if (elm && elm.template && typeof elm.template.appendChild === 'function') return elm.template;\n if (elm && typeof elm.appendChild === 'function') return elm;\n } catch {}\n return document.head;\n}\n\n/** 查找并判断页面中是否存在已加载的 script */\nfunction findLoadedScript(normalizedUrl) {\n for (const s of Array.from(document.scripts)) {\n if (!s.src) continue;\n try {\n if (normalizeUrl(s.src) !== normalizedUrl) continue;\n } catch {\n continue;\n }\n\n if (nodeLoaded.get(s)) return s;\n\n // 老浏览器兼容(readyState)\n const rs = s.readyState;\n if (rs === 'complete' || rs === 'loaded') {\n nodeLoaded.set(s, true);\n return s;\n }\n }\n return null;\n}\n\n/** 查找并判断页面中是否存在已加载的 stylesheet */\nfunction findLoadedStyle(normalizedUrl) {\n const links = Array.from(document.querySelectorAll('link[rel=\"stylesheet\"]'));\n for (const l of links) {\n if (!l.href) continue;\n try {\n if (normalizeUrl(l.href) !== normalizedUrl) continue;\n } catch {\n continue;\n }\n\n if (nodeLoaded.get(l)) return l;\n\n // 若可访问 sheet,视为已加载\n try {\n if (l.sheet) {\n nodeLoaded.set(l, true);\n return l;\n }\n } catch {\n // 抛错时不要立即标记已加载,让 loadStyle 的 onload 正常回调处理\n continue;\n }\n }\n return null;\n}\n\n/** 安全调用回调 */\nfunction safeCallback(fn, err, url) {\n if (typeof fn === 'function') {\n try {\n fn(err, url);\n } catch (e) {\n console.error('[loadResource] callback error:', e);\n }\n }\n}\n\n/* ---------------------- loadScript ---------------------- */\nexport function loadScript(elm, url, callback, options = {}) {\n if (!elm) elm = document.head;\n if (!url || typeof url !== 'string') throw new TypeError('Invalid script URL');\n\n const timeoutMs = typeof options.timeout === 'number' ? options.timeout : DEFAULT_TIMEOUT;\n const normalizedUrl = normalizeUrl(url);\n\n // 已加载\n if (loadedResources.has(normalizedUrl)) {\n safeCallback(callback, null, normalizedUrl);\n return Promise.resolve(normalizedUrl);\n }\n\n const existing = findLoadedScript(normalizedUrl);\n if (existing) {\n loadedResources.add(normalizedUrl);\n safeCallback(callback, null, normalizedUrl);\n return Promise.resolve(normalizedUrl);\n }\n\n // 并发复用 inflight\n if (inflight.has(normalizedUrl)) {\n const entry = inflight.get(normalizedUrl);\n if (callback) entry.callbacks.push(callback);\n return entry.promise;\n }\n\n // 新建 entry\n let resolveFn, rejectFn;\n const promise = new Promise((resolve, reject) => {\n resolveFn = resolve;\n rejectFn = reject;\n });\n const entry = { promise, callbacks: callback ? [callback] : [], finished: false };\n inflight.set(normalizedUrl, entry);\n\n // 创建 script 元素\n const script = document.createElement('script');\n script.src = normalizedUrl;\n script.async = true;\n if (options.typeModule) script.type = 'module';\n if (options.crossOrigin) script.crossOrigin = options.crossOrigin;\n\n // 清理逻辑\n function cleanup(err) {\n if (entry.finished) return;\n entry.finished = true;\n inflight.delete(normalizedUrl);\n clearTimeout(timer);\n\n if (err) {\n try { script.remove(); } catch {}\n entry.callbacks.forEach(cb => safeCallback(cb, err, normalizedUrl));\n rejectFn(err);\n } else {\n nodeLoaded.set(script, true);\n loadedResources.add(normalizedUrl);\n entry.callbacks.forEach(cb => safeCallback(cb, null, normalizedUrl));\n resolveFn(normalizedUrl);\n }\n }\n\n const timer = setTimeout(() => {\n cleanup(new Error('Script load timeout: ' + normalizedUrl));\n }, timeoutMs);\n\n script.onload = () => cleanup(null);\n script.onerror = () => cleanup(new Error('Script load error: ' + normalizedUrl));\n\n const target = getAppendTarget(elm);\n try {\n target.appendChild(script);\n } catch (appendErr) {\n cleanup(new Error('Append target error: ' + appendErr.message));\n }\n\n return promise;\n}\n\n/* ---------------------- loadStyle ---------------------- */\nexport function loadStyle(elm, url, callback, options = {}) {\n if (!elm) elm = document.head;\n if (!url || typeof url !== 'string') throw new TypeError('Invalid CSS URL');\n\n const timeoutMs = typeof options.timeout === 'number' ? options.timeout : DEFAULT_TIMEOUT;\n const normalizedUrl = normalizeUrl(url);\n\n if (loadedResources.has(normalizedUrl)) {\n safeCallback(callback, null, normalizedUrl);\n return Promise.resolve(normalizedUrl);\n }\n\n const existing = findLoadedStyle(normalizedUrl);\n if (existing) {\n loadedResources.add(normalizedUrl);\n safeCallback(callback, null, normalizedUrl);\n return Promise.resolve(normalizedUrl);\n }\n\n if (inflight.has(normalizedUrl)) {\n const entry = inflight.get(normalizedUrl);\n if (callback) entry.callbacks.push(callback);\n return entry.promise;\n }\n\n let resolveFn, rejectFn;\n const promise = new Promise((resolve, reject) => {\n resolveFn = resolve;\n rejectFn = reject;\n });\n const entry = { promise, callbacks: callback ? [callback] : [], finished: false };\n inflight.set(normalizedUrl, entry);\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = normalizedUrl;\n if (options.crossOrigin) link.crossOrigin = options.crossOrigin;\n\n function cleanup(err) {\n if (entry.finished) return;\n entry.finished = true;\n inflight.delete(normalizedUrl);\n clearTimeout(timer);\n\n if (err) {\n try { link.remove(); } catch {}\n entry.callbacks.forEach(cb => safeCallback(cb, err, normalizedUrl));\n rejectFn(err);\n } else {\n nodeLoaded.set(link, true);\n loadedResources.add(normalizedUrl);\n entry.callbacks.forEach(cb => safeCallback(cb, null, normalizedUrl));\n resolveFn(normalizedUrl);\n }\n }\n\n const timer = setTimeout(() => {\n cleanup(new Error('Style load timeout: ' + normalizedUrl));\n }, timeoutMs);\n\n link.onload = () => cleanup(null);\n link.onerror = () => cleanup(new Error('Style load error: ' + normalizedUrl));\n\n const target = getAppendTarget(elm);\n try {\n target.appendChild(link);\n } catch (appendErr) {\n cleanup(new Error('Append target error: ' + appendErr.message));\n }\n\n return promise;\n}\n"],"names":["loadedResources","Set","inflight","Map","nodeLoaded","WeakMap","_a","document","createElement","normalizeUrl","url","URL","window","location","href","String","getAppendTarget","elm","template","appendChild","head","safeCallback","fn","err","e","console","error","loadScript","callback","options","TypeError","timeoutMs","timeout","normalizedUrl","has","Promise","resolve","existing","s","Array","from","scripts","src","get","rs","readyState","set","findLoadedScript","add","entry","callbacks","push","promise","resolveFn","rejectFn","reject","finished","script","cleanup","delete","clearTimeout","timer","remove","forEach","cb","async","typeModule","type","crossOrigin","setTimeout","Error","onload","onerror","target","appendErr","message","loadStyle","links","querySelectorAll","l","sheet","findLoadedStyle","link","rel"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";const e="yunzhijia",t="yunzhijia_desktop",n="yunzhijia_old_desktop",o="weixin",r="dingding",i="wxwork",s="welink",a="feishu",u="unknown";function g(){const e=navigator.userAgent;return/Qing\/.*;(iOS|iPhone|Android|iPadOS|Harmony)/.test(e)}function c(){const e=navigator.userAgent;return/App\/cloudhub/.test(e)}function d(){const e=navigator.userAgent;return/clientId:10204/.test(e)}function x(){const e=navigator.userAgent;return e.indexOf("MicroMessenger")>-1&&e.indexOf("wxwork")<0}function f(){const e=navigator.userAgent;return e.indexOf("MicroMessenger")>-1&&e.indexOf("wxwork")>-1}function p(){const e=navigator.userAgent,t=e.indexOf("DingTalk")>-1,n=-1===e.indexOf("MiniProgram")&&-1===e.indexOf("dd-web");return t&&n}function w(){const e=navigator.userAgent;return e.indexOf("welink")>-1||e.indexOf("cloudlink")>-1}function k(){return navigator.userAgent.indexOf("Lark/")>-1}function h(){return g()?e:c()?t:d()?n:x()?o:f()?i:p()?r:w?s:k()?a:u}function m(){const e=navigator.userAgent.toLowerCase();return/chrome|crios/.test(e)&&!/edg|edge|opr|opera|fxios|samsungbrowser/.test(e)}function A(){const e=navigator.userAgent.toLowerCase();return/edg/.test(e)}function v(){const e=navigator.userAgent.toLowerCase();return/edge/.test(e)&&!/edg/.test(e)}function l(){return A()||v()}function O(){const e=navigator.userAgent.toLowerCase();return/firefox|fxios/.test(e)}function C(){const e=navigator.userAgent.toLowerCase();return/msie|trident/.test(e)}function L(){const e=navigator.userAgent.toLowerCase();return/safari/.test(e)&&!/chrome|crios|edg|edge|fxios|opr|opera/.test(e)}const b="chrome",j="edge",z="firefox",D="ie",W="safari",E="unknown";function M(){return m()?b:l()?j:O()?z:L()?W:C()?D:E}function y(){const e=navigator.userAgent.toLowerCase(),t="ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0;return/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(e)||t&&window.innerWidth<=1024}function P(){return!y()}var _=Object.freeze({__proto__:null,getAppName:h,getBrowserName:M,isChrome:m,isChromiumEdge:A,isDD:p,isEdge:l,isFeiShu:k,isFirefox:O,isIE:C,isLegacyEdge:v,isMobile:y,isPC:P,isSafari:L,isWX:x,isWeLink:w,isWxWork:f,isYzj:g,isYzjDesktop:c,isYzjOldDesktop:d});exports.getApp=h,exports.getBrowser=M,exports.index=_,exports.isChrome=m,exports.isChromiumEdge=A,exports.isDD=p,exports.isEdge=l,exports.isFeiShu=k,exports.isFirefox=O,exports.isIE=C,exports.isLegacyEdge=v,exports.isMobile=y,exports.isPC=P,exports.isSafari=L,exports.isWX=x,exports.isWeLink=w,exports.isWxWork=f,exports.isYzj=g,exports.isYzjDesktop=c,exports.isYzjOldDesktop=d;
2
- //# sourceMappingURL=index-DSwttGxP.cjs.js.map