UNPKG

lol-html-cf

Version:

Streaming HTML rewriter/parser with CSS selector-based API

219 lines (159 loc) 5.84 kB
# @cf-wasm/photon High-performance Rust image processing library (Photon) for Cloudflare workers, Next.js and Node.js. Powered by [@silvia-odwyer/photon](https://github.com/silvia-odwyer) Build for commit [`b7e57c9`](https://github.com/silvia-odwyer/photon/tree/b7e57c9f05adecf1c9356d6a08f86a34ca08a7d0) Forked on: `3rd May, 2025`. ## Installation ```shell npm install @cf-wasm/photon # npm yarn add @cf-wasm/photon # yarn pnpm add @cf-wasm/photon # pnpm ``` ## Usage - Cloudflare Workers / Pages (Esbuild): ```ts import { PhotonImage } from "@cf-wasm/photon"; ``` - Next.js Edge Runtime (Webpack): ```ts import { PhotonImage } from "@cf-wasm/photon/next"; ``` - Node.js (file base): ```ts import { PhotonImage } from "@cf-wasm/photon/node"; ``` > [!WARNING] > If you are using it on Cloudflare Workers, it's important to be mindful of worker memory limits (typically `128MB`). If you exceed this limit, consider adding image size checks. ## Examples Here are some examples in which image is being resized and converted to webp format: ### Cloudflare Workers If you are using Cloudflare Workers, you can use it as shown below: ```ts // src/index.ts import { PhotonImage, SamplingFilter, resize } from "@cf-wasm/photon"; export default { async fetch() { // url of image to fetch const imageUrl = "https://avatars.githubusercontent.com/u/314135"; // fetch image and get the Uint8Array instance const inputBytes = await fetch(imageUrl) .then((res) => res.arrayBuffer()) .then((buffer) => new Uint8Array(buffer)); // create a PhotonImage instance const inputImage = PhotonImage.new_from_byteslice(inputBytes); // resize image using photon const outputImage = resize( inputImage, inputImage.get_width() * 0.5, inputImage.get_height() * 0.5, SamplingFilter.Nearest ); // get webp bytes const outputBytes = outputImage.get_bytes_webp(); // for other formats // png : outputImage.get_bytes(); // jpeg : outputImage.get_bytes_jpeg(quality); // call free() method to free memory inputImage.free(); outputImage.free(); // return the Response instance return new Response(outputBytes, { headers: { "Content-Type": "image/webp", }, }); }, } satisfies ExportedHandler; ``` ### Next.js (App Router) If you are using Next.js (App router) with edge runtime, you can use it as shown below: ```ts // (src/)app/api/image/route.ts import { type NextRequest } from "next/server"; import { PhotonImage, SamplingFilter, resize } from "@cf-wasm/photon/next"; export const runtime = "edge"; export async function GET(request: NextRequest) { // url of image to fetch const imageUrl = "https://avatars.githubusercontent.com/u/314135"; // fetch image and get the Uint8Array instance const inputBytes = await fetch(imageUrl) .then((res) => res.arrayBuffer()) .then((buffer) => new Uint8Array(buffer)); // create a PhotonImage instance const inputImage = PhotonImage.new_from_byteslice(inputBytes); // resize image using photon const outputImage = resize( inputImage, inputImage.get_width() * 0.5, inputImage.get_height() * 0.5, SamplingFilter.Nearest ); // get webp bytes const outputBytes = outputImage.get_bytes_webp(); // for other formats // png : outputImage.get_bytes(); // jpeg : outputImage.get_bytes_jpeg(quality); // call free() method to free memory inputImage.free(); outputImage.free(); // return the Response instance return new Response(outputBytes, { headers: { "Content-Type": "image/webp", }, }); } ``` ### Next.js (Pages Router) If you are using Next.js (Pages router) with edge runtime, you can use it as shown below: ```ts // (src/)pages/api/image.ts import { type NextRequest } from "next/server"; import { PhotonImage, SamplingFilter, resize } from "@cf-wasm/photon/next"; export const config = { runtime: "edge", // see https://nextjs.org/docs/messages/edge-dynamic-code-evaluation unstable_allowDynamic: ["**/node_modules/@cf-wasm/**/*.js"], }; export default async function handler(req: NextRequest) { // url of image to fetch const imageUrl = "https://avatars.githubusercontent.com/u/314135"; // fetch image and get the Uint8Array instance const inputBytes = await fetch(imageUrl) .then((res) => res.arrayBuffer()) .then((buffer) => new Uint8Array(buffer)); // create a PhotonImage instance const inputImage = PhotonImage.new_from_byteslice(inputBytes); // resize image using photon const outputImage = resize( inputImage, inputImage.get_width() * 0.5, inputImage.get_height() * 0.5, SamplingFilter.Nearest ); // get webp bytes const outputBytes = outputImage.get_bytes_webp(); // for other formats // png : outputImage.get_bytes(); // jpeg : outputImage.get_bytes_jpeg(quality); // call free() method to free memory inputImage.free(); outputImage.free(); // return the Response instance return new Response(outputBytes, { headers: { "Content-Type": "image/webp", }, }); } ``` ## Documentation To explore all the functions, visit the [official documentation](https://docs.rs/photon-rs/). ## Reporting issues This library is a fork of [`silvia-odwyer/photon`](https://github.com/silvia-odwyer/photon), so consider opening issues or feature requests there. For WebAssembly-related issues, you can open an issue in this repository. ## Awesome Projects Following is a list of projects built using this library: - [Next Image Processing API](https://github.com/yoeven/next-image-processing-api) (by [Yoeven D Khemlani](https://github.com/yoeven)) ## Credits All credit goes to [@silvia-odwyer/photon](https://github.com/silvia-odwyer/photon).