ketting
Version:
Opiniated HATEAOS / Rest client.
80 lines • 2.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Fetcher = void 0;
const error_1 = require("./error");
require("./fetch-polyfill");
/**
* The fetcher object is responsible for calling fetch()
*
* This is wrapped in an object because we want to support
* 'fetch middlewares'. These middlewares are similar to server-side
* middlewares and can intercept requests and alter requests/responses.
*/
class Fetcher {
constructor() {
this.middlewares = [];
this.advertiseKetting = true;
}
/**
* A wrapper for MDN fetch()
*
* This wrapper supports 'fetch middlewares'. It will call them
* in sequence.
*/
fetch(resource, init) {
const request = new Request(resource, init);
const origin = new URL(request.url).origin;
const mws = this.getMiddlewaresByOrigin(origin);
mws.push((innerRequest) => {
if (!innerRequest.headers.has('User-Agent') && this.advertiseKetting) {
// eslint-disable-next-line @typescript-eslint/no-var-requires
innerRequest.headers.set('User-Agent', 'Ketting/' + require('../../package.json').version);
}
return fetch(innerRequest);
});
return invokeMiddlewares(mws, request);
}
/**
* Returns the list of middlewares that are applicable to
* a specific origin
*/
getMiddlewaresByOrigin(origin) {
return this.middlewares.filter(([regex, middleware]) => {
return regex.test(origin);
}).map(([regex, middleware]) => {
return middleware;
});
}
/**
* Add a middleware
*/
use(mw, origin = '*') {
const matchSplit = origin.split('*');
const matchRegex = matchSplit.map(part => part.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('(.*)');
const regex = new RegExp('^' + matchRegex + '$');
this.middlewares.push([regex, mw]);
}
/**
* Does a HTTP request and throws an exception if the server emitted
* a HTTP error.
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/Request/Request
*/
async fetchOrThrow(resource, init) {
const response = await this.fetch(resource, init);
if (response.ok) {
return response;
}
else {
throw await error_1.default(response);
}
}
}
exports.Fetcher = Fetcher;
exports.default = Fetcher;
function invokeMiddlewares(mws, request) {
return mws[0](request, (nextRequest) => {
return invokeMiddlewares(mws.slice(1), nextRequest);
});
}
//# sourceMappingURL=fetcher.js.map