@tangle-js/ld-proofs
Version:
Linked Data Proofs on the Tangle. Powered by IOTA Identity & IOTA Streams
57 lines • 4.44 kB
JavaScript
/* eslint-disable jsdoc/require-jsdoc */
import fetch from "node-fetch";
const JSON = "application/json";
const JSON_LD = "application/ld+json";
/**
* JSON-LD @context loader.
*
* @param url The URL of the LD @context.
* @param options Options.
* @returns The LD document and the final URL after following redirects.
*/
export async function customLdContextLoader(url, options) {
const headers = new Headers();
headers.append("accept", `${JSON},${JSON_LD}`);
const response = await fetch(url);
let document;
let documentUrl = url;
if (response.ok) {
const respMimeType = response.headers.get("content-type").toLowerCase();
// If this is not a JSON-LD @context but there is an alternate representation
// which MIME type is JSON-LD we follow our nose
if (respMimeType !== JSON && respMimeType !== JSON_LD) {
// Let's check if there is a Link alternate header
const link = response.headers.get("link");
const components = link.split(";");
if (components[1]?.includes("alternate")) {
// eslint-disable-next-line unicorn/no-lonely-if
if (components[2]?.includes(JSON_LD)) {
const bracketsLinkPath = components[0];
// Remove link's brackets
const extraPath = components[0].slice(1, bracketsLinkPath.length - 1);
// This is the alternate representation
const contextUrl = `${url}${extraPath}`;
// Only the link is followed to the alternate representation if it is a different one
if (contextUrl !== url) {
return customLdContextLoader(contextUrl, {});
}
}
}
}
else {
document = await response.json();
if (response.redirected) {
documentUrl = response.url;
}
}
}
else {
// eslint-disable-next-line no-console
console.error(`The JSON-LD @context ${url} cannot be retrieved`);
}
return {
document,
documentUrl // this is the actual context URL after redirects
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkxkSGVscGVyLm1qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oZWxwZXJzL2pzb25MZEhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3Q0FBd0M7QUFDeEMsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRS9CLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDO0FBQ2hDLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDO0FBRXRDOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQUMsR0FBVyxFQUFFLE9BQU87SUFJNUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUM5QixPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWxDLElBQUksUUFBaUMsQ0FBQztJQUN0QyxJQUFJLFdBQVcsR0FBRyxHQUFHLENBQUM7SUFFdEIsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFO1FBQ2IsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFeEUsNkVBQTZFO1FBQzdFLGdEQUFnRDtRQUNoRCxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLE9BQU8sRUFBRTtZQUNuRCxrREFBa0Q7WUFDbEQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVuQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ3RDLGdEQUFnRDtnQkFDaEQsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNsQyxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkMseUJBQXlCO29CQUN6QixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3RFLHVDQUF1QztvQkFDdkMsTUFBTSxVQUFVLEdBQUcsR0FBRyxHQUFHLEdBQUcsU0FBUyxFQUFFLENBQUM7b0JBQ3hDLHFGQUFxRjtvQkFDckYsSUFBSSxVQUFVLEtBQUssR0FBRyxFQUFFO3dCQUNwQixPQUFPLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztxQkFDaEQ7aUJBQ0o7YUFDSjtTQUNKO2FBQU07WUFDSCxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakMsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFO2dCQUNyQixXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQzthQUM5QjtTQUNKO0tBQ0o7U0FBTTtRQUNILHNDQUFzQztRQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixHQUFHLHNCQUFzQixDQUFDLENBQUM7S0FDcEU7SUFFRCxPQUFPO1FBQ0gsUUFBUTtRQUNSLFdBQVcsQ0FBQyxpREFBaUQ7S0FDaEUsQ0FBQztBQUNOLENBQUMifQ==