@kdcloudjs/kwc-shared-utils 0.0.1 → 0.0.3
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/dist/api/index.cjs.js +2 -0
- package/dist/api/index.cjs.js.map +1 -0
- package/dist/api/index.esm.js +2 -0
- package/dist/api/index.esm.js.map +1 -0
- package/dist/client/index.cjs.js +2 -1
- package/dist/client/index.cjs.js.map +1 -0
- package/dist/client/index.esm.js +2 -1
- package/dist/client/index.esm.js.map +1 -0
- package/dist/index.cjs.js +2 -1
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.esm.js +2 -1
- package/dist/index.esm.js.map +1 -0
- package/dist/kingdeeDataService/index.cjs.js +2 -0
- package/dist/kingdeeDataService/index.cjs.js.map +1 -0
- package/dist/kingdeeDataService/index.esm.js +2 -0
- package/dist/kingdeeDataService/index.esm.js.map +1 -0
- package/dist/messageService/index.cjs.js +2 -0
- package/dist/messageService/index.cjs.js.map +1 -0
- package/dist/messageService/index.esm.js +2 -0
- package/dist/messageService/index.esm.js.map +1 -0
- package/dist/openApi/index.cjs.js +2 -1
- package/dist/openApi/index.cjs.js.map +1 -0
- package/dist/openApi/index.esm.js +2 -1
- package/dist/openApi/index.esm.js.map +1 -0
- package/dist/platformResourceLoader/index.cjs.js +2 -1
- package/dist/platformResourceLoader/index.cjs.js.map +1 -0
- package/dist/platformResourceLoader/index.esm.js +2 -1
- package/dist/platformResourceLoader/index.esm.js.map +1 -0
- package/dist/sendBosPlatformEvent/index.cjs.js +2 -0
- package/dist/sendBosPlatformEvent/index.cjs.js.map +1 -0
- package/dist/sendBosPlatformEvent/index.esm.js +2 -0
- package/dist/sendBosPlatformEvent/index.esm.js.map +1 -0
- package/dist/shared/index-B0ILkJm3.cjs.js +2 -0
- package/dist/shared/index-B0ILkJm3.cjs.js.map +1 -0
- package/dist/{index-BvVdlixE.js → shared/index-BvVdlixE.esm.js} +1 -0
- package/dist/shared/index-BvVdlixE.esm.js.map +1 -0
- package/dist/shared/index-C0BYHh-4.cjs.js +2 -0
- package/dist/shared/index-C0BYHh-4.cjs.js.map +1 -0
- package/dist/shared/index-CGzlSIt0.cjs.js +2 -0
- package/dist/shared/index-CGzlSIt0.cjs.js.map +1 -0
- package/dist/shared/index-CXYAeW-7.esm.js +2 -0
- package/dist/shared/index-CXYAeW-7.esm.js.map +1 -0
- package/dist/shared/index-ChQWdmu9.esm.js +2 -0
- package/dist/shared/index-ChQWdmu9.esm.js.map +1 -0
- package/dist/shared/index-DF7VNMGI.esm.js +2 -0
- package/dist/shared/index-DF7VNMGI.esm.js.map +1 -0
- package/dist/{index-DSwttGxP.js → shared/index-DSwttGxP.cjs.js} +1 -0
- package/dist/shared/index-DSwttGxP.cjs.js.map +1 -0
- package/dist/shared/index-Dtu_3V-z.cjs.js +2 -0
- package/dist/shared/index-Dtu_3V-z.cjs.js.map +1 -0
- package/dist/shared/index-KT-nyvfl.esm.js +2 -0
- package/dist/shared/index-KT-nyvfl.esm.js.map +1 -0
- package/dist/shared/index-UhtWZvgp.cjs.js +2 -0
- package/dist/shared/index-UhtWZvgp.cjs.js.map +1 -0
- package/dist/shared/index-qaD2HVRQ.esm.js +2 -0
- package/dist/shared/index-qaD2HVRQ.esm.js.map +1 -0
- package/package.json +5 -2
- package/dist/index-BtNjXfsX.js +0 -1
- package/dist/index-CKzrFqj6.js +0 -1
- package/dist/index-DYR8v7vJ.js +0 -1
- package/dist/index-D_DekteB.js +0 -1
|
@@ -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: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()};
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -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: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};
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +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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"}
|
package/dist/client/index.cjs.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";var s=require("../index-DSwttGxP.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-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;
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/client/index.esm.js
CHANGED
|
@@ -1 +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"../index-BvVdlixE.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-BvVdlixE.esm.js";
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/index.cjs.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("./index-
|
|
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;
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/index.esm.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export{i as platformResourceLoader}from"./index-
|
|
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";
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";require("../shared/index-Dtu_3V-z.cjs.js");var e=require("../shared/index-UhtWZvgp.cjs.js");exports.fetchDataWithCache=e.fetchDataWithCache,exports.invalidateCache=e.invalidateCache,exports.subscribe=e.subscribe,exports.updateCache=e.updateCache;
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../shared/index-Dtu_3V-z.cjs.js");exports.__core__=e.__core__,exports.default=e.index$1,exports.publish=e.publish,exports.subscribe=e.subscribe,exports.unsubscribe=e.unsubscribe;
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";var t=require("../index-
|
|
1
|
+
"use strict";var t=require("../shared/index-B0ILkJm3.cjs.js");exports.AuthManager=t.AuthManager,exports.authManager=t.authManager,exports.doFetch=t.doFetch,exports.initializeAuth=t.initializeAuth,exports.isAuthenticated=t.isAuthenticated;
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export{A as AuthManager,a as authManager,d as doFetch,b as initializeAuth,c as isAuthenticated}from"../index-
|
|
1
|
+
export{A as AuthManager,a as authManager,d as doFetch,b as initializeAuth,c as isAuthenticated}from"../shared/index-CXYAeW-7.esm.js";
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("../index-
|
|
1
|
+
"use strict";var e=require("../shared/index-C0BYHh-4.cjs.js");exports.loadScript=e.loadScript,exports.loadStyle=e.loadStyle;
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export{l as loadScript,a as loadStyle}from"../index-
|
|
1
|
+
export{l as loadScript,a as loadStyle}from"../shared/index-DF7VNMGI.esm.js";
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -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}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:i,method:s}=this.authConfig;try{const a=await fetch(t,{method:s,headers:e,body:JSON.stringify(i)});if(!a.ok)throw new Error(`Authentication failed: ${a.status} - ${a.statusText}`);const r=await a.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(){}saveTokensToStorage(){}clearTokensFromStorage(){}addListener(t){this.listeners.add(t)}removeListener(t){this.listeners.delete(t)}notifyListeners(t,e){this.listeners.forEach(i=>{try{i(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 i(t){return await e.initialize(t)}function s(){return e.isAuthenticated()}class a{constructor(t){this.name="OpenApiWireAdapter",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("OpenApi 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 i=null;for(let s=0;s<this.maxRetries;s++)try{const i=await this.performRequest(t);return this.setCacheData(e,i),void this.dataCallback(i)}catch(t){i=t,s<this.maxRetries&&await this.delay(this.retryDelay*Math.pow(2,s))}this.dataCallback({data:null,error:{message:i.message,status:i.status||"NETWORK_ERROR",retries:this.maxRetries}})}async performRequest(t){const{endpoint:e,method:i="GET",params:s={},headers:a={}}=t;this.abortController&&this.abortController.abort(),this.abortController=new AbortController;let r=e;if("GET"===i&&s){r=`${r}?${new URLSearchParams(s).toString()}`}const n={method:i,headers:{"Content-Type":"application/json",access_token:this.authManager.getAccessToken(),...a},body:"GET"===i?null:JSON.stringify(s),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!0===h.status&&"0"===h.errorCode?{data:h.data,error:null}:"401"===h.errorCode?(await this.authManager.refreshAccessToken(),this.performRequest(t)):{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&&(OpenApiWireAdapter.prototype.maxRetries=t.maxRetries),void 0!==t.retryDelay&&(OpenApiWireAdapter.prototype.retryDelay=t.retryDelay),void 0!==t.cacheTimeout&&(OpenApiWireAdapter.prototype.cacheTimeout=t.cacheTimeout)}}function r(t){if(!t||!t.endpointConfig)throw new Error("No config provided");const{endpointConfig:e}=t;if("string"==typeof e)return t;if(e.endpoint)return e.endpoint;if(!e.isv)throw new Error("Invalid config isv provided");if(!e.app)throw new Error("Invalid config app provided");if(!e.form)throw new Error("Invalid config form provided");if(!e.serviceName)throw new Error("Invalid config serviceName provided");return`/kapi/${e.version||"v2"}/${e.isv}/${e.app}/${e.form}/${e.serviceName}`}const n=function(t="GET",i={}){return function(s){if("function"==typeof s){const e=new a(s),n=e.update.bind(e);return e.update=function(e){const s={endpoint:r(e),method:t,...i,...e};return delete s.endpointConfig,e&&"object"==typeof e&&!e.endpoint&&(s.params=e.params||e),n(s)},e}return async function(t,i,s){await e.waitForAuth();const n={endpoint:r(s),method:t,...i,...s};delete n.endpointConfig,s&&"object"==typeof s&&!s.endpoint&&(n.params=s.params||s);return new Promise((t,e)=>{const i=new a(i=>{i.error?e(i.error):t(i)});i.connect(),i.update(n)})}(t,i,s||{})}}("POST");var o=Object.freeze({__proto__:null,AuthManager:t,authManager:e,doFetch:n,initializeAuth:i,isAuthenticated:s});exports.AuthManager=t,exports.authManager=e,exports.doFetch=n,exports.index=o,exports.initializeAuth=i,exports.isAuthenticated=s;
|
|
2
|
+
//# sourceMappingURL=index-B0ILkJm3.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-B0ILkJm3.cjs.js","sources":["../../src/modules/openApi/authManager.js","../../src/modules/openApi/adapter.js","../../src/modules/openApi/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\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 // memory-only: no persistent storage to load from\n return;\n }\n\n saveTokensToStorage() {\n // memory-only: do not persist tokens\n return;\n }\n\n clearTokensFromStorage() {\n // memory-only: nothing to clear from persistent storage\n return;\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 = 'OpenApiWireAdapter';\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('OpenApi 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.status === true && data.errorCode === '0') {\n return { data: data.data, error: null };\n } else if (data.errorCode === '401') {\n await this.authManager.refreshAccessToken();\n return this.performRequest(config);\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 OpenApiWireAdapter.prototype.maxRetries = options.maxRetries;\n }\n\n if (options.retryDelay !== undefined) {\n OpenApiWireAdapter.prototype.retryDelay = options.retryDelay;\n }\n\n if (options.cacheTimeout !== undefined) {\n OpenApiWireAdapter.prototype.cacheTimeout = options.cacheTimeout;\n }\n }\n}\n","import OpenApiWireAdapter from \"./adapter\";\nimport authManager from \"./authManager\";\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),\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 || config;\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),\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 || config;\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) { \n if (!config || !config.endpointConfig) {\n throw new Error('No config provided');\n }\n\n const { endpointConfig } = config;\n if (typeof endpointConfig === 'string') return config;\n if (endpointConfig.endpoint) return endpointConfig.endpoint;\n if (!endpointConfig.isv) {\n throw new Error('Invalid config isv provided');\n }\n\n if (!endpointConfig.app) {\n throw new Error('Invalid config app provided');\n }\n\n if (!endpointConfig.form) {\n throw new Error('Invalid config form provided');\n }\n\n if (!endpointConfig.serviceName) {\n throw new Error('Invalid config serviceName provided');\n }\n\n return `/kapi/${endpointConfig.version || 'v2'}/${endpointConfig.isv}/${endpointConfig.app}/${endpointConfig.form}/${endpointConfig.serviceName}`\n}\n\nexport const doFetch = createWireAdapter('POST')\n"],"names":["AuthManager","constructor","this","accessToken","refreshToken","isInitialized","isAuthenticating","authPromise","authConfig","listeners","Set","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","loadTokensFromStorage","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","OpenApiWireAdapter","prototype","getEndpoint","endpointConfig","isv","app","form","serviceName","version","doFetch","defaultMethod","defaultConfig","configOrDataCallback","adapter","originalUpdate","bind","fullConfig","reject","createPromiseCall","createWireAdapter"],"mappings":"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"}
|
|
@@ -1 +1,2 @@
|
|
|
1
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
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";function r(r,o){if(!window.spyApi||!window.spyApi.doPostActions)throw console.error("Current page is not a bos page"),new Error("Current page is not a bos page");if(!Array.isArray(o)||0===o.length)throw console.error("Payload must be an array"),new Error("Payload must be an array");for(let e of o){const{a:o,p:n}=e;window.spyApi.doPostActions(r,o,n)}}async function o(o,e={}){const n=await function(r,o={}){const{formId:e,parentPageId:n,params:t}=r,{version:s="v1",app:i,isv:a,url:c}=o;if(!s&&!c)throw new Error("version in config is required");if(!i&&!c)throw new Error("app in config is required");if(!e&&!c)throw new Error("formId is required");if(!a&&!c)throw new Error("isv in config is required");let w=c||`${location.pathname}kwc/${s}/${a}/${i}/kwcform/${e}/showconfig`;if(!c&&n&&(w=`${w}?parentPageId=${n}`),t&&Object.keys(t).length>0)try{const r=JSON.stringify(t),o=w.includes("?")?"&":"?";w=`${w}${o}params=${r}`}catch(r){console.error(r)}return new Promise((r,o)=>{fetch(w).then(r=>r.json()).then(o=>{r(o)}).catch(r=>{o(r)})})}(o,e);if(!n)throw new Error("showForm response is not valid");const{parentPageId:t,pageId:s}=o;r(s||t,n)}var e=Object.freeze({__proto__:null,default:r,showForm:o});exports.index=e,exports.sendBosPlatformEvent=r,exports.showFormRequest=o;
|
|
2
|
+
//# sourceMappingURL=index-CGzlSIt0.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CGzlSIt0.cjs.js","sources":["../../src/modules/sendBosPlatformEvent/index.js","../../src/modules/sendBosPlatformEvent/showForm.js"],"sourcesContent":["import showForm from \"./showForm\";\n\n/**\n * 转发 bos 平台相关指令\n */\nexport default function sendBosPlatformEvent(pageId, payload) {\n if (!window.spyApi || !window.spyApi.doPostActions) {\n console.error('Current page is not a bos page');\n throw new Error('Current page is not a bos page');\n }\n\n if (!Array.isArray(payload) || payload.length === 0) {\n console.error('Payload must be an array');\n throw new Error('Payload must be an array');\n }\n\n for (let _payload of payload) {\n const { a: action, p: param } = _payload\n window.spyApi.doPostActions(pageId, action, param);\n }\n}\n\nasync function showFormRequest(formConfig, config = {}) {\n const response = await showForm(formConfig, config);\n if (!response) {\n throw new Error('showForm response is not valid');\n }\n\n const { parentPageId, pageId } = formConfig;\n const payload = response;\n const pId = pageId || parentPageId;\n sendBosPlatformEvent(pId, payload);\n}\n\nexport {\n showFormRequest as showForm\n}","function showForm(formConfig, config = {}) {\n const { formId, parentPageId, params } = formConfig;\n const { version = 'v1', app, isv, url: customUrl } = config;\n if (!version && !customUrl) {\n throw new Error('version in config is required');\n }\n\n if (!app && !customUrl) {\n throw new Error('app in config is required');\n }\n\n if (!formId && !customUrl) {\n throw new Error('formId is required');\n }\n\n if (!isv && !customUrl) {\n throw new Error('isv in config is required');\n }\n\n let url = customUrl || `${location.pathname}kwc/${version}/${isv}/${app}/kwcform/${formId}/showconfig`;\n\n if (!customUrl && parentPageId) {\n url = `${url}?parentPageId=${parentPageId}`;\n }\n\n if (params && Object.keys(params).length > 0) {\n try {\n const _params = JSON.stringify(params);\n const sign = url.includes('?') ? '&' : '?'\n url = `${url}${sign}params=${_params}`\n } catch (error) {\n console.error(error);\n }\n }\n\n return new Promise((resolve, reject) => {\n fetch(url).then(response => {\n return response.json();\n }).then(data => {\n resolve(data)\n }).catch(error => {\n reject(error)\n })\n })\n}\n\nexport default showForm;"],"names":["sendBosPlatformEvent","pageId","payload","window","spyApi","doPostActions","console","error","Error","Array","isArray","length","_payload","a","action","p","param","async","showFormRequest","formConfig","config","response","formId","parentPageId","params","version","app","isv","url","customUrl","location","pathname","Object","keys","_params","JSON","stringify","sign","includes","Promise","resolve","reject","fetch","then","json","data","catch","showForm"],"mappings":"aAKe,SAASA,EAAqBC,EAAQC,GACnD,IAAKC,OAAOC,SAAWD,OAAOC,OAAOC,cAEnC,MADAC,QAAQC,MAAM,kCACR,IAAIC,MAAM,kCAGlB,IAAKC,MAAMC,QAAQR,IAA+B,IAAnBA,EAAQS,OAErC,MADAL,QAAQC,MAAM,4BACR,IAAIC,MAAM,4BAGlB,IAAK,IAAII,KAAYV,EAAS,CAC5B,MAAQW,EAAGC,EAAQC,EAAGC,GAAUJ,EAChCT,OAAOC,OAAOC,cAAcJ,EAAQa,EAAQE,EAC9C,CACF,CAEAC,eAAeC,EAAgBC,EAAYC,EAAS,IAClD,MAAMC,QCvBR,SAAkBF,EAAYC,EAAS,IACrC,MAAME,OAAEA,EAAMC,aAAEA,EAAYC,OAAEA,GAAWL,GACnCM,QAAEA,EAAU,KAAIC,IAAEA,EAAGC,IAAEA,EAAKC,IAAKC,GAAcT,EACrD,IAAKK,IAAYI,EACf,MAAM,IAAIrB,MAAM,iCAGlB,IAAKkB,IAAQG,EACX,MAAM,IAAIrB,MAAM,6BAGlB,IAAKc,IAAWO,EACd,MAAM,IAAIrB,MAAM,sBAGlB,IAAKmB,IAAQE,EACX,MAAM,IAAIrB,MAAM,6BAGlB,IAAIoB,EAAMC,GAAa,GAAGC,SAASC,eAAeN,KAAWE,KAAOD,aAAeJ,eAMnF,IAJKO,GAAaN,IAChBK,EAAM,GAAGA,kBAAoBL,KAG3BC,GAAUQ,OAAOC,KAAKT,GAAQb,OAAS,EACzC,IACE,MAAMuB,EAAUC,KAAKC,UAAUZ,GACzBa,EAAOT,EAAIU,SAAS,KAAO,IAAM,IACvCV,EAAM,GAAGA,IAAMS,WAAcH,GAC/B,CAAE,MAAO3B,GACPD,QAAQC,MAAMA,EAChB,CAGF,OAAO,IAAIgC,QAAQ,CAACC,EAASC,KAC3BC,MAAMd,GAAKe,KAAKtB,GACPA,EAASuB,QACfD,KAAKE,IACNL,EAAQK,KACPC,MAAMvC,IACPkC,EAAOlC,MAGb,CDrByBwC,CAAS5B,EAAYC,GAC5C,IAAKC,EACH,MAAM,IAAIb,MAAM,kCAGlB,MAAMe,aAAEA,EAAYtB,OAAEA,GAAWkB,EAGjCnB,EADYC,GAAUsB,EADNF,EAGlB"}
|
|
@@ -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}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:i,method:s}=this.authConfig;try{const a=await fetch(t,{method:s,headers:e,body:JSON.stringify(i)});if(!a.ok)throw new Error(`Authentication failed: ${a.status} - ${a.statusText}`);const r=await a.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(){}saveTokensToStorage(){}clearTokensFromStorage(){}addListener(t){this.listeners.add(t)}removeListener(t){this.listeners.delete(t)}notifyListeners(t,e){this.listeners.forEach(i=>{try{i(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 i(t){return await e.initialize(t)}function s(){return e.isAuthenticated()}class a{constructor(t){this.name="OpenApiWireAdapter",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("OpenApi 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 i=null;for(let s=0;s<this.maxRetries;s++)try{const i=await this.performRequest(t);return this.setCacheData(e,i),void this.dataCallback(i)}catch(t){i=t,s<this.maxRetries&&await this.delay(this.retryDelay*Math.pow(2,s))}this.dataCallback({data:null,error:{message:i.message,status:i.status||"NETWORK_ERROR",retries:this.maxRetries}})}async performRequest(t){const{endpoint:e,method:i="GET",params:s={},headers:a={}}=t;this.abortController&&this.abortController.abort(),this.abortController=new AbortController;let r=e;if("GET"===i&&s){r=`${r}?${new URLSearchParams(s).toString()}`}const n={method:i,headers:{"Content-Type":"application/json",access_token:this.authManager.getAccessToken(),...a},body:"GET"===i?null:JSON.stringify(s),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!0===h.status&&"0"===h.errorCode?{data:h.data,error:null}:"401"===h.errorCode?(await this.authManager.refreshAccessToken(),this.performRequest(t)):{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&&(OpenApiWireAdapter.prototype.maxRetries=t.maxRetries),void 0!==t.retryDelay&&(OpenApiWireAdapter.prototype.retryDelay=t.retryDelay),void 0!==t.cacheTimeout&&(OpenApiWireAdapter.prototype.cacheTimeout=t.cacheTimeout)}}function r(t){if(!t||!t.endpointConfig)throw new Error("No config provided");const{endpointConfig:e}=t;if("string"==typeof e)return t;if(e.endpoint)return e.endpoint;if(!e.isv)throw new Error("Invalid config isv provided");if(!e.app)throw new Error("Invalid config app provided");if(!e.form)throw new Error("Invalid config form provided");if(!e.serviceName)throw new Error("Invalid config serviceName provided");return`/kapi/${e.version||"v2"}/${e.isv}/${e.app}/${e.form}/${e.serviceName}`}const n=function(t="GET",i={}){return function(s){if("function"==typeof s){const e=new a(s),n=e.update.bind(e);return e.update=function(e){const s={endpoint:r(e),method:t,...i,...e};return delete s.endpointConfig,e&&"object"==typeof e&&!e.endpoint&&(s.params=e.params||e),n(s)},e}return async function(t,i,s){await e.waitForAuth();const n={endpoint:r(s),method:t,...i,...s};delete n.endpointConfig,s&&"object"==typeof s&&!s.endpoint&&(n.params=s.params||s);return new Promise((t,e)=>{const i=new a(i=>{i.error?e(i.error):t(i)});i.connect(),i.update(n)})}(t,i,s||{})}}("POST");var o=Object.freeze({__proto__:null,AuthManager:t,authManager:e,doFetch:n,initializeAuth:i,isAuthenticated:s});export{t as A,e as a,i as b,s as c,n as d,o as i};
|
|
2
|
+
//# sourceMappingURL=index-CXYAeW-7.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CXYAeW-7.esm.js","sources":["../../src/modules/openApi/authManager.js","../../src/modules/openApi/adapter.js","../../src/modules/openApi/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\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 // memory-only: no persistent storage to load from\n return;\n }\n\n saveTokensToStorage() {\n // memory-only: do not persist tokens\n return;\n }\n\n clearTokensFromStorage() {\n // memory-only: nothing to clear from persistent storage\n return;\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 = 'OpenApiWireAdapter';\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('OpenApi 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.status === true && data.errorCode === '0') {\n return { data: data.data, error: null };\n } else if (data.errorCode === '401') {\n await this.authManager.refreshAccessToken();\n return this.performRequest(config);\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 OpenApiWireAdapter.prototype.maxRetries = options.maxRetries;\n }\n\n if (options.retryDelay !== undefined) {\n OpenApiWireAdapter.prototype.retryDelay = options.retryDelay;\n }\n\n if (options.cacheTimeout !== undefined) {\n OpenApiWireAdapter.prototype.cacheTimeout = options.cacheTimeout;\n }\n }\n}\n","import OpenApiWireAdapter from \"./adapter\";\nimport authManager from \"./authManager\";\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),\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 || config;\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),\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 || config;\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) { \n if (!config || !config.endpointConfig) {\n throw new Error('No config provided');\n }\n\n const { endpointConfig } = config;\n if (typeof endpointConfig === 'string') return config;\n if (endpointConfig.endpoint) return endpointConfig.endpoint;\n if (!endpointConfig.isv) {\n throw new Error('Invalid config isv provided');\n }\n\n if (!endpointConfig.app) {\n throw new Error('Invalid config app provided');\n }\n\n if (!endpointConfig.form) {\n throw new Error('Invalid config form provided');\n }\n\n if (!endpointConfig.serviceName) {\n throw new Error('Invalid config serviceName provided');\n }\n\n return `/kapi/${endpointConfig.version || 'v2'}/${endpointConfig.isv}/${endpointConfig.app}/${endpointConfig.form}/${endpointConfig.serviceName}`\n}\n\nexport const doFetch = createWireAdapter('POST')\n"],"names":["AuthManager","constructor","this","accessToken","refreshToken","isInitialized","isAuthenticating","authPromise","authConfig","listeners","Set","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","loadTokensFromStorage","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","OpenApiWireAdapter","prototype","getEndpoint","endpointConfig","isv","app","form","serviceName","version","doFetch","defaultMethod","defaultConfig","configOrDataCallback","adapter","originalUpdate","bind","fullConfig","reject","createPromiseCall","createWireAdapter"],"mappings":"AAIA,MAAMA,EACJ,WAAAC,GACEC,KAAKC,YAAc,KACnBD,KAAKE,aAAe,KACpBF,KAAKG,eAAgB,EACrBH,KAAKI,kBAAmB,EACxBJ,KAAKK,YAAc,KACnBL,KAAKM,WAAa,KAClBN,KAAKO,UAAY,IAAIC,GACvB,CAEA,gBAAMC,CAAWC,GACf,GAAIV,KAAKG,eAAiBH,KAAKC,YAC7B,OAAO,EAGTD,KAAKM,WAAa,CAChBK,SAAUD,EAAOC,UAAY,wBAC7BC,OAAQF,EAAOE,QAAU,OACzBC,QAASH,EAAOG,SAAW,CACzB,eAAgB,oBAElBC,KAAMJ,EAAOK,YAAa,CAAA,EAC1BC,OAAQN,EAAOO,aAAe,CAAA,GAGhC,UACQjB,KAAKkB,eACXlB,KAAKG,eAAgB,EACrBH,KAAKmB,gBAAgB,cAAe,CAAEC,SAAS,GACjD,CAAE,MAAOC,GAGP,MAFAC,QAAQD,MAAM,4CAA6CA,GAC3DrB,KAAKmB,gBAAgB,cAAe,CAAEC,SAAS,EAAOC,UAChDA,CACR,CACF,CAEA,kBAAMH,GACJ,GAAIlB,KAAKI,kBAAoBJ,KAAKK,YAChC,OAAOL,KAAKK,YAGdL,KAAKI,kBAAmB,EACxBJ,KAAKK,YAAcL,KAAKuB,yBAExB,IACE,MAAMC,QAAexB,KAAKK,YAE1B,OADAL,KAAKmB,gBAAgB,gBAAiB,CAAEC,SAAS,IAC1CI,CACT,CAAE,MAAOH,GAEP,MADArB,KAAKmB,gBAAgB,gBAAiB,CAAEC,SAAS,EAAOC,UAClDA,CACR,CAAC,QACCrB,KAAKI,kBAAmB,EACxBJ,KAAKK,YAAc,IACrB,CACF,CAEA,4BAAMkB,GACJ,IAAKvB,KAAKM,WACR,MAAM,IAAImB,MAAM,4CAGlB,MAAMd,SAAEA,EAAQE,QAAEA,EAAOC,KAAEA,EAAIF,OAAEA,GAAWZ,KAAKM,WACjD,IACE,MAAMoB,QAAiBC,MAAMhB,EAAU,CACrCC,SACAC,UACAC,KAAMc,KAAKC,UAAUf,KAGvB,IAAKY,EAASI,GACZ,MAAM,IAAIL,MAAM,0BAA0BC,EAASK,YAAYL,EAASM,cAG1E,MAAMC,QAAiBP,EAASQ,OAChC,IAAwB,IAApBD,EAASF,QAA0C,MAAvBE,EAASE,UAMvC,OALAnC,KAAKC,YAAcgC,EAASG,KAAKC,aACjCrC,KAAKE,aAAe+B,EAASG,KAAKE,cAElCtC,KAAKuC,sBAEEN,EAET,MAAM,IAAIR,MAAM,0BAA0BQ,EAASE,eAAeF,EAASO,UAC7E,CAAE,MAAOnB,GAEP,MADAC,QAAQD,MAAM,uCAAwCA,GAChDA,CACR,CACF,CAEA,wBAAMoB,GAIJ,OAHAnB,QAAQoB,IAAI,2CACZ1C,KAAKM,WAAWQ,KAAK6B,MAAQ3C,KAAK4C,gBAClC5C,KAAKM,WAAWQ,KAAK+B,UAAY7C,KAAK8C,kBAC/B9C,KAAKuB,wBACd,CAGA,aAAAqB,GACE,MAAO,uCAAuCG,QAAQ,QAAS,SAAUC,GACvE,MAAMC,EAAoB,GAAhBC,KAAKC,SAAgB,EAE/B,OADe,KAALH,EAAWC,EAAS,EAAJA,EAAU,GAC3BG,SAAS,GACpB,EACF,CAGA,eAAAN,CAAgBO,EAAO,IAAIC,MAQzB,MAAO,GAPMD,EAAKE,iBACJC,OAAOH,EAAKI,WAAa,GAAGC,SAAS,EAAG,QAC1CF,OAAOH,EAAKM,WAAWD,SAAS,EAAG,QACjCF,OAAOH,EAAKO,YAAYF,SAAS,EAAG,QAClCF,OAAOH,EAAKQ,cAAcH,SAAS,EAAG,QACtCF,OAAOH,EAAKS,cAAcJ,SAAS,EAAG,MAGxD,CAEA,cAAAK,GACE,OAAO/D,KAAKC,WACd,CAEA,eAAA+D,GACE,QAAShE,KAAKC,WAChB,CAEA,OAAAgE,GACE,OAAOjE,KAAKG,eAAiBH,KAAKgE,iBACpC,CAEA,MAAAE,GACElE,KAAKmE,cACLnE,KAAKG,eAAgB,EACrBH,KAAKM,WAAa,KAClBN,KAAKmB,gBAAgB,SAAU,GACjC,CAEA,WAAAgD,GACEnE,KAAKC,YAAc,KACnBD,KAAKE,aAAe,KACpBF,KAAKoE,wBACP,CAEA,qBAAAC,GAGA,CAEA,mBAAA9B,GAGA,CAEA,sBAAA6B,GAGA,CAEA,WAAAE,CAAYC,GACVvE,KAAKO,UAAUiE,IAAID,EACrB,CAEA,cAAAE,CAAeF,GACbvE,KAAKO,UAAUmE,OAAOH,EACxB,CAEA,eAAApD,CAAgBwD,EAAOvC,GACrBpC,KAAKO,UAAUqE,QAASC,IACtB,IACEA,EAASF,EAAOvC,EAClB,CAAE,MAAMf,GACNC,QAAQD,MAAM,wCAChB,GAEJ,CAEA,iBAAMyD,GACJ,OAAK9E,KAAKgE,oBAINhE,KAAKI,kBAAoBJ,KAAKK,mBAC1BL,KAAKK,YACJL,KAAKgE,wBAFd,EAIF,EAGG,MAACe,EAAc,IAAIjF,EAKjBkF,eAAeC,EAAevE,GACnC,aAAaqE,EAAYtE,WAAWC,EACtC,CAEO,SAASsD,IACd,OAAOe,EAAYf,iBACrB,CC1Me,MAAMkB,EACnB,WAAAnF,CAAYoF,GACVnF,KAAKoF,KAAO,qBAEZpF,KAAKmF,aAAeA,EACpBnF,KAAKU,OAAS,CAAA,EACdV,KAAKqF,gBAAkB,KAEvBrF,KAAKsF,WAAa,EAClBtF,KAAKuF,WAAa,EAClBvF,KAAKwF,WAAa,IAClBxF,KAAKyF,MAAQ,IAAIC,IACjB1F,KAAK2F,aAAe,IAEpB3F,KAAK+E,YAAcA,EAGnB/E,KAAK4F,gBAAkB,IAAIF,IAC3B1F,KAAK6F,aAAe,GACpB7F,KAAK8F,mBAAoB,CAC3B,CAGA,OAAAC,GAAW,CAGX,MAAAC,CAAOtF,GACLV,KAAKU,OAAS,IAAKA,GACnBV,KAAKsF,WAAa,EAEdtF,KAAKiG,gBAAgBvF,GACvBV,KAAKkG,mBAAmBxF,GAExBV,KAAKmF,aAAa,CAAE/C,KAAM,KAAMf,MAAO,MAE3C,CAGA,UAAA8E,GACMnG,KAAKqF,iBACPrF,KAAKqF,gBAAgBe,QAGvBpG,KAAKyF,MAAMY,QACXrG,KAAK4F,gBAAgBS,QACrBrG,KAAK6F,aAAe,GACpB7F,KAAK8F,mBAAoB,CAC3B,CAEA,iBAAMhB,GACJ,IAIE,OAHK9E,KAAK+E,YAAYd,iBACdjE,KAAK+E,YAAYD,eAElB,CACT,CAAE,MAAMzD,GACN,MAAMA,CACR,CACF,CAEA,cAAA0C,GACE,OAAO/D,KAAK+E,YAAYhB,gBAC1B,CAEA,eAAAC,GACE,OAAOhE,KAAK+E,YAAYf,iBAC1B,CAEA,eAAAiC,CAAiBvF,GACf,OAAOA,GAAUA,EAAOC,eAAgC2F,IAApB5F,EAAOC,QAC7C,CAEA,wBAAMuF,CAAmBxF,GACvB,MAAM6F,EAAavG,KAAKwG,mBAAmB9F,GAE3C,GAAIV,KAAK4F,gBAAgBa,IAAIF,GAC3BjF,QAAQoB,IAAI,0BADd,CAKA1C,KAAK6F,aAAaa,KAAK,CAAEhG,SAAQ6F,aAAYhC,SAAUvE,KAAKuE,WAC5DvE,KAAK4F,gBAAgBe,IAAIJ,GAAY,GAErC,UACQvG,KAAK+E,YAAYD,aACzB,CAAE,MAAOzD,GAWP,OAVAC,QAAQD,MAAM,uEACdrB,KAAKmF,aAAa,CAChB/C,KAAM,KACNf,MAAO,CACLmB,QAAS,gBAAgBnB,EAAMmB,UAC/BT,OAAQ,cACR6E,cAAevF,UAGnBrB,KAAK4F,gBAAgBlB,OAAO6B,EAE9B,CAEKvG,KAAK8F,mBACR9F,KAAK6G,qBAtBP,CAwBF,CAEA,yBAAMA,GAEJ,IADA7G,KAAK8F,mBAAoB,EAClB9F,KAAK6F,aAAaiB,OAAS,GAAG,CACnC,MAAMC,EAAU/G,KAAK6F,aAAamB,QAClC,UACQhH,KAAKiH,mBAAmBF,EAAQrG,OACxC,CAAE,MAAOW,GACPC,QAAQD,MAAM,uBAAwBA,EACxC,CAAC,QACCrB,KAAK4F,gBAAgBlB,OAAOqC,EAAQR,WACtC,OAGMvG,KAAKkH,MAAM,GACnB,CACAlH,KAAK8F,mBAAoB,CAC3B,CAEA,wBAAMmB,CAAmBvG,GACvB,MAAMyG,EAAWnH,KAAKoH,iBAAiB1G,GAGvC,GADmBV,KAAKqH,cAAcF,GAGpC,YADAnH,KAAKmF,aAAamC,WAIpB,IAAIC,EAAY,KAChB,IAAK,IAAIC,EAAU,EAAGA,EAAUxH,KAAKuF,WAAYiC,IAC/C,IACE,MAAMhG,QAAexB,KAAKyH,eAAe/G,GAIzC,OAFAV,KAAK0H,aAAaP,EAAU3F,QAC5BxB,KAAKmF,aAAa3D,EAEpB,CAAE,MAAOH,GACPkG,EAAYlG,EAERmG,EAAUxH,KAAKuF,kBACXvF,KAAKkH,MAAMlH,KAAKwF,WAAatC,KAAKyE,IAAI,EAAGH,GAEnD,CAGFxH,KAAKmF,aAAa,CAChB/C,KAAM,KACNf,MAAO,CACLmB,QAAS+E,EAAU/E,QACnBT,OAAQwF,EAAUxF,QAAU,gBAC5B6F,QAAS5H,KAAKuF,aAGpB,CAEA,oBAAMkC,CAAe/G,GACnB,MAAMC,SAAEA,EAAQC,OAAEA,EAAS,MAAKI,OAAEA,EAAS,GAAEH,QAAEA,EAAU,CAAA,GAAOH,EAE5DV,KAAKqF,iBACPrF,KAAKqF,gBAAgBe,QAGvBpG,KAAKqF,gBAAkB,IAAIwC,gBAE3B,IAAIC,EAAMnH,EACV,GAAe,QAAXC,GAAoBI,EAAQ,CAE9B8G,EAAM,GAAGA,KADY,IAAIC,gBAAgB/G,GACZoC,YAC/B,CAEA,MAAM4E,EAAiB,CACrBpH,SACAC,QAAS,CACP,eAAgB,mBAChBwB,aAAgBrC,KAAK+E,YAAYhB,oBAC9BlD,GAELC,KAAiB,QAAXF,EAAmB,KAAOgB,KAAKC,UAAUb,GAC/CiH,OAAQjI,KAAKqF,gBAAgB4C,QAGzBvG,QAAiBC,MAAMmG,EAAKE,GAClC,IAAKtG,EAASI,GACZ,MAAM,IAAIL,MAAM,uBAAuBC,EAASK,YAAYL,EAASM,cAGvE,MAAMI,QAAaV,EAASQ,OAC5B,OAAoB,IAAhBE,EAAKL,QAAsC,MAAnBK,EAAKD,UACxB,CAAEC,KAAMA,EAAKA,KAAMf,MAAO,MACL,QAAnBe,EAAKD,iBACRnC,KAAK+E,YAAYtC,qBAChBzC,KAAKyH,eAAe/G,IAGtB,CACL0B,KAAM,KACNf,MAAO,CACLmB,QAASJ,EAAKI,QACdL,UAAWC,EAAKD,UAChBJ,OAAQK,EAAKL,QAGnB,CAEA,aAAAsF,CAAcF,GACZ,MAAMe,EAASlI,KAAKyF,MAAM0C,IAAIhB,GAC9B,OAAIe,GAAU5E,KAAK8E,MAAQF,EAAOrF,UAAY7C,KAAK2F,aAC1CuC,EAAO9F,MAGZ8F,GACFlI,KAAKyF,MAAMf,OAAOyC,GAEb,KACT,CAEA,YAAAO,CAAaP,EAAU/E,GAMrB,GALApC,KAAKyF,MAAMkB,IAAIQ,EAAU,CACvB/E,OACAS,UAAWS,KAAK8E,QAGdpI,KAAKyF,MAAM4C,KAAO,IAAK,CACzB,MAAMC,EAAWtI,KAAKyF,MAAM8C,OAAOC,OAAOC,MAC1CzI,KAAKyF,MAAMf,OAAO4D,EACpB,CACF,CAEA,gBAAAlB,CAAiB1G,GACf,OAAOkB,KAAKC,UAAU,CACpBlB,SAAUD,EAAOC,SACjBK,OAAQN,EAAOM,OACfJ,OAAQF,EAAOE,QAAU,OAE7B,CAEA,kBAAA4F,CAAmB9F,GACjB,OAAOV,KAAKoH,iBAAiB1G,EAC/B,CAEA,KAAAwG,CAAMwB,GACJ,OAAO,IAAIC,QAAQC,GAAWC,WAAWD,EAASF,GACpD,CAEA,oBAAOI,GACL9I,KAAKyF,MAAQ,IAAIC,GACnB,CAEA,gBAAOqD,CAAUC,QACY1C,IAAvB0C,EAAQzD,aACV0D,mBAAmBC,UAAU3D,WAAayD,EAAQzD,iBAGzBe,IAAvB0C,EAAQxD,aACVyD,mBAAmBC,UAAU1D,WAAawD,EAAQxD,iBAGvBc,IAAzB0C,EAAQrD,eACVsD,mBAAmBC,UAAUvD,aAAeqD,EAAQrD,aAExD,ECrMF,SAASwD,EAAYzI,GACnB,IAAKA,IAAWA,EAAO0I,eACrB,MAAM,IAAI3H,MAAM,sBAGlB,MAAM2H,eAAEA,GAAmB1I,EAC3B,GAA8B,iBAAnB0I,EAA6B,OAAO1I,EAC/C,GAAI0I,EAAezI,SAAU,OAAOyI,EAAezI,SACnD,IAAKyI,EAAeC,IAClB,MAAM,IAAI5H,MAAM,+BAGlB,IAAK2H,EAAeE,IAClB,MAAM,IAAI7H,MAAM,+BAGlB,IAAK2H,EAAeG,KAClB,MAAM,IAAI9H,MAAM,gCAGlB,IAAK2H,EAAeI,YAClB,MAAM,IAAI/H,MAAM,uCAGlB,MAAO,SAAS2H,EAAeK,SAAW,QAAQL,EAAeC,OAAOD,EAAeE,OAAOF,EAAeG,QAAQH,EAAeI,aACtI,CAEY,MAACE,EA5Fb,SAA2BC,EAAgB,MAAOC,EAAgB,CAAA,GA4BhE,OA3BA,SAA6BC,GAC3B,GAAoC,mBAAzBA,EAAqC,CAC9C,MAAMC,EAAU,IAAIb,EAAmBY,GAEjCE,EAAiBD,EAAQ9D,OAAOgE,KAAKF,GAgB3C,OAfAA,EAAQ9D,OAAS,SAAUtF,GACzB,MAAMuJ,EAAa,CACjBtJ,SAAUwI,EAAYzI,GACtBE,OAAQ+I,KACLC,KACAlJ,GAQL,cANOuJ,EAAWb,eAEd1I,GAA4B,iBAAXA,IAAwBA,EAAOC,WAClDsJ,EAAWjJ,OAASN,EAAOM,QAAUN,GAGhCqJ,EAAeE,EACxB,EACOH,CACT,CAEE,OAQN9E,eAAiC2E,EAAeC,EAAelJ,SAEvDqE,EAAYD,cAGlB,MAAMmF,EAAa,CACjBtJ,SAAUwI,EAAYzI,GACtBE,OAAQ+I,KACLC,KACAlJ,UAEEuJ,EAAWb,eAGd1I,GAA4B,iBAAXA,IAAwBA,EAAOC,WAClDsJ,EAAWjJ,OAASN,EAAOM,QAAUN,GAGvC,OAAO,IAAIiI,QAAQ,CAACC,EAASsB,KAC3B,MAAMJ,EAAU,IAAIb,EAAoBzH,IAClCA,EAAOH,MACT6I,EAAO1I,EAAOH,OAEduH,EAAQpH,KAKZsI,EAAQ/D,UACR+D,EAAQ9D,OAAOiE,IAEnB,CAvCaE,CAAkBR,EAAeC,EADzBC,GAAwB,CAAA,EAI3C,CAEF,CA+DuBO,CAAkB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function s(){return`${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}const e=new class{constructor(){this.localSubs=new WeakMap,this.components=new Set,this.instanceId=s(),this.bc=null,this._listenBroadcast()}_listenBroadcast(){try{this.bc=new BroadcastChannel("__kdcloud_kwc_pubsub_channel__"),this.bc.onmessage=s=>this._onMessage(s.data)}catch{const s=s=>{const e=s.data;e?.__KDCLOUD_KWC_PUBSUB__&&this._onMessage(e)};window.addEventListener("message",s),this._messageHandler=s}}_onMessage(s={}){const{event:e,payload:t,senderId:n}=s;e&&n!==this.instanceId&&this._emitLocal(e,t,!0)}_postBroadcast(s,e){const t={event:s,payload:e,senderId:this.instanceId,__KDCLOUD_KWC_PUBSUB__:!0};try{this.bc?this.bc.postMessage(t):window.postMessage(t,"*")}catch(s){console.error("[my-pubsub] Broadcast failed:",s)}}_ensureFor(s){return this.localSubs.has(s)||(this.localSubs.set(s,new Map),this.components.add(s)),this.localSubs.get(s)}subscribe(e,t,n){if("object"!=typeof e||!e)throw new TypeError("[my-pubsub] subscribe: 第一个参数必须是有效的组件实例");if("string"!=typeof t)throw new TypeError("[my-pubsub] subscribe: event 必须是字符串");if("function"!=typeof n)throw new TypeError("[my-pubsub] subscribe: callback 必须是函数");const o=this._ensureFor(e);o.has(t)||o.set(t,new Map);const i=o.get(t),r=s();return i.set(r,n),()=>{this._unsubscribeById(e,t,r)}}_unsubscribeById(s,e,t){const n=this.localSubs.get(s);if(!n)return;const o=n.get(e);o&&(o.delete(t),0===o.size&&n.delete(e),0===n.size&&this._cleanup(s))}unsubscribe(s,e,t){if(!s||"object"!=typeof s)return;const n=this.localSubs.get(s);if(!n)return;if(!e)return void this._cleanup(s);const o=n.get(e);if(o){if(void 0===t)return n.delete(e),void(0===n.size&&this._cleanup(s));if("string"==typeof t)this._unsubscribeById(s,e,t);else if("function"==typeof t)for(const[n,i]of o.entries())if(i===t){this._unsubscribeById(s,e,n);break}}}publish(s,e,{global:t=!0}={}){if("string"!=typeof s)throw new TypeError("[my-pubsub] publish: event 必须是字符串");this._emitLocal(s,e,!1),t&&this._postBroadcast(s,e)}_emitLocal(s,e,t=!1){const n=Array.from(this.components);for(const o of n){const n=this.localSubs.get(o);if(!n){this.components.delete(o);continue}const i=n.get(s);if(!i)continue;const r=Array.from(i.values());for(const n of r)try{n(e,{fromRemote:t})}catch(e){console.error(`[my-pubsub] callback error in event "${s}":`,e)}}}_cleanup(s){try{this.localSubs.delete(s),this.components.delete(s)}catch(s){console.warn("[my-pubsub] cleanup failed:",s)}}getSubscriptionStats(){const s={totalComponents:this.components.size,events:new Map};for(const e of this.components){const t=this.localSubs.get(e);if(t)for(const[e,n]of t.entries())s.events.has(e)||s.events.set(e,0),s.events.set(e,s.events.get(e)+n.size)}return s}};function t(s,t,n){return e.subscribe(s,t,n)}function n(s,t,n){return e.publish(s,t,n)}function o(s,t,n){return e.unsubscribe(s,t,n)}const i=e;var r={subscribe:t,publish:n,unsubscribe:o},c=Object.freeze({__proto__:null,__core__:i,default:r,publish:n,subscribe:t,unsubscribe:o});export{i as _,r as a,c as i,n as p,t as s,o as u};
|
|
2
|
+
//# sourceMappingURL=index-ChQWdmu9.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-ChQWdmu9.esm.js","sources":["../../src/modules/messageService/index.js"],"sourcesContent":["const CHANNEL_KEY = '__kdcloud_kwc_pubsub_channel__';\n\n// 使用更高效的ID生成方法\nfunction genId() {\n return `${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;\n}\n\nclass PubSubCore {\n constructor() {\n this.localSubs = new WeakMap();\n this.components = new Set();\n this.instanceId = genId();\n this.bc = null;\n this._listenBroadcast();\n }\n\n _listenBroadcast() {\n try {\n // 优先使用 BroadcastChannel\n this.bc = new BroadcastChannel(CHANNEL_KEY);\n this.bc.onmessage = (ev) => this._onMessage(ev.data);\n } catch {\n // 降级方案\n const messageHandler = (ev) => {\n const d = ev.data;\n if (d?.__KDCLOUD_KWC_PUBSUB__) this._onMessage(d);\n };\n window.addEventListener('message', messageHandler);\n \n // 保存引用以便后续清理(如果需要)\n this._messageHandler = messageHandler;\n }\n }\n\n _onMessage(data = {}) {\n const { event, payload, senderId } = data;\n // 使用短路运算简化条件判断\n if (!event || senderId === this.instanceId) return;\n this._emitLocal(event, payload, true);\n }\n\n _postBroadcast(event, payload) {\n const message = { \n event, \n payload, \n senderId: this.instanceId,\n __KDCLOUD_KWC_PUBSUB__: true // 统一添加标识\n };\n \n try {\n if (this.bc) {\n this.bc.postMessage(message);\n } else {\n window.postMessage(message, '*');\n }\n } catch (error) {\n console.error('[my-pubsub] Broadcast failed:', error);\n }\n }\n\n _ensureFor(component) {\n if (!this.localSubs.has(component)) {\n this.localSubs.set(component, new Map());\n this.components.add(component);\n }\n return this.localSubs.get(component);\n }\n\n /**\n * 订阅事件\n * @param {Object} component - 组件实例\n * @param {string} event - 事件名称\n * @param {Function} callback - 回调函数\n * @returns {Function} 取消订阅函数\n */\n subscribe(component, event, callback) {\n // 参数校验\n if (typeof component !== 'object' || !component) {\n throw new TypeError('[my-pubsub] subscribe: 第一个参数必须是有效的组件实例');\n }\n if (typeof event !== 'string') {\n throw new TypeError('[my-pubsub] subscribe: event 必须是字符串');\n }\n if (typeof callback !== 'function') {\n throw new TypeError('[my-pubsub] subscribe: callback 必须是函数');\n }\n\n const subsForComp = this._ensureFor(component);\n if (!subsForComp.has(event)) {\n subsForComp.set(event, new Map());\n }\n\n const mapForEvent = subsForComp.get(event);\n const subId = genId();\n mapForEvent.set(subId, callback);\n\n // 返回取消订阅函数\n return () => {\n this._unsubscribeById(component, event, subId);\n };\n }\n\n /**\n * 内部方法:根据ID取消订阅\n */\n _unsubscribeById(component, event, subId) {\n const subs = this.localSubs.get(component);\n if (!subs) return;\n\n const evMap = subs.get(event);\n if (!evMap) return;\n\n evMap.delete(subId);\n \n // 清理空Map\n if (evMap.size === 0) {\n subs.delete(event);\n }\n if (subs.size === 0) {\n this._cleanup(component);\n }\n }\n\n /**\n * 取消订阅\n */\n unsubscribe(component, event, callbackOrId) {\n if (!component || typeof component !== 'object') return;\n \n const subs = this.localSubs.get(component);\n if (!subs) return;\n\n // 清理整个组件\n if (!event) {\n this._cleanup(component);\n return;\n }\n\n const evMap = subs.get(event);\n if (!evMap) return;\n\n // 未提供第三个参数:清理整个事件\n if (typeof callbackOrId === 'undefined') {\n subs.delete(event);\n if (subs.size === 0) this._cleanup(component);\n return;\n }\n\n // 根据类型处理\n if (typeof callbackOrId === 'string') {\n this._unsubscribeById(component, event, callbackOrId);\n } else if (typeof callbackOrId === 'function') {\n // 向后兼容:根据回调函数删除\n for (const [id, cb] of evMap.entries()) {\n if (cb === callbackOrId) {\n this._unsubscribeById(component, event, id);\n break; // 只删除第一个匹配的,避免误删\n }\n }\n }\n }\n\n publish(event, payload, { global = true } = {}) {\n if (typeof event !== 'string') {\n throw new TypeError('[my-pubsub] publish: event 必须是字符串');\n }\n \n // 先本地触发\n this._emitLocal(event, payload, false);\n \n // 再广播\n if (global) {\n this._postBroadcast(event, payload);\n }\n }\n\n _emitLocal(event, payload, fromRemote = false) {\n // 使用数组缓存避免在迭代过程中修改Set\n const components = Array.from(this.components);\n \n for (const comp of components) {\n const subsForComp = this.localSubs.get(comp);\n if (!subsForComp) {\n this.components.delete(comp);\n continue;\n }\n\n const evMap = subsForComp.get(event);\n if (!evMap) continue;\n\n // 使用数组缓存回调,避免在迭代过程中修改Map\n const callbacks = Array.from(evMap.values());\n \n for (const cb of callbacks) {\n try {\n cb(payload, { fromRemote });\n } catch (err) {\n console.error(`[my-pubsub] callback error in event \"${event}\":`, err);\n }\n }\n }\n }\n\n _cleanup(component) {\n try {\n this.localSubs.delete(component);\n this.components.delete(component);\n } catch (err) {\n console.warn('[my-pubsub] cleanup failed:', err);\n }\n }\n\n /**\n * 获取当前订阅状态(调试用)\n */\n getSubscriptionStats() {\n const stats = {\n totalComponents: this.components.size,\n events: new Map()\n };\n\n for (const comp of this.components) {\n const subs = this.localSubs.get(comp);\n if (subs) {\n for (const [event, eventMap] of subs.entries()) {\n if (!stats.events.has(event)) {\n stats.events.set(event, 0);\n }\n stats.events.set(event, stats.events.get(event) + eventMap.size);\n }\n }\n }\n\n return stats;\n }\n}\n\n// 单例模式\nconst core = new PubSubCore();\n\n/* 导出 API */\nexport function subscribe(component, event, callback) {\n return core.subscribe(component, event, callback);\n}\n\nexport function publish(event, payload, options) {\n return core.publish(event, payload, options);\n}\n\nexport function unsubscribe(component, event, callbackOrId) {\n return core.unsubscribe(component, event, callbackOrId);\n}\n\n// 导出核心实例用于调试\nexport const __core__ = core;\n\nexport default { subscribe, publish, unsubscribe };"],"names":["genId","Math","random","toString","slice","Date","now","core","constructor","this","localSubs","WeakMap","components","Set","instanceId","bc","_listenBroadcast","BroadcastChannel","onmessage","ev","_onMessage","data","messageHandler","d","__KDCLOUD_KWC_PUBSUB__","window","addEventListener","_messageHandler","event","payload","senderId","_emitLocal","_postBroadcast","message","postMessage","error","console","_ensureFor","component","has","set","Map","add","get","subscribe","callback","TypeError","subsForComp","mapForEvent","subId","_unsubscribeById","subs","evMap","delete","size","_cleanup","unsubscribe","callbackOrId","id","cb","entries","publish","global","fromRemote","Array","from","comp","callbacks","values","err","warn","getSubscriptionStats","stats","totalComponents","events","eventMap","options","__core__","index"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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 +1,2 @@
|
|
|
1
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
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";function s(){return`${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}const e=new class{constructor(){this.localSubs=new WeakMap,this.components=new Set,this.instanceId=s(),this.bc=null,this._listenBroadcast()}_listenBroadcast(){try{this.bc=new BroadcastChannel("__kdcloud_kwc_pubsub_channel__"),this.bc.onmessage=s=>this._onMessage(s.data)}catch{const s=s=>{const e=s.data;e?.__KDCLOUD_KWC_PUBSUB__&&this._onMessage(e)};window.addEventListener("message",s),this._messageHandler=s}}_onMessage(s={}){const{event:e,payload:t,senderId:n}=s;e&&n!==this.instanceId&&this._emitLocal(e,t,!0)}_postBroadcast(s,e){const t={event:s,payload:e,senderId:this.instanceId,__KDCLOUD_KWC_PUBSUB__:!0};try{this.bc?this.bc.postMessage(t):window.postMessage(t,"*")}catch(s){console.error("[my-pubsub] Broadcast failed:",s)}}_ensureFor(s){return this.localSubs.has(s)||(this.localSubs.set(s,new Map),this.components.add(s)),this.localSubs.get(s)}subscribe(e,t,n){if("object"!=typeof e||!e)throw new TypeError("[my-pubsub] subscribe: 第一个参数必须是有效的组件实例");if("string"!=typeof t)throw new TypeError("[my-pubsub] subscribe: event 必须是字符串");if("function"!=typeof n)throw new TypeError("[my-pubsub] subscribe: callback 必须是函数");const o=this._ensureFor(e);o.has(t)||o.set(t,new Map);const r=o.get(t),i=s();return r.set(i,n),()=>{this._unsubscribeById(e,t,i)}}_unsubscribeById(s,e,t){const n=this.localSubs.get(s);if(!n)return;const o=n.get(e);o&&(o.delete(t),0===o.size&&n.delete(e),0===n.size&&this._cleanup(s))}unsubscribe(s,e,t){if(!s||"object"!=typeof s)return;const n=this.localSubs.get(s);if(!n)return;if(!e)return void this._cleanup(s);const o=n.get(e);if(o){if(void 0===t)return n.delete(e),void(0===n.size&&this._cleanup(s));if("string"==typeof t)this._unsubscribeById(s,e,t);else if("function"==typeof t)for(const[n,r]of o.entries())if(r===t){this._unsubscribeById(s,e,n);break}}}publish(s,e,{global:t=!0}={}){if("string"!=typeof s)throw new TypeError("[my-pubsub] publish: event 必须是字符串");this._emitLocal(s,e,!1),t&&this._postBroadcast(s,e)}_emitLocal(s,e,t=!1){const n=Array.from(this.components);for(const o of n){const n=this.localSubs.get(o);if(!n){this.components.delete(o);continue}const r=n.get(s);if(!r)continue;const i=Array.from(r.values());for(const n of i)try{n(e,{fromRemote:t})}catch(e){console.error(`[my-pubsub] callback error in event "${s}":`,e)}}}_cleanup(s){try{this.localSubs.delete(s),this.components.delete(s)}catch(s){console.warn("[my-pubsub] cleanup failed:",s)}}getSubscriptionStats(){const s={totalComponents:this.components.size,events:new Map};for(const e of this.components){const t=this.localSubs.get(e);if(t)for(const[e,n]of t.entries())s.events.has(e)||s.events.set(e,0),s.events.set(e,s.events.get(e)+n.size)}return s}};function t(s,t,n){return e.subscribe(s,t,n)}function n(s,t,n){return e.publish(s,t,n)}function o(s,t,n){return e.unsubscribe(s,t,n)}const r=e;var i={subscribe:t,publish:n,unsubscribe:o},c=Object.freeze({__proto__:null,__core__:r,default:i,publish:n,subscribe:t,unsubscribe:o});exports.__core__=r,exports.index=c,exports.index$1=i,exports.publish=n,exports.subscribe=t,exports.unsubscribe=o;
|
|
2
|
+
//# sourceMappingURL=index-Dtu_3V-z.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-Dtu_3V-z.cjs.js","sources":["../../src/modules/messageService/index.js"],"sourcesContent":["const CHANNEL_KEY = '__kdcloud_kwc_pubsub_channel__';\n\n// 使用更高效的ID生成方法\nfunction genId() {\n return `${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;\n}\n\nclass PubSubCore {\n constructor() {\n this.localSubs = new WeakMap();\n this.components = new Set();\n this.instanceId = genId();\n this.bc = null;\n this._listenBroadcast();\n }\n\n _listenBroadcast() {\n try {\n // 优先使用 BroadcastChannel\n this.bc = new BroadcastChannel(CHANNEL_KEY);\n this.bc.onmessage = (ev) => this._onMessage(ev.data);\n } catch {\n // 降级方案\n const messageHandler = (ev) => {\n const d = ev.data;\n if (d?.__KDCLOUD_KWC_PUBSUB__) this._onMessage(d);\n };\n window.addEventListener('message', messageHandler);\n \n // 保存引用以便后续清理(如果需要)\n this._messageHandler = messageHandler;\n }\n }\n\n _onMessage(data = {}) {\n const { event, payload, senderId } = data;\n // 使用短路运算简化条件判断\n if (!event || senderId === this.instanceId) return;\n this._emitLocal(event, payload, true);\n }\n\n _postBroadcast(event, payload) {\n const message = { \n event, \n payload, \n senderId: this.instanceId,\n __KDCLOUD_KWC_PUBSUB__: true // 统一添加标识\n };\n \n try {\n if (this.bc) {\n this.bc.postMessage(message);\n } else {\n window.postMessage(message, '*');\n }\n } catch (error) {\n console.error('[my-pubsub] Broadcast failed:', error);\n }\n }\n\n _ensureFor(component) {\n if (!this.localSubs.has(component)) {\n this.localSubs.set(component, new Map());\n this.components.add(component);\n }\n return this.localSubs.get(component);\n }\n\n /**\n * 订阅事件\n * @param {Object} component - 组件实例\n * @param {string} event - 事件名称\n * @param {Function} callback - 回调函数\n * @returns {Function} 取消订阅函数\n */\n subscribe(component, event, callback) {\n // 参数校验\n if (typeof component !== 'object' || !component) {\n throw new TypeError('[my-pubsub] subscribe: 第一个参数必须是有效的组件实例');\n }\n if (typeof event !== 'string') {\n throw new TypeError('[my-pubsub] subscribe: event 必须是字符串');\n }\n if (typeof callback !== 'function') {\n throw new TypeError('[my-pubsub] subscribe: callback 必须是函数');\n }\n\n const subsForComp = this._ensureFor(component);\n if (!subsForComp.has(event)) {\n subsForComp.set(event, new Map());\n }\n\n const mapForEvent = subsForComp.get(event);\n const subId = genId();\n mapForEvent.set(subId, callback);\n\n // 返回取消订阅函数\n return () => {\n this._unsubscribeById(component, event, subId);\n };\n }\n\n /**\n * 内部方法:根据ID取消订阅\n */\n _unsubscribeById(component, event, subId) {\n const subs = this.localSubs.get(component);\n if (!subs) return;\n\n const evMap = subs.get(event);\n if (!evMap) return;\n\n evMap.delete(subId);\n \n // 清理空Map\n if (evMap.size === 0) {\n subs.delete(event);\n }\n if (subs.size === 0) {\n this._cleanup(component);\n }\n }\n\n /**\n * 取消订阅\n */\n unsubscribe(component, event, callbackOrId) {\n if (!component || typeof component !== 'object') return;\n \n const subs = this.localSubs.get(component);\n if (!subs) return;\n\n // 清理整个组件\n if (!event) {\n this._cleanup(component);\n return;\n }\n\n const evMap = subs.get(event);\n if (!evMap) return;\n\n // 未提供第三个参数:清理整个事件\n if (typeof callbackOrId === 'undefined') {\n subs.delete(event);\n if (subs.size === 0) this._cleanup(component);\n return;\n }\n\n // 根据类型处理\n if (typeof callbackOrId === 'string') {\n this._unsubscribeById(component, event, callbackOrId);\n } else if (typeof callbackOrId === 'function') {\n // 向后兼容:根据回调函数删除\n for (const [id, cb] of evMap.entries()) {\n if (cb === callbackOrId) {\n this._unsubscribeById(component, event, id);\n break; // 只删除第一个匹配的,避免误删\n }\n }\n }\n }\n\n publish(event, payload, { global = true } = {}) {\n if (typeof event !== 'string') {\n throw new TypeError('[my-pubsub] publish: event 必须是字符串');\n }\n \n // 先本地触发\n this._emitLocal(event, payload, false);\n \n // 再广播\n if (global) {\n this._postBroadcast(event, payload);\n }\n }\n\n _emitLocal(event, payload, fromRemote = false) {\n // 使用数组缓存避免在迭代过程中修改Set\n const components = Array.from(this.components);\n \n for (const comp of components) {\n const subsForComp = this.localSubs.get(comp);\n if (!subsForComp) {\n this.components.delete(comp);\n continue;\n }\n\n const evMap = subsForComp.get(event);\n if (!evMap) continue;\n\n // 使用数组缓存回调,避免在迭代过程中修改Map\n const callbacks = Array.from(evMap.values());\n \n for (const cb of callbacks) {\n try {\n cb(payload, { fromRemote });\n } catch (err) {\n console.error(`[my-pubsub] callback error in event \"${event}\":`, err);\n }\n }\n }\n }\n\n _cleanup(component) {\n try {\n this.localSubs.delete(component);\n this.components.delete(component);\n } catch (err) {\n console.warn('[my-pubsub] cleanup failed:', err);\n }\n }\n\n /**\n * 获取当前订阅状态(调试用)\n */\n getSubscriptionStats() {\n const stats = {\n totalComponents: this.components.size,\n events: new Map()\n };\n\n for (const comp of this.components) {\n const subs = this.localSubs.get(comp);\n if (subs) {\n for (const [event, eventMap] of subs.entries()) {\n if (!stats.events.has(event)) {\n stats.events.set(event, 0);\n }\n stats.events.set(event, stats.events.get(event) + eventMap.size);\n }\n }\n }\n\n return stats;\n }\n}\n\n// 单例模式\nconst core = new PubSubCore();\n\n/* 导出 API */\nexport function subscribe(component, event, callback) {\n return core.subscribe(component, event, callback);\n}\n\nexport function publish(event, payload, options) {\n return core.publish(event, payload, options);\n}\n\nexport function unsubscribe(component, event, callbackOrId) {\n return core.unsubscribe(component, event, callbackOrId);\n}\n\n// 导出核心实例用于调试\nexport const __core__ = core;\n\nexport default { subscribe, publish, unsubscribe };"],"names":["genId","Math","random","toString","slice","Date","now","core","constructor","this","localSubs","WeakMap","components","Set","instanceId","bc","_listenBroadcast","BroadcastChannel","onmessage","ev","_onMessage","data","messageHandler","d","__KDCLOUD_KWC_PUBSUB__","window","addEventListener","_messageHandler","event","payload","senderId","_emitLocal","_postBroadcast","message","postMessage","error","console","_ensureFor","component","has","set","Map","add","get","subscribe","callback","TypeError","subsForComp","mapForEvent","subId","_unsubscribeById","subs","evMap","delete","size","_cleanup","unsubscribe","callbackOrId","id","cb","entries","publish","global","fromRemote","Array","from","comp","callbacks","values","err","warn","getSubscriptionStats","stats","totalComponents","events","eventMap","options","__core__","index"],"mappings":"aAGA,SAASA,IACP,MAAO,GAAGC,KAAKC,SAASC,SAAS,IAAIC,MAAM,KAAKC,KAAKC,MAAMH,SAAS,KACtE,CAyOA,MAAMI,EAAO,IAvOb,MACE,WAAAC,GACEC,KAAKC,UAAY,IAAIC,QACrBF,KAAKG,WAAa,IAAIC,IACtBJ,KAAKK,WAAad,IAClBS,KAAKM,GAAK,KACVN,KAAKO,kBACP,CAEA,gBAAAA,GACE,IAEEP,KAAKM,GAAK,IAAIE,iBAnBA,kCAoBdR,KAAKM,GAAGG,UAAaC,GAAOV,KAAKW,WAAWD,EAAGE,KACjD,CAAE,MAEA,MAAMC,EAAkBH,IACtB,MAAMI,EAAIJ,EAAGE,KACTE,GAAGC,wBAAwBf,KAAKW,WAAWG,IAEjDE,OAAOC,iBAAiB,UAAWJ,GAGnCb,KAAKkB,gBAAkBL,CACzB,CACF,CAEA,UAAAF,CAAWC,EAAO,IAChB,MAAMO,MAAEA,EAAKC,QAAEA,EAAOC,SAAEA,GAAaT,EAEhCO,GAASE,IAAarB,KAAKK,YAChCL,KAAKsB,WAAWH,EAAOC,GAAS,EAClC,CAEA,cAAAG,CAAeJ,EAAOC,GACpB,MAAMI,EAAU,CACdL,QACAC,UACAC,SAAUrB,KAAKK,WACfU,wBAAwB,GAG1B,IACMf,KAAKM,GACPN,KAAKM,GAAGmB,YAAYD,GAEpBR,OAAOS,YAAYD,EAAS,IAEhC,CAAE,MAAOE,GACPC,QAAQD,MAAM,gCAAiCA,EACjD,CACF,CAEA,UAAAE,CAAWC,GAKT,OAJK7B,KAAKC,UAAU6B,IAAID,KACtB7B,KAAKC,UAAU8B,IAAIF,EAAW,IAAIG,KAClChC,KAAKG,WAAW8B,IAAIJ,IAEf7B,KAAKC,UAAUiC,IAAIL,EAC5B,CASA,SAAAM,CAAUN,EAAWV,EAAOiB,GAE1B,GAAyB,iBAAdP,IAA2BA,EACpC,MAAM,IAAIQ,UAAU,0CAEtB,GAAqB,iBAAVlB,EACT,MAAM,IAAIkB,UAAU,uCAEtB,GAAwB,mBAAbD,EACT,MAAM,IAAIC,UAAU,yCAGtB,MAAMC,EAActC,KAAK4B,WAAWC,GAC/BS,EAAYR,IAAIX,IACnBmB,EAAYP,IAAIZ,EAAO,IAAIa,KAG7B,MAAMO,EAAcD,EAAYJ,IAAIf,GAC9BqB,EAAQjD,IAId,OAHAgD,EAAYR,IAAIS,EAAOJ,GAGhB,KACLpC,KAAKyC,iBAAiBZ,EAAWV,EAAOqB,GAE5C,CAKA,gBAAAC,CAAiBZ,EAAWV,EAAOqB,GACjC,MAAME,EAAO1C,KAAKC,UAAUiC,IAAIL,GAChC,IAAKa,EAAM,OAEX,MAAMC,EAAQD,EAAKR,IAAIf,GAClBwB,IAELA,EAAMC,OAAOJ,GAGM,IAAfG,EAAME,MACRH,EAAKE,OAAOzB,GAEI,IAAduB,EAAKG,MACP7C,KAAK8C,SAASjB,GAElB,CAKA,WAAAkB,CAAYlB,EAAWV,EAAO6B,GAC5B,IAAKnB,GAAkC,iBAAdA,EAAwB,OAEjD,MAAMa,EAAO1C,KAAKC,UAAUiC,IAAIL,GAChC,IAAKa,EAAM,OAGX,IAAKvB,EAEH,YADAnB,KAAK8C,SAASjB,GAIhB,MAAMc,EAAQD,EAAKR,IAAIf,GACvB,GAAKwB,EAAL,CAGA,QAA4B,IAAjBK,EAGT,OAFAN,EAAKE,OAAOzB,QACM,IAAduB,EAAKG,MAAY7C,KAAK8C,SAASjB,IAKrC,GAA4B,iBAAjBmB,EACThD,KAAKyC,iBAAiBZ,EAAWV,EAAO6B,QACnC,GAA4B,mBAAjBA,EAEhB,IAAK,MAAOC,EAAIC,KAAOP,EAAMQ,UAC3B,GAAID,IAAOF,EAAc,CACvBhD,KAAKyC,iBAAiBZ,EAAWV,EAAO8B,GACxC,KACF,CAlBQ,CAqBd,CAEA,OAAAG,CAAQjC,EAAOC,GAASiC,OAAEA,GAAS,GAAS,IAC1C,GAAqB,iBAAVlC,EACT,MAAM,IAAIkB,UAAU,qCAItBrC,KAAKsB,WAAWH,EAAOC,GAAS,GAG5BiC,GACFrD,KAAKuB,eAAeJ,EAAOC,EAE/B,CAEA,UAAAE,CAAWH,EAAOC,EAASkC,GAAa,GAEtC,MAAMnD,EAAaoD,MAAMC,KAAKxD,KAAKG,YAEnC,IAAK,MAAMsD,KAAQtD,EAAY,CAC7B,MAAMmC,EAActC,KAAKC,UAAUiC,IAAIuB,GACvC,IAAKnB,EAAa,CAChBtC,KAAKG,WAAWyC,OAAOa,GACvB,QACF,CAEA,MAAMd,EAAQL,EAAYJ,IAAIf,GAC9B,IAAKwB,EAAO,SAGZ,MAAMe,EAAYH,MAAMC,KAAKb,EAAMgB,UAEnC,IAAK,MAAMT,KAAMQ,EACf,IACER,EAAG9B,EAAS,CAAEkC,cAChB,CAAE,MAAOM,GACPjC,QAAQD,MAAM,wCAAwCP,MAAWyC,EACnE,CAEJ,CACF,CAEA,QAAAd,CAASjB,GACP,IACE7B,KAAKC,UAAU2C,OAAOf,GACtB7B,KAAKG,WAAWyC,OAAOf,EACzB,CAAE,MAAO+B,GACPjC,QAAQkC,KAAK,8BAA+BD,EAC9C,CACF,CAKA,oBAAAE,GACE,MAAMC,EAAQ,CACZC,gBAAiBhE,KAAKG,WAAW0C,KACjCoB,OAAQ,IAAIjC,KAGd,IAAK,MAAMyB,KAAQzD,KAAKG,WAAY,CAClC,MAAMuC,EAAO1C,KAAKC,UAAUiC,IAAIuB,GAChC,GAAIf,EACF,IAAK,MAAOvB,EAAO+C,KAAaxB,EAAKS,UAC9BY,EAAME,OAAOnC,IAAIX,IACpB4C,EAAME,OAAOlC,IAAIZ,EAAO,GAE1B4C,EAAME,OAAOlC,IAAIZ,EAAO4C,EAAME,OAAO/B,IAAIf,GAAS+C,EAASrB,KAGjE,CAEA,OAAOkB,CACT,GAOK,SAAS5B,EAAUN,EAAWV,EAAOiB,GAC1C,OAAOtC,EAAKqC,UAAUN,EAAWV,EAAOiB,EAC1C,CAEO,SAASgB,EAAQjC,EAAOC,EAAS+C,GACtC,OAAOrE,EAAKsD,QAAQjC,EAAOC,EAAS+C,EACtC,CAEO,SAASpB,EAAYlB,EAAWV,EAAO6B,GAC5C,OAAOlD,EAAKiD,YAAYlB,EAAWV,EAAO6B,EAC5C,CAGY,MAACoB,EAAWtE,EAExB,IAAAuE,EAAe,CAAElC,YAAWiB,UAASL"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{s as t,u as e,p as r}from"./index-ChQWdmu9.esm.js";const s=new Map,a=new Map,n=new Map;function o(t){if("object"!=typeof t||null===t)return t;if(Array.isArray(t))return t.map(o);const e=Object.keys(t).sort(),r={};for(const s of e)r[s]=o(t[s]);return r}function c(t){if(!t||"object"!=typeof t)return String(t);const e=o(t);return JSON.stringify(e)}function l(r,a){const n=c(r);s.has(n)&&a(s.get(n));const o={};return t(o,n,a),()=>{e(o,n,a)}}async function u(t,e,o={}){const{ttlMs:l=6e4,force:u=!1,dedupe:i=!0,abortPrevious:f=!0}=o,d=c(t),g=s.get(d),b=Date.now();if(g&&!u){const t=g.ttl??l;if(!g.ts||b-g.ts<=t)return g}if(i&&a.has(d)&&!u)return a.get(d);if(f&&n.has(d))try{n.get(d).abort()}catch(t){n.delete(d),a.delete(d),console.error("Failed to abort previous request",t)}const h=new AbortController;n.set(d,h);const p=(async()=>{try{const a=await e(t,{signal:h.signal});let n=null;try{n=await a.json()}catch{n=null}if(!a.ok){const t={data:null,error:{status:a.status,message:n&&n.message||"Request failed"},ts:b,ttl:l};return s.set(d,t),r(d,t),t}const o={data:n,error:null,ts:b,ttl:l};return s.set(d,o),r(d,o),o}catch(t){if("AbortError"===t?.name)return{data:null,error:{status:"ABORTED",message:t.message},aborted:!0};const e={data:null,error:{status:0,message:t?.message||"Network error"},ts:b,ttl:l};return s.set(d,e),r(d,e),e}finally{n.delete(d),a.delete(d)}})();return a.set(d,p),p}async function i(t,e){const r=c(t);if(s.has(r)&&s.delete(r),n.has(r)){try{n.get(r).abort()}catch{}n.delete(r)}a.delete(r),await u(t,e,{force:!0,dedupe:!1,abortPrevious:!1})}function f(t,e,a={}){const{ttlMs:n=6e4}=a,o=c(t),l={data:e,error:null,ts:Date.now(),ttl:n};s.set(o,l),r(o,l)}var d=Object.freeze({__proto__:null,fetchDataWithCache:u,invalidateCache:i,subscribe:l,updateCache:f});export{i as a,u as f,d as i,l as s,f as u};
|
|
2
|
+
//# sourceMappingURL=index-KT-nyvfl.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-KT-nyvfl.esm.js","sources":["../../src/modules/kingdeeDataService/index.js"],"sourcesContent":["import { subscribe as sub, publish, unsubscribe } from \"../messageService\";\n\nconst dataStore = new Map(); // key -> Data\nconst pendingMap = new Map(); // key -> Promise\nconst controllerMap = new Map(); // key -> AbortController\n\n\n/**\n * Sort object or array recursively\n * @param {Object} obj object or array to sort\n * @erturns {Object} sorted object or array\n */\nfunction sortObjectDeep(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sortObjectDeep);\n }\n\n const sortedKeys = Object.keys(obj).sort();\n const sortedObj = {};\n\n for (const key of sortedKeys) {\n sortedObj[key] = sortObjectDeep(obj[key]);\n }\n\n return sortedObj;\n}\n\n/**\n * KWC cache key generator\n * @param {Object} config Wire Adapter config\n * @returns {String} cache key\n */\nfunction getCacheKey(config) {\n if (!config || typeof config !== 'object') {\n return String(config);\n }\n\n const normalizedConfig = sortObjectDeep(config);\n return JSON.stringify(normalizedConfig);\n}\n\n/**\n * Subscribe to data changes\n * @param {Object} config adapter config\n * @param {Function} subscriber callback to be called when data changes\n * @returns {Function} unsubscribe function\n */\nexport function subscribe(config, subscriber) {\n const key = getCacheKey(config);\n if (dataStore.has(key)) {\n subscriber(dataStore.get(key));\n }\n\n const component = {}\n sub(component, key, subscriber)\n return () => {\n unsubscribe(component, key, subscriber);\n }\n}\n\n/**\n * Fetch data with cache\n * @param {Object} config configuration to generate cache key and url\n * @param {Function} dataFetcher function to fetch data\n * @param {Object} options fetch options\n * @param {Number} options.ttlMs cache ttl in milliseconds\n * @param {Boolean} options.force force fetch refresh\n * @param {Boolean} options.dedupe dedupe requests\n * @param {Boolean} options.abortPrevious abort previous request\n * @returns {Promise} promise that resolves to data or error\n */\nexport async function fetchDataWithCache(config, dataFetcher, options = {}) {\n const { ttlMs = 60000, force = false, dedupe = true, abortPrevious = true } = options;\n const key = getCacheKey(config);\n const cached = dataStore.get(key);\n const nowTs = Date.now();\n\n // Return cached if not expired and not force\n if (cached && !force) {\n const ttl = cached.ttl ?? ttlMs;\n if (!cached.ts || (nowTs - cached.ts) <= ttl) {\n return cached;\n }\n }\n\n // Concurrency dedupe: resuse in-flight promise if desired\n if (dedupe && pendingMap.has(key) && !force) {\n return pendingMap.get(key);\n }\n\n // Abort previous in-flight for the same key if requested\n if (abortPrevious && controllerMap.has(key)) {\n try {\n controllerMap.get(key).abort();\n } catch (error) {\n controllerMap.delete(key);\n pendingMap.delete(key);\n console.error('Failed to abort previous request', error);\n }\n }\n\n const controller = new AbortController();\n controllerMap.set(key, controller);\n\n const p = (async () => {\n try {\n const res = await dataFetcher(config, { signal: controller.signal });\n let payload = null;\n\n try {\n payload = await res.json();\n } catch {\n payload = null;\n }\n\n if (!res.ok) {\n const result = {\n data: null,\n error: { status: res.status, message: (payload && payload.message) || 'Request failed' },\n ts: nowTs,\n ttl: ttlMs\n };\n dataStore.set(key, result);\n publish(key, result);\n return result;\n }\n\n const result = { data: payload, error: null, ts: nowTs, ttl: ttlMs };\n dataStore.set(key, result);\n publish(key, result);\n return result;\n } catch (error) {\n if (error?.name === 'AbortError') {\n return { data: null, error: { status: 'ABORTED', message: error.message }, aborted: true }; \n }\n\n const result = { data: null, error: { status: 0, message: error?.message || 'Network error' }, ts: nowTs, ttl: ttlMs };\n dataStore.set(key, result);\n publish(key, result);\n return result;\n } finally {\n controllerMap.delete(key);\n pendingMap.delete(key);\n }\n })();\n\n pendingMap.set(key, p);\n return p;\n}\n\nexport async function invalidateCache(config, dataFetcher) {\n const key = getCacheKey(config);\n\n if (dataStore.has(key)) {\n dataStore.delete(key);\n }\n\n if (controllerMap.has(key)) {\n try {\n controllerMap.get(key).abort();\n } catch {}\n controllerMap.delete(key);\n }\n\n pendingMap.delete(key);\n await fetchDataWithCache(config, dataFetcher, { force: true, dedupe: false, abortPrevious: false });\n}\n\nexport function updateCache(config, data, options = {}) {\n const { ttlMs = 60000 } = options;\n const key = getCacheKey(config);\n const result = { data, error: null, ts: Date.now(), ttl: ttlMs };\n dataStore.set(key, result);\n publish(key, result);\n}"],"names":["dataStore","Map","pendingMap","controllerMap","sortObjectDeep","obj","Array","isArray","map","sortedKeys","Object","keys","sort","sortedObj","key","getCacheKey","config","String","normalizedConfig","JSON","stringify","subscribe","subscriber","has","get","component","sub","unsubscribe","async","fetchDataWithCache","dataFetcher","options","ttlMs","force","dedupe","abortPrevious","cached","nowTs","Date","now","ttl","ts","abort","error","delete","console","controller","AbortController","set","p","res","signal","payload","json","ok","result","data","status","message","publish","name","aborted","invalidateCache","updateCache"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=require("./index-Dtu_3V-z.cjs.js");const e=new Map,r=new Map,s=new Map;function a(t){if("object"!=typeof t||null===t)return t;if(Array.isArray(t))return t.map(a);const e=Object.keys(t).sort(),r={};for(const s of e)r[s]=a(t[s]);return r}function n(t){if(!t||"object"!=typeof t)return String(t);const e=a(t);return JSON.stringify(e)}function o(r,s){const a=n(r);e.has(a)&&s(e.get(a));const o={};return t.subscribe(o,a,s),()=>{t.unsubscribe(o,a,s)}}async function c(a,o,c={}){const{ttlMs:u=6e4,force:i=!1,dedupe:l=!0,abortPrevious:f=!0}=c,d=n(a),b=e.get(d),h=Date.now();if(b&&!i){const t=b.ttl??u;if(!b.ts||h-b.ts<=t)return b}if(l&&r.has(d)&&!i)return r.get(d);if(f&&s.has(d))try{s.get(d).abort()}catch(t){s.delete(d),r.delete(d),console.error("Failed to abort previous request",t)}const p=new AbortController;s.set(d,p);const g=(async()=>{try{const r=await o(a,{signal:p.signal});let s=null;try{s=await r.json()}catch{s=null}if(!r.ok){const a={data:null,error:{status:r.status,message:s&&s.message||"Request failed"},ts:h,ttl:u};return e.set(d,a),t.publish(d,a),a}const n={data:s,error:null,ts:h,ttl:u};return e.set(d,n),t.publish(d,n),n}catch(r){if("AbortError"===r?.name)return{data:null,error:{status:"ABORTED",message:r.message},aborted:!0};const s={data:null,error:{status:0,message:r?.message||"Network error"},ts:h,ttl:u};return e.set(d,s),t.publish(d,s),s}finally{s.delete(d),r.delete(d)}})();return r.set(d,g),g}async function u(t,a){const o=n(t);if(e.has(o)&&e.delete(o),s.has(o)){try{s.get(o).abort()}catch{}s.delete(o)}r.delete(o),await c(t,a,{force:!0,dedupe:!1,abortPrevious:!1})}function i(r,s,a={}){const{ttlMs:o=6e4}=a,c=n(r),u={data:s,error:null,ts:Date.now(),ttl:o};e.set(c,u),t.publish(c,u)}var l=Object.freeze({__proto__:null,fetchDataWithCache:c,invalidateCache:u,subscribe:o,updateCache:i});exports.fetchDataWithCache=c,exports.index=l,exports.invalidateCache=u,exports.subscribe=o,exports.updateCache=i;
|
|
2
|
+
//# sourceMappingURL=index-UhtWZvgp.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-UhtWZvgp.cjs.js","sources":["../../src/modules/kingdeeDataService/index.js"],"sourcesContent":["import { subscribe as sub, publish, unsubscribe } from \"../messageService\";\n\nconst dataStore = new Map(); // key -> Data\nconst pendingMap = new Map(); // key -> Promise\nconst controllerMap = new Map(); // key -> AbortController\n\n\n/**\n * Sort object or array recursively\n * @param {Object} obj object or array to sort\n * @erturns {Object} sorted object or array\n */\nfunction sortObjectDeep(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sortObjectDeep);\n }\n\n const sortedKeys = Object.keys(obj).sort();\n const sortedObj = {};\n\n for (const key of sortedKeys) {\n sortedObj[key] = sortObjectDeep(obj[key]);\n }\n\n return sortedObj;\n}\n\n/**\n * KWC cache key generator\n * @param {Object} config Wire Adapter config\n * @returns {String} cache key\n */\nfunction getCacheKey(config) {\n if (!config || typeof config !== 'object') {\n return String(config);\n }\n\n const normalizedConfig = sortObjectDeep(config);\n return JSON.stringify(normalizedConfig);\n}\n\n/**\n * Subscribe to data changes\n * @param {Object} config adapter config\n * @param {Function} subscriber callback to be called when data changes\n * @returns {Function} unsubscribe function\n */\nexport function subscribe(config, subscriber) {\n const key = getCacheKey(config);\n if (dataStore.has(key)) {\n subscriber(dataStore.get(key));\n }\n\n const component = {}\n sub(component, key, subscriber)\n return () => {\n unsubscribe(component, key, subscriber);\n }\n}\n\n/**\n * Fetch data with cache\n * @param {Object} config configuration to generate cache key and url\n * @param {Function} dataFetcher function to fetch data\n * @param {Object} options fetch options\n * @param {Number} options.ttlMs cache ttl in milliseconds\n * @param {Boolean} options.force force fetch refresh\n * @param {Boolean} options.dedupe dedupe requests\n * @param {Boolean} options.abortPrevious abort previous request\n * @returns {Promise} promise that resolves to data or error\n */\nexport async function fetchDataWithCache(config, dataFetcher, options = {}) {\n const { ttlMs = 60000, force = false, dedupe = true, abortPrevious = true } = options;\n const key = getCacheKey(config);\n const cached = dataStore.get(key);\n const nowTs = Date.now();\n\n // Return cached if not expired and not force\n if (cached && !force) {\n const ttl = cached.ttl ?? ttlMs;\n if (!cached.ts || (nowTs - cached.ts) <= ttl) {\n return cached;\n }\n }\n\n // Concurrency dedupe: resuse in-flight promise if desired\n if (dedupe && pendingMap.has(key) && !force) {\n return pendingMap.get(key);\n }\n\n // Abort previous in-flight for the same key if requested\n if (abortPrevious && controllerMap.has(key)) {\n try {\n controllerMap.get(key).abort();\n } catch (error) {\n controllerMap.delete(key);\n pendingMap.delete(key);\n console.error('Failed to abort previous request', error);\n }\n }\n\n const controller = new AbortController();\n controllerMap.set(key, controller);\n\n const p = (async () => {\n try {\n const res = await dataFetcher(config, { signal: controller.signal });\n let payload = null;\n\n try {\n payload = await res.json();\n } catch {\n payload = null;\n }\n\n if (!res.ok) {\n const result = {\n data: null,\n error: { status: res.status, message: (payload && payload.message) || 'Request failed' },\n ts: nowTs,\n ttl: ttlMs\n };\n dataStore.set(key, result);\n publish(key, result);\n return result;\n }\n\n const result = { data: payload, error: null, ts: nowTs, ttl: ttlMs };\n dataStore.set(key, result);\n publish(key, result);\n return result;\n } catch (error) {\n if (error?.name === 'AbortError') {\n return { data: null, error: { status: 'ABORTED', message: error.message }, aborted: true }; \n }\n\n const result = { data: null, error: { status: 0, message: error?.message || 'Network error' }, ts: nowTs, ttl: ttlMs };\n dataStore.set(key, result);\n publish(key, result);\n return result;\n } finally {\n controllerMap.delete(key);\n pendingMap.delete(key);\n }\n })();\n\n pendingMap.set(key, p);\n return p;\n}\n\nexport async function invalidateCache(config, dataFetcher) {\n const key = getCacheKey(config);\n\n if (dataStore.has(key)) {\n dataStore.delete(key);\n }\n\n if (controllerMap.has(key)) {\n try {\n controllerMap.get(key).abort();\n } catch {}\n controllerMap.delete(key);\n }\n\n pendingMap.delete(key);\n await fetchDataWithCache(config, dataFetcher, { force: true, dedupe: false, abortPrevious: false });\n}\n\nexport function updateCache(config, data, options = {}) {\n const { ttlMs = 60000 } = options;\n const key = getCacheKey(config);\n const result = { data, error: null, ts: Date.now(), ttl: ttlMs };\n dataStore.set(key, result);\n publish(key, result);\n}"],"names":["dataStore","Map","pendingMap","controllerMap","sortObjectDeep","obj","Array","isArray","map","sortedKeys","Object","keys","sort","sortedObj","key","getCacheKey","config","String","normalizedConfig","JSON","stringify","subscribe","subscriber","has","get","component","sub","unsubscribe","async","fetchDataWithCache","dataFetcher","options","ttlMs","force","dedupe","abortPrevious","cached","nowTs","Date","now","ttl","ts","abort","error","delete","console","controller","AbortController","set","p","res","signal","payload","json","ok","result","data","status","message","publish","name","aborted","invalidateCache","updateCache"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function r(r,o){if(!window.spyApi||!window.spyApi.doPostActions)throw console.error("Current page is not a bos page"),new Error("Current page is not a bos page");if(!Array.isArray(o)||0===o.length)throw console.error("Payload must be an array"),new Error("Payload must be an array");for(let e of o){const{a:o,p:n}=e;window.spyApi.doPostActions(r,o,n)}}async function o(o,e={}){const n=await function(r,o={}){const{formId:e,parentPageId:n,params:i}=r,{version:t="v1",app:s,isv:a,url:c}=o;if(!t&&!c)throw new Error("version in config is required");if(!s&&!c)throw new Error("app in config is required");if(!e&&!c)throw new Error("formId is required");if(!a&&!c)throw new Error("isv in config is required");let w=c||`${location.pathname}kwc/${t}/${a}/${s}/kwcform/${e}/showconfig`;if(!c&&n&&(w=`${w}?parentPageId=${n}`),i&&Object.keys(i).length>0)try{const r=JSON.stringify(i),o=w.includes("?")?"&":"?";w=`${w}${o}params=${r}`}catch(r){console.error(r)}return new Promise((r,o)=>{fetch(w).then(r=>r.json()).then(o=>{r(o)}).catch(r=>{o(r)})})}(o,e);if(!n)throw new Error("showForm response is not valid");const{parentPageId:i,pageId:t}=o;r(t||i,n)}var e=Object.freeze({__proto__:null,default:r,showForm:o});export{o as a,e as i,r as s};
|
|
2
|
+
//# sourceMappingURL=index-qaD2HVRQ.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-qaD2HVRQ.esm.js","sources":["../../src/modules/sendBosPlatformEvent/index.js","../../src/modules/sendBosPlatformEvent/showForm.js"],"sourcesContent":["import showForm from \"./showForm\";\n\n/**\n * 转发 bos 平台相关指令\n */\nexport default function sendBosPlatformEvent(pageId, payload) {\n if (!window.spyApi || !window.spyApi.doPostActions) {\n console.error('Current page is not a bos page');\n throw new Error('Current page is not a bos page');\n }\n\n if (!Array.isArray(payload) || payload.length === 0) {\n console.error('Payload must be an array');\n throw new Error('Payload must be an array');\n }\n\n for (let _payload of payload) {\n const { a: action, p: param } = _payload\n window.spyApi.doPostActions(pageId, action, param);\n }\n}\n\nasync function showFormRequest(formConfig, config = {}) {\n const response = await showForm(formConfig, config);\n if (!response) {\n throw new Error('showForm response is not valid');\n }\n\n const { parentPageId, pageId } = formConfig;\n const payload = response;\n const pId = pageId || parentPageId;\n sendBosPlatformEvent(pId, payload);\n}\n\nexport {\n showFormRequest as showForm\n}","function showForm(formConfig, config = {}) {\n const { formId, parentPageId, params } = formConfig;\n const { version = 'v1', app, isv, url: customUrl } = config;\n if (!version && !customUrl) {\n throw new Error('version in config is required');\n }\n\n if (!app && !customUrl) {\n throw new Error('app in config is required');\n }\n\n if (!formId && !customUrl) {\n throw new Error('formId is required');\n }\n\n if (!isv && !customUrl) {\n throw new Error('isv in config is required');\n }\n\n let url = customUrl || `${location.pathname}kwc/${version}/${isv}/${app}/kwcform/${formId}/showconfig`;\n\n if (!customUrl && parentPageId) {\n url = `${url}?parentPageId=${parentPageId}`;\n }\n\n if (params && Object.keys(params).length > 0) {\n try {\n const _params = JSON.stringify(params);\n const sign = url.includes('?') ? '&' : '?'\n url = `${url}${sign}params=${_params}`\n } catch (error) {\n console.error(error);\n }\n }\n\n return new Promise((resolve, reject) => {\n fetch(url).then(response => {\n return response.json();\n }).then(data => {\n resolve(data)\n }).catch(error => {\n reject(error)\n })\n })\n}\n\nexport default showForm;"],"names":["sendBosPlatformEvent","pageId","payload","window","spyApi","doPostActions","console","error","Error","Array","isArray","length","_payload","a","action","p","param","async","showFormRequest","formConfig","config","response","formId","parentPageId","params","version","app","isv","url","customUrl","location","pathname","Object","keys","_params","JSON","stringify","sign","includes","Promise","resolve","reject","fetch","then","json","data","catch","showForm"],"mappings":"AAKe,SAASA,EAAqBC,EAAQC,GACnD,IAAKC,OAAOC,SAAWD,OAAOC,OAAOC,cAEnC,MADAC,QAAQC,MAAM,kCACR,IAAIC,MAAM,kCAGlB,IAAKC,MAAMC,QAAQR,IAA+B,IAAnBA,EAAQS,OAErC,MADAL,QAAQC,MAAM,4BACR,IAAIC,MAAM,4BAGlB,IAAK,IAAII,KAAYV,EAAS,CAC5B,MAAQW,EAAGC,EAAQC,EAAGC,GAAUJ,EAChCT,OAAOC,OAAOC,cAAcJ,EAAQa,EAAQE,EAC9C,CACF,CAEAC,eAAeC,EAAgBC,EAAYC,EAAS,IAClD,MAAMC,QCvBR,SAAkBF,EAAYC,EAAS,IACrC,MAAME,OAAEA,EAAMC,aAAEA,EAAYC,OAAEA,GAAWL,GACnCM,QAAEA,EAAU,KAAIC,IAAEA,EAAGC,IAAEA,EAAKC,IAAKC,GAAcT,EACrD,IAAKK,IAAYI,EACf,MAAM,IAAIrB,MAAM,iCAGlB,IAAKkB,IAAQG,EACX,MAAM,IAAIrB,MAAM,6BAGlB,IAAKc,IAAWO,EACd,MAAM,IAAIrB,MAAM,sBAGlB,IAAKmB,IAAQE,EACX,MAAM,IAAIrB,MAAM,6BAGlB,IAAIoB,EAAMC,GAAa,GAAGC,SAASC,eAAeN,KAAWE,KAAOD,aAAeJ,eAMnF,IAJKO,GAAaN,IAChBK,EAAM,GAAGA,kBAAoBL,KAG3BC,GAAUQ,OAAOC,KAAKT,GAAQb,OAAS,EACzC,IACE,MAAMuB,EAAUC,KAAKC,UAAUZ,GACzBa,EAAOT,EAAIU,SAAS,KAAO,IAAM,IACvCV,EAAM,GAAGA,IAAMS,WAAcH,GAC/B,CAAE,MAAO3B,GACPD,QAAQC,MAAMA,EAChB,CAGF,OAAO,IAAIgC,QAAQ,CAACC,EAASC,KAC3BC,MAAMd,GAAKe,KAAKtB,GACPA,EAASuB,QACfD,KAAKE,IACNL,EAAQK,KACPC,MAAMvC,IACPkC,EAAOlC,MAGb,CDrByBwC,CAAS5B,EAAYC,GAC5C,IAAKC,EACH,MAAM,IAAIb,MAAM,kCAGlB,MAAMe,aAAEA,EAAYtB,OAAEA,GAAWkB,EAGjCnB,EADYC,GAAUsB,EADNF,EAGlB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kdcloudjs/kwc-shared-utils",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "shared-utils for kwc",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs.js",
|
|
@@ -27,5 +27,8 @@
|
|
|
27
27
|
"@rollup/plugin-node-resolve": "^16.0.1",
|
|
28
28
|
"rollup": "^4.50.0",
|
|
29
29
|
"rollup-plugin-terser": "^7.0.2"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"rollup-plugin-clear": "^2.0.7"
|
|
30
33
|
}
|
|
31
|
-
}
|
|
34
|
+
}
|
package/dist/index-BtNjXfsX.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
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:a,method:s}=this.authConfig;try{const i=await fetch(t,{method:s,headers:e,body:JSON.stringify(a)});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(a=>{try{a(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 a(t){return await e.initialize(t)}function s(){return e.isAuthenticated()}class i{constructor(t){this.name="OpenApiWireAdapter",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("OpenApi 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 a=null;for(let s=0;s<this.maxRetries;s++)try{const a=await this.performRequest(t);return this.setCacheData(e,a),void this.dataCallback(a)}catch(t){a=t,s<this.maxRetries&&await this.delay(this.retryDelay*Math.pow(2,s))}this.dataCallback({data:null,error:{message:a.message,status:a.status||"NETWORK_ERROR",retries:this.maxRetries}})}async performRequest(t){const{endpoint:e,method:a="GET",params:s={},headers:i={}}=t;this.abortController&&this.abortController.abort(),this.abortController=new AbortController;let r=e;if("GET"===a&&s){r=`${r}?${new URLSearchParams(s).toString()}`}const n={method:a,headers:{"Content-Type":"application/json",access_token:this.authManager.getAccessToken(),...i},body:"GET"===a?null:JSON.stringify(s),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!0===h.status&&"0"===h.errorCode?{data:h.data,error:null}:"401"===h.errorCode?(await this.authManager.refreshAccessToken(),this.performRequest(t)):{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&&(OpenApiWireAdapter.prototype.maxRetries=t.maxRetries),void 0!==t.retryDelay&&(OpenApiWireAdapter.prototype.retryDelay=t.retryDelay),void 0!==t.cacheTimeout&&(OpenApiWireAdapter.prototype.cacheTimeout=t.cacheTimeout)}}function r(t){if(!t||!t.endpointConfig)throw new Error("No config provided");const{endpointConfig:e}=t;if("string"==typeof e)return t;if(e.endpoint)return e.endpoint;if(!e.isv)throw new Error("Invalid config isv provided");if(!e.app)throw new Error("Invalid config app provided");if(!e.form)throw new Error("Invalid config form provided");if(!e.serviceName)throw new Error("Invalid config serviceName provided");return`/kapi/${e.version||"v2"}/${e.isv}/${e.app}/${e.form}/${e.serviceName}`}const n=function(t="GET",a={}){return function(s){if("function"==typeof s){const e=new i(s),n=e.update.bind(e);return e.update=function(e){const s={endpoint:r(e),method:t,...a,...e};return delete s.endpointConfig,e&&"object"==typeof e&&!e.endpoint&&(s.params=e.params||e),n(s)},e}return async function(t,a,s){await e.waitForAuth();const n={endpoint:r(s),method:t,...a,...s};delete n.endpointConfig,s&&"object"==typeof s&&!s.endpoint&&(n.params=s.params||s);return new Promise((t,e)=>{const a=new i(a=>{a.error?e(a.error):t(a)});a.connect(),a.update(n)})}(t,a,s||{})}}("POST");var o=Object.freeze({__proto__:null,AuthManager:t,authManager:e,doFetch:n,initializeAuth:a,isAuthenticated:s});export{t as A,e as a,a as b,s as c,n as d,o as i};
|
package/dist/index-CKzrFqj6.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
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;
|
package/dist/index-DYR8v7vJ.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
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:a,method:i}=this.authConfig;try{const s=await fetch(t,{method:i,headers:e,body:JSON.stringify(a)});if(!s.ok)throw new Error(`Authentication failed: ${s.status} - ${s.statusText}`);const r=await s.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(a=>{try{a(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 a(t){return await e.initialize(t)}function i(){return e.isAuthenticated()}class s{constructor(t){this.name="OpenApiWireAdapter",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("OpenApi 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 a=null;for(let i=0;i<this.maxRetries;i++)try{const a=await this.performRequest(t);return this.setCacheData(e,a),void this.dataCallback(a)}catch(t){a=t,i<this.maxRetries&&await this.delay(this.retryDelay*Math.pow(2,i))}this.dataCallback({data:null,error:{message:a.message,status:a.status||"NETWORK_ERROR",retries:this.maxRetries}})}async performRequest(t){const{endpoint:e,method:a="GET",params:i={},headers:s={}}=t;this.abortController&&this.abortController.abort(),this.abortController=new AbortController;let r=e;if("GET"===a&&i){r=`${r}?${new URLSearchParams(i).toString()}`}const n={method:a,headers:{"Content-Type":"application/json",access_token:this.authManager.getAccessToken(),...s},body:"GET"===a?null:JSON.stringify(i),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!0===h.status&&"0"===h.errorCode?{data:h.data,error:null}:"401"===h.errorCode?(await this.authManager.refreshAccessToken(),this.performRequest(t)):{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&&(OpenApiWireAdapter.prototype.maxRetries=t.maxRetries),void 0!==t.retryDelay&&(OpenApiWireAdapter.prototype.retryDelay=t.retryDelay),void 0!==t.cacheTimeout&&(OpenApiWireAdapter.prototype.cacheTimeout=t.cacheTimeout)}}function r(t){if(!t||!t.endpointConfig)throw new Error("No config provided");const{endpointConfig:e}=t;if("string"==typeof e)return t;if(e.endpoint)return e.endpoint;if(!e.isv)throw new Error("Invalid config isv provided");if(!e.app)throw new Error("Invalid config app provided");if(!e.form)throw new Error("Invalid config form provided");if(!e.serviceName)throw new Error("Invalid config serviceName provided");return`/kapi/${e.version||"v2"}/${e.isv}/${e.app}/${e.form}/${e.serviceName}`}const n=function(t="GET",a={}){return function(i){if("function"==typeof i){const e=new s(i),n=e.update.bind(e);return e.update=function(e){const i={endpoint:r(e),method:t,...a,...e};return delete i.endpointConfig,e&&"object"==typeof e&&!e.endpoint&&(i.params=e.params||e),n(i)},e}return async function(t,a,i){await e.waitForAuth();const n={endpoint:r(i),method:t,...a,...i};delete n.endpointConfig,i&&"object"==typeof i&&!i.endpoint&&(n.params=i.params||i);return new Promise((t,e)=>{const a=new s(a=>{a.error?e(a.error):t(a)});a.connect(),a.update(n)})}(t,a,i||{})}}("POST");var o=Object.freeze({__proto__:null,AuthManager:t,authManager:e,doFetch:n,initializeAuth:a,isAuthenticated:i});exports.AuthManager=t,exports.authManager=e,exports.doFetch=n,exports.index=o,exports.initializeAuth=a,exports.isAuthenticated=i;
|
package/dist/index-D_DekteB.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
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};
|