UNPKG

alcaeus

Version:

Hydra Core hypermedia-aware client library

49 lines (48 loc) 1.75 kB
import li from 'parse-link-header'; import ResponseWrapper from './ResponseWrapper.js'; import { merge } from './helpers/MergeHeaders.js'; import * as Constants from './Constants.js'; function requestAcceptHeaders(sinkMap) { return [...sinkMap.keys()].join(', '); } export default function (_fetch, _Headers) { async function getResponse(effectiveUri, { method = 'get', headers = {}, body, parsers, ...rest }) { const defaultHeaders = { accept: requestAcceptHeaders(parsers), }; const requestInit = { method, ...filterRequestInit(rest), }; if (method.toLowerCase() !== 'get') { requestInit.body = body; } requestInit.headers = merge(new _Headers(defaultHeaders), new _Headers(headers), _Headers); const res = await _fetch(effectiveUri, requestInit); const linkHeaders = res.headers.get(Constants.Headers.Link) || ''; const links = li(linkHeaders) || {}; let jsonLdContext; const context = links[Constants.LinkRelations.context]; if (typeof context !== 'undefined') { jsonLdContext = await _fetch(context.url).then(res => res.json()); } return new ResponseWrapper(effectiveUri, res, parsers, jsonLdContext); } function resource(uri, requestInit) { return getResponse(uri, { method: 'get', ...requestInit, }); } function operation(method, uri, requestInit) { return getResponse(uri, { method, ...requestInit }); } return { resource, operation, }; } function filterRequestInit(arg = {}) { const { headers, body, method, redirect, ...rest } = arg; return rest; }