"use client"; /* eslint-disable @next/next/no-img-element */ import * as fal from "@fal-ai/serverless-client"; import { ChangeEvent, useRef, useState } from "react"; import { DrawingCanvas } from "../../components/drawing"; fal.config({ proxyUrl: "/api/fal/proxy", }); const PROMPT_EXPANDED = ", beautiful, colorful, highly detailed, best quality, uhd"; const PROMPT = "a moon in the night sky"; const defaults = { model_name: "runwayml/stable-diffusion-v1-5", image_size: "square", num_inference_steps: 4, seed: 6252023, }; export default function RealtimePage() { const [prompt, setPrompt] = useState(PROMPT); const currentDrawing = useRef(null); const outputCanvasRef = useRef(null); const { send } = fal.realtime.connect( "fal-ai/fast-lcm-diffusion/image-to-image", { connectionKey: "realtime-demo", throttleInterval: 128, onResult(result) { if (result.images && result.images[0] && result.images[0].content) { const canvas = outputCanvasRef.current; const context = canvas?.getContext("2d"); if (canvas && context) { const imageBytes: Uint8Array = result.images[0].content; const blob = new Blob([imageBytes], { type: "image/png" }); createImageBitmap(blob) .then((bitmap) => { context.drawImage(bitmap, 0, 0); }) .catch(console.error); } } }, }, ); const handlePromptChange = (e: ChangeEvent) => { setPrompt(e.target.value); if (currentDrawing.current) { send({ prompt: e.target.value.trim() + PROMPT_EXPANDED, image_bytes: currentDrawing.current, ...defaults, }); } }; return (

falrealtime

{ currentDrawing.current = imageData; send({ prompt: prompt + PROMPT_EXPANDED, image_bytes: imageData, ...defaults, }); }} />
); }