og-images-generator
Version:
Generate OG images from a static folder and / or a middleware. Extract metadata from HTML pages. No headless browser involved. Comes as a CLI, API or plugins.
49 lines (38 loc) • 1.46 kB
JavaScript
import {
renderOgImage,
loadUserConfig,
extractMetadataFromHtml,
ogPathToPagePath,
DEFAULT_OG_PATH_PREFIX,
} from 'og-images-generator/api';
/**
* @typedef {() => Promise<import('../generate.js').UserConfig>} ConfigReloader
* @param {object} [options]
* @param {string} [options.pathPrefix] - Default: `/og/`
* @param {boolean} [options.trailingSlash] - Default: `true`
* @param {ConfigReloader} [options.configReloader]
* @returns {Promise<import('connect').NextHandleFunction>}
*/
export async function connectOgImagesGenerator(options) {
let config = options?.configReloader ? null : await loadUserConfig();
const prefix = options?.pathPrefix ?? DEFAULT_OG_PATH_PREFIX;
return async (req, res, next) => {
if (options?.configReloader) config = await options.configReloader();
if (!config) return next();
if (!req.url) return next();
if (req.url.startsWith(prefix) === false) return next();
const base = 'http://' + req.rawHeaders[req.rawHeaders.indexOf('Host') + 1];
const path = ogPathToPagePath(
req.url,
options?.pathPrefix,
options?.trailingSlash,
);
const pageUrl = new URL(path, base).href;
const associatedPageHtml = await (await fetch(pageUrl)).text();
const meta = extractMetadataFromHtml(associatedPageHtml);
const image = await renderOgImage(config, { path, meta });
res.setHeader('Content-Type', 'image/png');
// HACK:
await new Promise(() => setTimeout(() => res.end(image), 0));
};
}