@cf-wasm/og
Version:
Generate Open Graph Images dynamically from HTML/CSS without a browser.
60 lines (59 loc) • 2.18 kB
JavaScript
const require_render = require("./render.cjs");
const require_constants = require("./constants.cjs");
//#region src/core/response.ts
function renderAsResponse(input, options) {
const isSvg = options?.format === "svg";
const headers = new Headers(options?.headers);
if (!headers.has("Cache-Control")) if (typeof process === "object" && process !== null && typeof process.env === "object" && process.env !== null && process.env.NODE_ENV === "development") headers.set("Cache-Control", "no-cache, no-store");
else headers.set("Cache-Control", "public, immutable, no-transform, max-age=31536000");
headers.set("Content-Type", isSvg ? "image/svg+xml" : "image/png");
const init = {
headers,
status: options?.status,
statusText: options?.statusText
};
if (options && typeof options === "object" && "cf" in options) Object.assign(init, { cf: options.cf });
const body = async () => {
const [element, renderOptions] = await input();
const renderer = require_render.render(element, renderOptions);
const { image } = isSvg ? await renderer.asSvg() : await renderer.asPng();
return image;
};
const stream = () => {
return new ReadableStream({ start(controller) {
body().then((body) => {
const bytes = typeof body === "string" ? require_constants.CONTAINER.encoder.encode(body) : body;
controller.enqueue(bytes);
controller.close();
}).catch((e) => {
controller.error(e);
});
} });
};
return {
body,
stream,
init
};
}
/** A class for rendering {@link ReactNode} to image as {@link Response} */
var ImageResponse = class extends Response {
/**
* Creates an instance of {@link ImageResponse}
*
* @param element The {@link ReactNode}
* @param options The {@link ImageResponseOptions}
*/
constructor(element, options) {
const { stream, init } = renderAsResponse(() => [element, options], options);
super(stream(), init);
}
static async async(element, options) {
const { body, init } = renderAsResponse(() => [element, options], options);
return new Response(await body(), init);
}
};
//#endregion
exports.ImageResponse = ImageResponse;
exports.renderAsResponse = renderAsResponse;
//# sourceMappingURL=response.cjs.map