import npmurl from "url"; function loadJSON(url: string, defaultValue: any, cb: (...args: any[]) => void) { fetch(url, { mode: "cors", credentials: "same-origin" }) .then((response) => { if (!response.ok) { throw new Error("Failed to load metadata for " + url); } return response.json(); }) .then((body) => { cb(body); }) .catch(() => { console.warn("Can not load metadata for " + url + ", using default value " + defaultValue); cb(defaultValue); }); } export function downloadGlyphsMetadata(urlTemplate: string, cb: (...args: any[]) => void) { if(!urlTemplate) return cb([]); // Special handling because Tileserver GL serves the fontstacks metadata differently // https://github.com/klokantech/tileserver-gl/pull/104#issuecomment-274444087 const urlObj = npmurl.parse(urlTemplate); const normPathPart = "/%7Bfontstack%7D/%7Brange%7D.pbf"; if(urlObj.pathname === normPathPart) { urlObj.pathname = "/fontstacks.json"; } else { urlObj.pathname = urlObj.pathname!.replace(normPathPart, ".json"); } const url = npmurl.format(urlObj); loadJSON(url, [], cb); } export function downloadSpriteMetadata(baseUrl: string, cb: (...args: any[]) => void) { if(!baseUrl) return cb([]); const url = baseUrl + ".json"; loadJSON(url, {}, glyphs => cb(Object.keys(glyphs))); }