import { Event, Unsubscribe } from 'evnty'; interface Callable { (...args: any[]): Promise; } const CallableFunction = Function as Callable & FunctionConstructor; export class Callbable extends CallableFunction { constructor(func: Function) { super(); return Object.setPrototypeOf(func, new.target.prototype); } } export type MaybePromise = PromiseLike | T; export interface ApidlyRequest extends Omit { params: Partial; data?: Data; headers: Headers; } export interface ApidlyResponse extends Response { data: Output; } export interface RetryStrategy { (times: number): number; } export interface RequestType { (url: URL, request: ApidlyRequest): MaybePromise; } export interface ResponseType { (response: ApidlyResponse, url: URL, request: ApidlyRequest): MaybePromise; } export interface RequestMiddleware { (url: URL, request: ApidlyRequest): MaybePromise; } export interface ResponseMiddleware { (response: ApidlyResponse, url: URL, request: ApidlyRequest): MaybePromise; } export interface Middlewares { request: RequestMiddleware[]; response: ResponseMiddleware[]; } export interface MiddleWired { request(middleware: RequestMiddleware): this; response(middleware: ResponseMiddleware): this; } export interface Events { start: Event<[URL, ApidlyRequest]>; success: Event<[ApidlyResponse, URL, ApidlyRequest]>; error: Event<[Error, URL, ApidlyRequest]>; done: Event<[URL, ApidlyRequest]>; } export interface EventWired { onStart(listener: (url: URL, request: ApidlyRequest) => any): Unsubscribe; onSuccess(listener: (response: ApidlyResponse, url: URL, request: ApidlyRequest) => any): Unsubscribe; onError(listener: (error: Error, url: URL, request: ApidlyRequest) => any): Unsubscribe; onDone(listener: (url: URL, request: ApidlyRequest) => any): Unsubscribe; } export interface EndpointOptions extends RequestInit { params?: EndpointParams; requestType?: RequestType; responseType?: ResponseType; maxRetries?: number; retryStrategy?: RetryStrategy; } export interface Compile { >(pattern: string): (params: Params) => string; } export interface ClientOptions extends RequestInit { base: string; params?: ClientParams; requestType?: RequestType; responseType?: ResponseType; maxRetries?: number; retryStrategy?: RetryStrategy; } export interface RequestOptions extends RequestInit { data?: Data; params?: Params; requestType?: RequestType; responseType?: ResponseType; maxRetries?: number; retryStrategy?: RetryStrategy; }