alcaeus
Version:
Hydra Core hypermedia-aware client library
49 lines (48 loc) • 1.75 kB
JavaScript
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;
}