integreat-transporter-http
Version:
HTTP transporter for Integreat
94 lines • 3.39 kB
JavaScript
import { HTTPError, } from 'got';
export const dataFromResponse = (response) => typeof response.data === 'string'
? response.data
: response.data === null || response.data === undefined
? undefined
: JSON.stringify(response.data);
export function statusCodeFromResponse(response) {
switch (response.status) {
case 'ok':
case 'noaction':
return 200;
case 'queued':
return 201;
case 'badrequest':
return 400;
case 'autherror':
return 401;
case 'noaccess':
return response.reason === 'noauth' ? 401 : 403;
case 'notfound':
return 404;
case 'timeout':
return 408;
case 'toomany':
return 429;
default:
return 500;
}
}
export const normalizeHeaders = (headers) => headers
? Object.fromEntries(Object.entries(headers)
.filter(([, value]) => value !== undefined)
.map(([key, value]) => [key.toLowerCase(), value]))
: undefined;
export const createResponse = (action, status, data, error, headers) => ({
...action.response,
status,
...(data !== undefined && data !== '' ? { data } : {}),
...(error !== undefined ? { error } : {}),
...(headers ? { headers } : {}),
});
const isGotResponse = (response) => !!response &&
typeof response === 'object' &&
typeof response.statusCode === 'number';
const isGetRequestError = (error) => typeof error.code === 'string';
const getStatusCodeFromError = (error) => isGetRequestError(error) && error.code === 'ETIMEDOUT' ? 408 : undefined;
const extractFromError = (error) => isGotResponse(error)
? [error.statusCode, error.statusMessage, error.body]
: error instanceof HTTPError
? [error.response.statusCode, error.response.statusMessage, undefined]
: error instanceof Error
? [getStatusCodeFromError(error), error.message, undefined]
: [undefined, 'Unknown response', undefined];
function responseStatusFromCode(statusCode) {
switch (statusCode) {
case 400:
return 'badrequest';
case 401:
case 403:
return 'noaccess';
case 404:
return 'notfound';
case 408:
return 'timeout';
case 429:
return 'toomany';
default:
return 'error';
}
}
function errorFromStatus(status, hasAuth, url, statusCode, statusMessage) {
if (statusCode === undefined) {
return `Server returned '${statusMessage}' for ${url}`;
}
else {
switch (status) {
case 'noaccess':
return hasAuth
? `Not authorized (${statusCode})`
: `Service requires authentication (${statusCode})`;
case 'notfound':
return `Could not find the url ${url}`;
default:
return `Server returned ${statusCode} for ${url}`;
}
}
}
export function createResponseWithError(action, url, err) {
const [statusCode, statusMessage, data] = extractFromError(err);
const status = responseStatusFromCode(statusCode);
const error = errorFromStatus(status, !!action.meta?.auth, url, statusCode, statusMessage);
return createResponse(action, status, data, error);
}
//# sourceMappingURL=response.js.map