@ideal-postcodes/core-axios
Version:
Axios based client for api.ideal-postcodes.co.uk
92 lines (91 loc) • 2.56 kB
JavaScript
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);
}
}