@cf-wasm/og
Version:
Generate Open Graph Images dynamically from HTML/CSS without a browser.
54 lines (53 loc) • 1.68 kB
JavaScript
// 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
};