UNPKG

@kth/cortina-block

Version:

Node.js module for fetching Cortina blocks and optionally cache using Redis.

59 lines (58 loc) 2.22 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.fetchAllBlocks = void 0; const log_1 = __importDefault(require("@kth/log")); const mem_cache_1 = require("./mem-cache"); const fetchBlock = async (url, blockName, useMemCache) => { try { const lang = url.split('l=')[1]; const cacheKey = `${blockName}_${lang}`; const cacheHit = useMemCache ? await mem_cache_1.memoryCache.get(cacheKey) : undefined; if (cacheHit) { return { blockName, html: cacheHit }; } const res = await fetch(url); if (!res.ok) { log_1.default.error(`Failed to fetch cortina block at ${url}: ${res.status}`); return { blockName, html: '' }; } const html = await res.text(); if (useMemCache) { mem_cache_1.memoryCache.set(cacheKey, html, 600); } return { blockName, html }; } catch (err) { log_1.default.error(`WARNING! FAILED TO FETCH ${blockName} ${err}`); } }; // Fetch all Cortina blocks from API. const fetchAllBlocks = async (blocksConfig, blockApiUrl, lang, memCache) => { const allblocks = []; for (const blockName in blocksConfig) { const blockId = blocksConfig[blockName]; allblocks.push({ blockName, url: `${blockApiUrl}${blockId}?l=${lang}` }); } return Promise.all(allblocks.map(block => fetchBlock(block.url, block.blockName, memCache))) .then(fetchedBlocks => { const blocksObject = {}; fetchedBlocks.forEach(block => { if (block) { blocksObject[block.blockName] = block.html; } }); return blocksObject; }) .catch(err => { const blockName = err.options ? err.options.uri : 'NO URI FOUND'; log_1.default.error(`WARNING! NO BLOCKS WILL BE LOADED DUE TO ERROR IN ONE OF THE BLOCKS. FIX ALL BROKEN BLOCKS IMMEDIATELY. ATTEMPTED TO LOAD BLOCK: ${blockName}`); throw err; }); }; exports.fetchAllBlocks = fetchAllBlocks;