index.d.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /// <reference types="node" />
  2. import type {IncomingHttpHeaders} from 'http'
  3. import type {IncomingMessage} from 'http'
  4. import type {ProgressStream} from 'progress-stream'
  5. import type {UrlWithStringQuery} from 'url'
  6. /** @public */
  7. export declare const adapter: RequestAdapter
  8. /** @public */
  9. export declare type ApplyMiddleware = <T extends keyof MiddlewareHooks>(
  10. hook: T,
  11. value: MiddlewareHooks[T] extends (defaultValue: infer V, ...rest: any[]) => any ? V : never,
  12. ...args: MiddlewareHooks[T] extends (defaultValue: any, ...rest: infer P) => any ? P : never
  13. ) => ReturnType<MiddlewareHooks[T]>
  14. /** @public */
  15. export declare type DefineApplyMiddleware = (middleware: MiddlewareReducer) => ApplyMiddleware
  16. /** @public */
  17. export declare const environment: ExportEnv
  18. /**
  19. * Reports the environment as either "node" or "browser", depending on what entry point was used to aid bundler debugging.
  20. * If 'browser' is used, then the globally available `fetch` class is used. While `node` will always use either `node:https` or `node:http` depending on the protocol.
  21. * @public
  22. */
  23. export declare type ExportEnv = 'node' | 'react-server' | 'browser'
  24. /** @public */
  25. export declare interface FinalizeNodeOptionsPayload extends UrlWithStringQuery {
  26. method: RequestOptions['method']
  27. headers: RequestOptions['headers']
  28. maxRedirects: RequestOptions['maxRedirects']
  29. agent?: any
  30. cert?: any
  31. key?: any
  32. ca?: any
  33. }
  34. /** @public */
  35. export declare const getIt: (initMiddleware?: Middlewares, httpRequest?: HttpRequest) => Requester
  36. /** @public */
  37. export declare type HookOnRequestEvent = HookOnRequestEventNode | HookOnRequestEventBrowser
  38. /** @public */
  39. export declare interface HookOnRequestEventBase {
  40. options: RequestOptions
  41. context: HttpContext
  42. request: any
  43. }
  44. /** @public */
  45. export declare interface HookOnRequestEventBrowser extends HookOnRequestEventBase {
  46. adapter: Omit<RequestAdapter, 'node'>
  47. progress?: undefined
  48. }
  49. /** @public */
  50. export declare interface HookOnRequestEventNode extends HookOnRequestEventBase {
  51. adapter: 'node'
  52. progress: any
  53. }
  54. /** @public */
  55. export declare interface HttpContext {
  56. options: RequestOptions
  57. channels: MiddlewareChannels
  58. applyMiddleware: ApplyMiddleware
  59. }
  60. /**
  61. * request-node in node, browser-request in browsers
  62. * @public
  63. */
  64. export declare type HttpRequest = (
  65. context: HttpContext,
  66. callback: (err: Error | null, response?: MiddlewareResponse) => void,
  67. ) => HttpRequestOngoing
  68. /** @public */
  69. export declare interface HttpRequestOngoing {
  70. abort: () => void
  71. }
  72. /** @public */
  73. export declare type Middleware = Partial<MiddlewareHooks>
  74. /** @public */
  75. export declare interface MiddlewareChannels {
  76. request: PubSub<HttpContext>
  77. response: PubSub<unknown>
  78. progress: PubSub<unknown>
  79. error: PubSub<unknown>
  80. abort: PubSub<void>
  81. }
  82. /** @public */
  83. export declare type MiddlewareHookName = keyof MiddlewareHooks
  84. /** @public */
  85. export declare interface MiddlewareHooks {
  86. processOptions: (options: RequestOptions) => RequestOptions
  87. validateOptions: (options: RequestOptions) => void | undefined
  88. interceptRequest: (
  89. prevValue: MiddlewareResponse | undefined,
  90. event: {
  91. adapter: RequestAdapter
  92. context: HttpContext
  93. },
  94. ) => MiddlewareResponse | undefined | void
  95. finalizeOptions: (
  96. options: FinalizeNodeOptionsPayload | RequestOptions,
  97. ) => FinalizeNodeOptionsPayload | RequestOptions
  98. onRequest: (evt: HookOnRequestEvent) => void
  99. onResponse: (response: MiddlewareResponse, context: HttpContext) => MiddlewareResponse
  100. onError: (err: Error | null, context: HttpContext) => any
  101. onReturn: (channels: MiddlewareChannels, context: HttpContext) => any
  102. onHeaders: (
  103. response: IncomingMessage,
  104. evt: {
  105. headers: IncomingHttpHeaders
  106. adapter: RequestAdapter
  107. context: HttpContext
  108. },
  109. ) => ProgressStream
  110. }
  111. /** @public */
  112. export declare type MiddlewareReducer = {
  113. [T in keyof MiddlewareHooks]: ((
  114. ...args: Parameters<MiddlewareHooks[T]>
  115. ) => ReturnType<MiddlewareHooks[T]>)[]
  116. }
  117. /** @public */
  118. export declare interface MiddlewareRequest {}
  119. /** @public */
  120. export declare interface MiddlewareResponse {
  121. body: any
  122. url: string
  123. method: string
  124. headers: any
  125. statusCode: number
  126. statusMessage: string
  127. }
  128. /** @public */
  129. export declare type Middlewares = Middleware[]
  130. /** @public */
  131. export declare interface PubSub<Message> {
  132. publish: (message: Message) => void
  133. subscribe: (subscriber: Subscriber<Message>) => () => void
  134. }
  135. /**
  136. * Reports the request adapter in use. `node` is only available if `ExportEnv` is also `node`.
  137. * When `ExportEnv` is `browser` then the adapter can be either `xhr` or `fetch`.
  138. * In the future `fetch` will be available in `node` as well.
  139. * @public
  140. */
  141. export declare type RequestAdapter = 'node' | 'xhr' | 'fetch'
  142. /** @public */
  143. export declare type Requester = {
  144. use: (middleware: Middleware) => Requester
  145. clone: () => Requester
  146. (options: RequestOptions | string): any
  147. }
  148. /** @public */
  149. export declare interface RequestOptions {
  150. url: string
  151. body?: any
  152. bodySize?: number
  153. cancelToken?: any
  154. compress?: boolean
  155. headers?: any
  156. maxRedirects?: number
  157. maxRetries?: number
  158. method?: string
  159. proxy?: any
  160. query?: any
  161. rawBody?: boolean
  162. shouldRetry?: any
  163. stream?: boolean
  164. timeout?: any
  165. tunnel?: boolean
  166. debug?: any
  167. requestId?: number
  168. attemptNumber?: number
  169. withCredentials?: boolean
  170. /**
  171. * Enables using the native `fetch` API instead of the default `http` module, and allows setting its options like `cache`
  172. */
  173. fetch?: boolean | Omit<RequestInit, 'method'>
  174. /**
  175. * Some frameworks have special behavior for `fetch` when an `AbortSignal` is used, and may want to disable it unless userland specifically opts-in.
  176. */
  177. useAbortSignal?: boolean
  178. }
  179. /** @public */
  180. export declare interface RetryOptions {
  181. shouldRetry: (err: any, num: number, options: any) => boolean
  182. maxRetries?: number
  183. retryDelay?: (attemptNumber: number) => number
  184. }
  185. /** @public */
  186. export declare interface Subscriber<Event> {
  187. (event: Event): void
  188. }
  189. export {}