http-svc
Version:
A HTTP request service for browser and node.js
92 lines (83 loc) • 2.97 kB
text/typescript
import type {
IHttpSvcMiddleware,
IMiddlewareHandler,
IHttpServiceInit,
BuiltInMiddlewareName,
IFetchConfig,
IHttpService,
FetchBaseURL,
IAssembleDispatcher
} from 'types/exports'
import { HttpSvcFetch } from './built-in'
import { ConfigControl } from './control/config'
import { AssembleControl } from './control/assemble'
import { RequestControl } from './control/request'
/**
* HTTP 服务
* 一个基于中间件顺序组织调用的请求框架
*/
export default class HttpService implements IHttpService {
// fetch 中间件,可由外部传入,但须按接口实现,不传入则使用内置fetch中间件
public fetch: IHttpSvcMiddleware | undefined
// 负责装配中间件的控制单元
public assembleCtrl = new AssembleControl(this)
// 负责管理每次请求的中间件配置上下文的控制单元
public configCtrl = new ConfigControl(this)
// 负责发起请求的控制单元
public requestCtrl = new RequestControl(this)
// 全局基本配置:baseURL,用于拼接请求仅传入path时,完善接口地址
public baseURL: FetchBaseURL = '//api.domain.com'
/**
* 初始化
* @param initConfig 初始配置,参考interface
*/
constructor(initConfig?: IHttpServiceInit | IHttpSvcMiddleware[]) {
if (initConfig) {
// 如果是一个数组,认为是请求前(before)的中间件顺序数组
if (Array.isArray(initConfig)) {
// 使用默认中间件
this.fetch = new HttpSvcFetch()
this.register(initConfig)
} else {
// 如果是一个配置对象
const { middlewares, fetch, baseURL } = initConfig
// 可配fetch
this.fetch = fetch || new HttpSvcFetch()
this.register(middlewares || [])
if (baseURL) this.baseURL = baseURL
}
} else {
// 使用默认fetch
this.fetch = new HttpSvcFetch()
this.register([])
}
}
// 注册中间件,调用装配控制
public register(middlewares: IHttpSvcMiddleware[]): void {
this.assembleCtrl.register(middlewares)
}
// 发起请求,调用请求控制
public request<T = any>(config: IFetchConfig): Promise<T> {
return this.requestCtrl.request(config)
}
// 禁用已注册的全局中间件
public disable(middlewareName: BuiltInMiddlewareName | string): IAssembleDispatcher {
return this.assembleCtrl.disable(middlewareName)
}
// 使用临时中间件,可附带载荷
public with(middleware: IHttpSvcMiddleware | IMiddlewareHandler | BuiltInMiddlewareName | string, payload?: any): IAssembleDispatcher {
return this.assembleCtrl.with(middleware, payload)
}
// 设置fetch中间件
public setFetch(fetch: IHttpSvcMiddleware): void {
this.fetch = fetch
this.requestCtrl.reset()
}
// 创建一个实例
public create(config?: IHttpServiceInit): IHttpService {
return new HttpService({
fetch: this.fetch,
...(config || {})
})
}
}