UNPKG

@ideal-postcodes/core-axios

Version:

Axios based client for api.ideal-postcodes.co.uk

92 lines (91 loc) 2.56 kB
import Axios from "axios"; import { errors, } from "@ideal-postcodes/core-interface"; const { /** * Ideal Postcodes base error class implemented in [core-interface](https://core-interface.ideal-postcodes.dev/classes/idealpostcodeserror.html) */ IdealPostcodesError, } = errors; /** * Converts a Got header object to one that can be used by the client * * @hidden */ export const toHeader = (gotHeaders) => Object.keys(gotHeaders).reduce((headers, key) => { const val = gotHeaders[key]; if (typeof val === "string") { headers[key] = val; } else if (Array.isArray(val)) { headers[key] = val.join(","); } return headers; }, {}); /** * Adapts got responses to a format consumable by core-interface * * @hidden */ const toHttpResponse = (httpRequest, response) => ({ httpRequest, body: response.data, httpStatus: response.status || 0, header: toHeader(response.headers), metadata: { response }, }); /** * Catch non-response errors (e.g. network failure, DNS failure, timeout) * wrap in our Error class and return * * @hidden */ const handleError = (error) => { const idpcError = new IdealPostcodesError({ message: `[${error.name}] ${error.message}`, httpStatus: 0, metadata: { axios: error }, }); return Promise.reject(idpcError); }; // Don't throw errors for any HTTP status code // Allow core-interface to absorb these and emit own errors const validateStatus = () => true; /** * Agent * * @hidden */ export class Agent { constructor() { this.Axios = Axios.create({ validateStatus }); } requestWithBody(httpRequest) { const { body, method, timeout, url, header, query } = httpRequest; return this.Axios.request({ url, method, headers: header, params: query, data: body, timeout, }) .then((response) => toHttpResponse(httpRequest, response)) .catch(handleError); } request(httpRequest) { const { method, timeout, url, header, query } = httpRequest; return this.Axios.request({ url, method, headers: header, params: query, timeout, }) .then((response) => toHttpResponse(httpRequest, response)) .catch(handleError); } http(httpRequest) { if (httpRequest.body !== undefined) return this.requestWithBody(httpRequest); return this.request(httpRequest); } }