export type ApiError = { code?: string message: string } type HttpResponsePayload = { status: number headers: Headers } export type HttpResponseOk = HttpResponsePayload & { ok: true body: T } export type HttpResponseError = HttpResponsePayload & { ok: false error: T } export type HttpResponse = HttpResponseOk | HttpResponseError export type Query = Record export type RequestOptions = Omit & { method: string headers?: Record } export type MethodRequestOptions = Omit export type DefaultRequestOptions = Omit export type DefaultRequestOptionsGetter = () => DefaultRequestOptions | Promise export type MiddlewareRequestInfo = { url: string timestamp: string options: Omit & { headers: Headers } } export type HttpResponseMiddleware = ( response: HttpResponse, requestInfo: MiddlewareRequestInfo ) => HttpResponse | Promise> export interface Http { get(url: string, query?: Query, options?: MethodRequestOptions): Promise> post(url: string, body: object, options?: MethodRequestOptions, query?: Query): Promise> put(url: string, body: object, options?: MethodRequestOptions): Promise> remove(url: string, options?: MethodRequestOptions): Promise> patch(url: string, body: object, options?: MethodRequestOptions): Promise> }