UNPKG

@cf-wasm/og

Version:

Generate Open Graph Images dynamically from HTML/CSS without a browser.

54 lines (53 loc) 1.68 kB
// src/core/response.ts import { CONTAINER } from "./constants.js"; import { render } from "./render.js"; var BaseResponse = class extends Response { constructor(input, options = {}) { const isSvg = options?.format === "svg"; const result = new ReadableStream({ start(controller) { Promise.resolve(input()).then(([element, renderOptions]) => { const renderer = render(element, renderOptions); return isSvg ? renderer.asSvg() : renderer.asPng(); }).then(({ image }) => { const bytes = typeof image === "string" ? CONTAINER.encoder.encode(image) : image; controller.enqueue(bytes); controller.close(); }).catch((e) => { controller.error(e); }); } }); const headers = new Headers(options?.headers); if (!headers.has("Cache-Control")) { headers.set("Cache-Control", "public, immutable, no-transform, max-age=31536000"); } headers.set("Content-Type", isSvg ? "image/svg+xml" : "image/png"); const responseInit = { headers, status: options?.status, statusText: options?.statusText }; if (options && typeof options === "object") { if ("cf" in options) { Object.assign(responseInit, { cf: options.cf }); } } super(result, responseInit); } }; var ImageResponse = class extends BaseResponse { /** * Creates an instance of {@link ImageResponse} * * @param element The {@link ReactNode} * @param options The {@link ImageResponseOptions} */ constructor(element, options) { super(() => [element, options], options); } }; export { BaseResponse, ImageResponse };