@tkrotoff/fetch
Version:
Fetch wrapper
245 lines (237 loc) • 7.71 kB
JavaScript
;
function entriesToObject(object) {
return Object.fromEntries(object.entries());
}
class HttpError extends Error {
constructor(request, response) {
const { status, statusText } = response;
super(statusText || String(status));
this.name = 'HttpError';
this.request = request;
this.response = response;
}
}
const arrayBufferMimeType = '*/*';
const blobMimeType = '*/*';
const formDataMimeType = 'multipart/form-data';
const jsonMimeType = 'application/json';
const textMimeType = 'text/*';
function isJSONResponse(response) {
var _a;
const contentType = (_a = response.headers.get('content-type')) !== null && _a !== void 0 ? _a : '';
return contentType.includes(jsonMimeType);
}
function extendResponsePromiseWithBodyMethods$1(responsePromise, headers) {
function setAcceptHeader(mimeType) {
var _a;
headers.set('accept', (_a = headers.get('accept')) !== null && _a !== void 0 ? _a : mimeType);
}
responsePromise.arrayBuffer = async () => {
setAcceptHeader(arrayBufferMimeType);
const response = await responsePromise;
return response.arrayBuffer();
};
responsePromise.blob = async () => {
setAcceptHeader(blobMimeType);
const response = await responsePromise;
return response.blob();
};
responsePromise.formData = async () => {
setAcceptHeader(formDataMimeType);
const response = await responsePromise;
return response.formData();
};
responsePromise.json = async () => {
setAcceptHeader(jsonMimeType);
const response = await responsePromise;
if (isJSONResponse(response)) {
return response.json();
}
return response.text();
};
responsePromise.text = async () => {
setAcceptHeader(textMimeType);
const response = await responsePromise;
return response.text();
};
}
const defaults = {
init: {}
};
function request(input, headers, init, method, body) {
async function _fetch() {
await Promise.resolve();
const req = new Request(input, {
...defaults.init,
...init,
headers,
method,
body
});
const res = await fetch(req);
if (!res.ok)
throw new HttpError(req, res);
return res;
}
const responsePromise = _fetch();
extendResponsePromiseWithBodyMethods$1(responsePromise, headers);
return responsePromise;
}
function getHeaders(init) {
const defaultInitHeaders = entriesToObject(new Headers(defaults.init.headers));
const initHeaders = entriesToObject(new Headers(init === null || init === void 0 ? void 0 : init.headers));
return new Headers({ ...defaultInitHeaders, ...initHeaders });
}
function getJSONHeaders(init) {
const headers = getHeaders(init);
headers.set('content-type', jsonMimeType);
return headers;
}
function get(input, init) {
return request(input, getHeaders(init), init, 'GET');
}
function post(input, body, init) {
return request(input, getHeaders(init), init, 'POST', body);
}
function postJSON(input, body, init) {
return request(input, getJSONHeaders(init), init, 'POST', JSON.stringify(body));
}
function put(input, body, init) {
return request(input, getHeaders(init), init, 'PUT', body);
}
function putJSON(input, body, init) {
return request(input, getJSONHeaders(init), init, 'PUT', JSON.stringify(body));
}
function patch(input, body, init) {
return request(input, getHeaders(init), init, 'PATCH', body);
}
function patchJSON(input, body, init) {
return request(input, getJSONHeaders(init), init, 'PATCH', JSON.stringify(body));
}
function del(input, init) {
return request(input, getHeaders(init), init, 'DELETE');
}
function createHttpError(body, status, statusText) {
return new HttpError(undefined, new Response(body, {
status,
statusText
}));
}
function createJSONHttpError(body, status, statusText) {
return new HttpError(undefined, new Response(JSON.stringify(body), {
status,
statusText,
headers: { 'content-type': jsonMimeType }
}));
}
function extendResponsePromiseWithBodyMethods(responsePromise, response) {
['arrayBuffer', 'blob', 'formData', 'json', 'text'].forEach(methodName => {
responsePromise[methodName] = () => new Promise((resolve, reject) => {
if (response.ok) {
resolve(response[methodName]());
}
else {
responsePromise.catch(() => {
});
reject(new HttpError(undefined, response));
}
});
});
}
function createResponsePromise(body, init) {
const response = new Response(body, init);
const responsePromise = new Promise((resolve, reject) => {
if (response.ok) {
resolve(response);
}
else {
reject(new HttpError(undefined, response));
}
});
extendResponsePromiseWithBodyMethods(responsePromise, response);
return responsePromise;
}
function createJSONResponsePromise(body, init) {
return createResponsePromise(JSON.stringify(body), init);
}
const HttpStatus = {
_100_Continue: 100,
_101_SwitchingProtocols: 101,
_102_Processing: 102,
_103_EarlyHints: 103,
_200_OK: 200,
_201_Created: 201,
_202_Accepted: 202,
_203_NonAuthoritativeInformation: 203,
_204_NoContent: 204,
_205_ResetContent: 205,
_206_PartialContent: 206,
_207_MultiStatus: 207,
_208_AlreadyReported: 208,
_226_IMUsed: 226,
_300_MultipleChoices: 300,
_301_MovedPermanently: 301,
_302_Found: 302,
_303_SeeOther: 303,
_304_NotModified: 304,
_305_UseProxy: 305,
_307_TemporaryRedirect: 307,
_308_PermanentRedirect: 308,
_400_BadRequest: 400,
_401_Unauthorized: 401,
_402_PaymentRequired: 402,
_403_Forbidden: 403,
_404_NotFound: 404,
_405_MethodNotAllowed: 405,
_406_NotAcceptable: 406,
_407_ProxyAuthenticationRequired: 407,
_408_RequestTimeout: 408,
_409_Conflict: 409,
_410_Gone: 410,
_411_LengthRequired: 411,
_412_PreconditionFailed: 412,
_413_PayloadTooLarge: 413,
_414_URITooLong: 414,
_415_UnsupportedMediaType: 415,
_416_RangeNotSatisfiable: 416,
_417_ExpectationFailed: 417,
_421_MisdirectedRequest: 421,
_422_UnprocessableEntity: 422,
_423_Locked: 423,
_424_FailedDependency: 424,
_425_TooEarly: 425,
_426_UpgradeRequired: 426,
_428_PreconditionRequired: 428,
_429_TooManyRequests: 429,
_431_RequestHeaderFieldsTooLarge: 431,
_451_UnavailableForLegalReasons: 451,
_500_InternalServerError: 500,
_501_NotImplemented: 501,
_502_BadGateway: 502,
_503_ServiceUnavailable: 503,
_504_GatewayTimeout: 504,
_505_HTTPVersionNotSupported: 505,
_506_VariantAlsoNegotiates: 506,
_507_InsufficientStorage: 507,
_508_LoopDetected: 508,
_510_NotExtended: 510,
_511_NetworkAuthenticationRequired: 511,
_420_MethodFailure: 420
};
exports.HttpError = HttpError;
exports.HttpStatus = HttpStatus;
exports.createHttpError = createHttpError;
exports.createJSONHttpError = createJSONHttpError;
exports.createJSONResponsePromise = createJSONResponsePromise;
exports.createResponsePromise = createResponsePromise;
exports.defaults = defaults;
exports.del = del;
exports.get = get;
exports.isJSONResponse = isJSONResponse;
exports.jsonMimeType = jsonMimeType;
exports.patch = patch;
exports.patchJSON = patchJSON;
exports.post = post;
exports.postJSON = postJSON;
exports.put = put;
exports.putJSON = putJSON;