"use client"; import { Badge } from "@/components/ui/badge"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import type { getMachines } from "@/server/curdMachine"; import { Check, CircleOff, SatelliteDish } from "lucide-react"; import React, { useEffect, useRef, useState } from "react"; import useWebSocket, { ReadyState } from "react-use-websocket"; import { create } from "zustand"; type State = { data: { id: string; timestamp: number; json: { event: string; data: any; }; }[]; logs: { machine_id: string; logs: string; timestamp: number; }[]; addLogs: (id: string, logs: string) => void; addData: ( id: string, json: { event: string; data: any; } ) => void; }; export const useStore = create((set) => ({ data: [], logs: [], addLogs(id, logs) { set((state) => ({ ...state, logs: [...state.logs, { machine_id: id, logs, timestamp: Date.now() }], })); }, addData: (id, json) => set((state) => ({ ...state, data: [...state.data, { id, json, timestamp: Date.now() }], })), })); export function MachinesWSMain(props: { machines: Awaited>; }) { return (
Machine Status
{props.machines .filter((x) => x.type === "classic") .map((x) => ( ))}
); } function MachineWS({ machine, }: { machine: Awaited>[0]; }) { const { addData, addLogs } = useStore(); const logs = useStore((x) => x.logs .filter((p) => p.machine_id === machine.id) .sort((a, b) => a.timestamp - b.timestamp) ); const [sid, setSid] = useState(""); const wsEndpoint = machine.endpoint.replace(/^http/, "ws"); const { lastMessage, readyState } = useWebSocket( `${wsEndpoint}/comfyui-deploy/ws`, { shouldReconnect: () => true, reconnectAttempts: 20, reconnectInterval: 1000, // queryParams: { // clientId: sid, // }, } ); const connectionStatus = { [ReadyState.CONNECTING]: ( ), [ReadyState.OPEN]: , [ReadyState.CLOSING]: , [ReadyState.CLOSED]: , [ReadyState.UNINSTANTIATED]: "Uninstantiated", }[readyState]; const container = useRef(null); useEffect(() => { if (!lastMessage?.data) return; const message = JSON.parse(lastMessage.data); // console.log(message.event, message); if (message.data.sid) { setSid(message.data.sid); } if (message.data?.prompt_id) { console.log(message.event, message); addData(message.data.prompt_id, message); } if (message.event === "LOGS") { addLogs(machine.id, message.data); } }, [lastMessage]); useEffect(() => { // console.log(logs.length, container.current); if (container.current) { const scrollHeight = container.current.scrollHeight; container.current.scrollTo({ top: scrollHeight, behavior: "smooth", }); } }, [logs.length]); return ( {machine.name} {connectionStatus} Machine Logs You can view your run's outputs here
{ if (!container.current && ref) { const scrollHeight = ref.scrollHeight; ref.scrollTo({ top: scrollHeight, behavior: "instant", }); } container.current = ref; }} className="flex flex-col text-xs p-2 overflow-y-scroll max-h-[400px] whitespace-break-spaces" > {logs.map((x, i) => (
{x.logs}
))}
); }