diff --git a/src/serve_rendered.js b/src/serve_rendered.js index 3dc3cd5..0a00d49 100644 --- a/src/serve_rendered.js +++ b/src/serve_rendered.js @@ -1028,10 +1028,11 @@ export const serve_rendered = { * @param {object} params Parameters object. * @param {string} id ID of the item. * @param {object} programOpts - An object containing the program options + * @param {object} style pre-fetched/read StyleJSON object. * @param {Function} dataResolver Function to resolve data. * @returns {Promise} */ - add: async function (options, repo, params, id, programOpts, dataResolver) { + add: async function (options, repo, params, id, programOpts, style, dataResolver) { const map = { renderers: [], renderersStatic: [], @@ -1041,7 +1042,7 @@ export const serve_rendered = { const { publicUrl, verbose } = programOpts; - let styleJSON; + const styleJSON = clone(style); /** * Creates a pool of renderers. * @param {number} ratio Pixel ratio @@ -1230,12 +1231,6 @@ export const serve_rendered = { const styleFile = params.style; const styleJSONPath = path.resolve(options.paths.styles, styleFile); - try { - styleJSON = JSON.parse(await fsp.readFile(styleJSONPath)); - } catch (e) { - console.log('Error parsing style file'); - return false; - } if (styleJSON.sprite) { if (!Array.isArray(styleJSON.sprite)) { diff --git a/src/serve_style.js b/src/serve_style.js index ba6d0c8..250a4eb 100644 --- a/src/serve_style.js +++ b/src/serve_style.js @@ -12,6 +12,7 @@ import { allowedSpriteFormats, fixUrl, readFile, + isValidHttpUrl, } from './utils.js'; const httpTester = /^https?:\/\//i; @@ -196,6 +197,7 @@ export const serve_style = { * @param {object} params Parameters object containing style path * @param {string} id ID of the style. * @param {object} programOpts - An object containing the program options + * @param {object} style pre-fetched/read StyleJSON object. * @param {Function} reportTiles Function for reporting tile sources. * @param {Function} reportFont Function for reporting font usage * @returns {Promise} true if add is successful @@ -206,27 +208,13 @@ export const serve_style = { params, id, programOpts, + style, reportTiles, reportFont, ) { const { publicUrl } = programOpts; - const styleFile = path.resolve(options.paths.styles, params.style); - - let styleFileData; - try { - styleFileData = await fs.promises.readFile(styleFile); - } catch (e) { - console.log(`Error reading style file "${params.style}"`); - return false; - } - - let styleJSON; - try { - styleJSON = JSON.parse(styleFileData); - } catch (e) { - console.log(`Error parsing style JSON from "${params.style}"`); - return false; - } + const styleFile = path.resolve(options.paths.styles, params.style) + const styleJSON = clone(style); const validationErrors = validateStyleMin(styleJSON); if (validationErrors.length > 0) { diff --git a/src/server.js b/src/server.js index b619e0c..e5bc96b 100644 --- a/src/server.js +++ b/src/server.js @@ -182,6 +182,26 @@ async function start(opts) { */ async function addStyle(id, item, allowMoreData, reportFonts) { let success = true; + + let styleJSON; + try { + if (isValidHttpUrl(item.style)){ + const res = await fetch(item.style); + if (!res.ok) { + throw new Error(`fetch error ${res.status}`); + } + styleJSON = await res.json(); + + } else { + const styleFile = path.resolve(options.paths.styles, item.style); + const styleFileData = await fs.promises.readFile(styleFile); + styleJSON = JSON.parse(styleFileData); + } + } catch (e) { + console.log(`Error getting style file "${item.style}"`); + return false; + } + if (item.serve_data !== false) { success = await serve_style.add( options, @@ -189,6 +209,7 @@ async function start(opts) { item, id, opts, + styleJSON, (styleSourceId, protocol) => { let dataItemId; for (const id of Object.keys(data)) { @@ -246,6 +267,7 @@ async function start(opts) { item, id, opts, + styleJSON, function dataResolver(styleSourceId) { let fileType; let inputFile;