import { useEventListener } from '@vueuse/core' import { onUnmounted, ref } from 'vue' import { LogsWsMessage } from '@/schemas/apiSchema' import { api } from '@/scripts/api' const LOGS_MESSAGE_TYPE = 'logs' interface UseServerLogsOptions { immediate?: boolean messageFilter?: (message: string) => boolean } export const useServerLogs = (options: UseServerLogsOptions = {}) => { const { immediate = false, messageFilter = (msg: string) => Boolean(msg.trim()) } = options const logs = ref([]) let stop: ReturnType | null = null const isValidLogEvent = (event: CustomEvent) => event?.type === LOGS_MESSAGE_TYPE && event.detail?.entries?.length > 0 const parseLogMessage = (event: CustomEvent) => event.detail.entries.map((e) => e.m).filter(messageFilter) const handleLogMessage = (event: CustomEvent) => { if (isValidLogEvent(event)) { logs.value.push(...parseLogMessage(event)) } } const start = async () => { await api.subscribeLogs(true) stop = useEventListener(api, LOGS_MESSAGE_TYPE, handleLogMessage) } const stopListening = async () => { stop?.() stop = null await api.subscribeLogs(false) } if (immediate) { void start() } onUnmounted(async () => { await stopListening() logs.value = [] }) return { logs, startListening: start, stopListening } }