request overview

Request module: defines the appy’s base types and functions.

Note:: this module has been designed for internal use; please prefer the re-exported version of appy/index.

Added in v4.0.0


Table of contents


Error

Err (type alias)

Err encodes the two kind of error that can be generated by Req: a RequestError or a ResponseError.

Signature

export type Err = RequestError | ResponseError

Added in v4.0.0

RequestError (interface)

RequestError represents a request error. It carries the generated Error and the input of the request (RequestInfoInit tuple).

Signature

export interface RequestError {
  type: 'RequestError'
  error: Error
  input: RequestInfoInit
}

Added in v4.0.0

ResponseError (interface)

ResponseError represents a response error. It carriess the generated Error, the original Response object and the request’s input (optional).

Signature

export interface ResponseError {
  type: 'ResponseError'
  error: Error
  response: Response
  input?: RequestInfoInit
}

Added in v4.0.0

toRequestError

Creates a RequestError object.

Signature

export declare const toRequestError: (error: Error, input: RequestInfoInit) => RequestError

Added in v4.0.0

toResponseError

Creates a ResponseError object.

Signature

export declare const toResponseError: (
  error: Error,
  response: Response,
  input?: RequestInfoInit | undefined
) => ResponseError

Added in v4.0.0

Request

Combinator (type alias)

A combinator is a function to transform/operate on a Req.

Signature

export type Combinator = <A>(req: Req<A>) => Req<A>

Added in v5.1.0

Req (interface)

Req<A> encodes a resource’s request, or rather, an async operation that can fail or return a Resp<A>.

The request is expressed in terms of ReaderTaskEither - a function that takes a ReqInput as parameter and returns a TaskEither - for better composability: we can act on both side of operation (input and output) with the tools provided by fp-ts.

Signature

export interface Req<A> extends ReaderTaskEither<ReqInput, Err, Resp<A>> {}

Added in v4.0.0

ReqInput (type alias)

ReqInput encodes the fetch() parameters: a single RequestInfo (simple string or Request object) or a tuple of RequestInfo and RequestInit (the object containing request’s options, that it’s optional in the original fetch() API).

Signature

export type ReqInput = RequestInfo | RequestInfoInit

Added in v4.0.0

RequestInfoInit (type alias)

An alias for a tuple of RequesInfo and RequestInit (a.k.a. the fetch() parameters).

Signature

export type RequestInfoInit = [RequestInfo, RequestInit]

Added in v4.0.0

normalizeReqInput

Normalizes the input of a Req to a RequestInfoInit tuple even when only a single RequestInfo is provided.

Signature

export declare const normalizeReqInput: (input: ReqInput) => RequestInfoInit

Added in v4.0.0

Response

Resp (interface)

Resp<A> is an object that carries the original Response from a fetch() call, the actual retrieved data (of type A) and the request’s input (optional).

Signature

export interface Resp<A> {
  response: Response
  data: A
  input?: RequestInfoInit
}

Added in v4.0.0

creators

request

Makes a request using fetch() under the hood.

The data in the returned Resp object is a string because the response’s body can always be converted to text without error (via text() method).

Example:

import { request } from '@contactlab/appy'
import { match } from 'fp-ts/Either'

// Default method is GET like original `fetch()`
const users = request('https://reqres.in/api/users')

users().then(
  match(
    (err) => console.error(err),
    (data) => console.log(data)
  )
)

Signature

export declare const request: Req<string>

Added in v4.0.0

requestAs

Return a Req which will be executed using fetch() under the hood.

The data in the returned Resp object is of the type specified in the type parameter which is one of supported Request methods.

Example:

import { requestAs } from '@contactlab/appy'
import { match } from 'fp-ts/Either'

// Default method is GET like original `fetch()`
const users = requestAs('json')('https://reqres.in/api/users')

users().then(
  match(
    (err) => console.error(err),
    (data) => console.log(data)
  )
)

Signature

export declare const requestAs: <K extends BodyTypeKey>(type: K) => Req<BodyTypeData<K>>

Added in v5.1.0