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.
34 lines (33 loc) • 1.43 kB
JavaScript
import { extractMetadataFromHtml } from '../collect.js';
import { loadUserConfig } from '../generate.js';
import { ogPathToPagePath, DEFAULT_OG_PATH_PREFIX } from '../paths.js';
import { renderOgImage } from '../render.js';
export async function connectOgImagesGenerator(options) {
let config = options?.configReloader
? null
: await loadUserConfig();
const prefix = options?.pathPrefix ?? DEFAULT_OG_PATH_PREFIX;
return async (request, res, next) => {
if (options?.configReloader)
config = await options.configReloader();
if (!config)
return next();
if (!request.url)
return next();
if (request.url.startsWith(prefix) === false)
return next();
const base = 'http://' + request.rawHeaders[request.rawHeaders.indexOf('Host') + 1];
const path = ogPathToPagePath(request.url, options?.pathPrefix, options?.trailingSlash);
const pageUrl = new URL(path, base).href;
const fetched = await fetch(pageUrl);
const associatedPageHtml = await fetched.text();
const meta = extractMetadataFromHtml(associatedPageHtml);
const image = await renderOgImage(config, { path, meta });
res.setHeader('Content-Type', 'image/png');
// HACK:
await new Promise((resolve) => setTimeout(() => {
res.end(image);
resolve();
}, 0));
};
}