UNPKG

whale-plus

Version:

A Component Library for Vue 3

1 lines 10.7 kB
{"version":3,"file":"requestManager.mjs","sources":["../../../../../packages/request/request-core/requestManager.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash-es';\nimport { useCache } from '../request-cache';\nimport {\n defaultRequestOptions,\n getDefaultCacheOptions,\n} from './requestOptions';\nimport { actualErrorRetryInterval } from './utils';\nimport type { CacheManager } from '../request-cache';\nimport type { Requestor } from './requestor';\nimport type {\n CacheOptions,\n RequestOptions,\n RequestOptionsType,\n} from './requestOptions';\nimport type { RequestInterceptor } from './interceptors';\n\nclass WhaleRequest implements Requestor {\n private client: Requestor;\n\n static create(client: Requestor) {\n return new WhaleRequest(client);\n }\n\n constructor(client: Requestor) {\n this.client = client;\n }\n\n private async applyRequestInterceptors(\n options: Promise<RequestOptions>\n ): Promise<RequestOptions> {\n return this.applyInterceptors(options, this.client.requestInterceptors);\n }\n\n private async applyResponseInterceptors(\n options: Promise<RequestOptions>\n ): Promise<RequestOptions> {\n return this.applyInterceptors(options, this.client.responseInterceptors);\n }\n\n private async applyInterceptors(\n options: Promise<RequestOptions>,\n interceptors?: RequestInterceptor[]\n ): Promise<RequestOptions> {\n if (interceptors) {\n interceptors?.forEach((interceptor) => {\n options = options.then(interceptor);\n });\n }\n return options;\n }\n\n private async applyErrorInterceptors(error: any): Promise<any> {\n if (this.client.errorInterceptors) {\n for (const interceptor of this.client.errorInterceptors) {\n error = await interceptor(error);\n }\n }\n return Promise.reject(error);\n }\n\n private async getCachedResponse(\n requestCache: CacheManager | undefined,\n options: RequestOptions,\n cacheOptions: CacheOptions\n ): Promise<RequestOptions | undefined> {\n if (!requestCache || !cacheOptions) return undefined;\n if (!requestCache.has(cacheOptions.key!(options))) {\n return undefined;\n }\n const key = cacheOptions.key!(options);\n if (cacheOptions.isValid) {\n if (cacheOptions.isValid(key, options)) {\n return requestCache.getNormal(key);\n }\n } else {\n return requestCache.get(key);\n }\n return undefined;\n }\n\n private async applyCache(\n chain: Promise<RequestOptions>,\n options: RequestOptions,\n method: RequestOptionsType\n ): Promise<RequestOptions> {\n const cacheOptions: CacheOptions =\n options?.cache || getDefaultCacheOptions();\n const requestCache: CacheManager = useCache(cacheOptions.isPersist!);\n\n const requestFunc = async () => {\n try {\n const response = await method(options);\n\n if (cacheOptions && requestCache && options.useCache) {\n requestCache.set(\n cacheOptions.key!(options),\n response,\n cacheOptions.duration\n );\n }\n return response;\n } catch (error) {\n if (options.retry && options.retry > 0) {\n throw error;\n } else {\n await this.applyErrorInterceptors(error);\n }\n }\n };\n\n if (options?.useCache) {\n const cachedResponse = await this.getCachedResponse(\n requestCache,\n options,\n cacheOptions\n );\n if (cachedResponse) {\n // 返回缓存数据\n chain = chain.then(async () => {\n return Promise.resolve(cachedResponse as RequestOptions);\n });\n return chain;\n }\n }\n\n if (options?.retry && options.retry > 0) {\n chain = this.retry<RequestOptions>(\n requestFunc,\n options.retry,\n options.retryInterval\n ? options.retryInterval\n : actualErrorRetryInterval(options.retry)\n );\n } else {\n chain = chain.then(requestFunc);\n }\n return chain;\n }\n\n private async retry<T>(\n fn: () => Promise<T>,\n retries: number,\n interval: number\n ): Promise<T> {\n let attempts = 0;\n while (attempts < retries) {\n try {\n return await fn();\n } catch (error) {\n attempts++;\n if (attempts >= retries) {\n await this.applyErrorInterceptors(error);\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n }\n throw new Error('Exceeded maximum retries');\n }\n\n private async request(method: RequestOptionsType, options: RequestOptions) {\n // 参数归一化\n options = this.normalizeOptions(options);\n\n let chain = Promise.resolve(options);\n\n // 依次应用请求拦截器\n chain = this.applyRequestInterceptors(chain);\n\n // 缓存管理\n chain = this.applyCache(chain, options, method);\n\n // 依次应用响应拦截器\n chain = this.applyResponseInterceptors(chain);\n\n return chain;\n }\n\n private normalizeOptions(options: RequestOptions): RequestOptions {\n return defaultsDeep(options, defaultRequestOptions);\n }\n\n get(options: RequestOptions) {\n return this.request(this.client.get, options);\n }\n\n async post(options: RequestOptions) {\n return this.request(this.client.post, options);\n }\n}\n\n// 本模块的大部分功能都需要使用到requestor\nexport let whaleRequest: WhaleRequest;\n\nexport function inject(requestor: Requestor) {\n whaleRequest = WhaleRequest.create(requestor);\n}\n\nexport function useRequestor(): Requestor {\n return whaleRequest;\n}\n\nexport function setGlobalOptions(options: RequestOptions) {\n Object.keys(options).forEach((key) => {\n (defaultRequestOptions as any)[key] = (options as any)[key];\n });\n}\n\nexport default WhaleRequest;\n"],"names":[],"mappings":"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"}