UNPKG

nodesi

Version:
71 lines (56 loc) 1.94 kB
'use strict'; const url = require('url'); module.exports = function DataProvider(config) { const pendingReqests = new Map(); config = config || {}; const baseUrl = config.baseUrl || ''; const httpClient = config.httpClient || globalThis.fetch; const userAgent = config.userAgent || 'node-esi'; const defaultHeaders = { Accept: 'text/html, application/xhtml+xml, application/xml', 'user-agent': userAgent, }; function extendRequestOptions(src, baseOptions) { return [ toFullyQualifiedURL(src, baseOptions), { ...baseOptions, headers: Object.assign({}, defaultHeaders, baseOptions.headers), }, ]; } function toFullyQualifiedURL(urlOrPath, baseOptions) { if (urlOrPath.indexOf('http') === 0) { return urlOrPath; } const base = baseOptions ? baseOptions.baseUrl || baseUrl : baseUrl; return url.resolve(base, urlOrPath); } function get(src, baseOptions) { const [resource, options] = extendRequestOptions( src, baseOptions || {} ); if (pendingReqests.has(resource)) { return pendingReqests.get(resource); } pendingReqests.set( resource, httpClient(resource, options) .then((response) => { if (response.status >= 400) { throw new Error( `HTTP error ${response.status}: ${response.statusText}` ); } return response.text(); }) .finally((text) => { pendingReqests.delete(resource); return text; }) ); return pendingReqests.get(resource); } return { toFullyQualifiedURL, get }; };