UNPKG

ketting

Version:

Opiniated HATEAOS / Rest client.

80 lines 2.67 kB
"use strict"; 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