emcp/frontend/src/websocket/client.ts

50 lines
1.3 KiB
TypeScript

import type { AlarmEvent, RealtimeData } from '../types/platform'
type TimeSyncPayload = {
time_sync: string
}
function buildWsUrl(path: string): string {
return `ws://localhost:8000${path}`
}
export function connectRealtime(onMessage: (data: RealtimeData) => void): WebSocket {
const socket = new WebSocket(buildWsUrl('/ws/real-time'))
socket.onmessage = (event) => {
const payload = JSON.parse(event.data)
onMessage(payload.data)
}
return socket
}
export function connectRealtimeWithLifecycle(
onMessage: (data: RealtimeData) => void,
handlers: {
onOpen?: () => void
onClose?: () => void
onError?: () => void
},
): WebSocket {
const socket = connectRealtime(onMessage)
socket.onopen = () => handlers.onOpen?.()
socket.onclose = () => handlers.onClose?.()
socket.onerror = () => handlers.onError?.()
return socket
}
export function connectAlarm(onMessage: (data: AlarmEvent) => void): WebSocket {
const socket = new WebSocket(buildWsUrl('/ws/alarm'))
socket.onmessage = (event) => {
onMessage(JSON.parse(event.data))
}
return socket
}
export function connectTimeSync(onMessage: (data: { data: TimeSyncPayload }) => void): WebSocket {
const socket = new WebSocket(buildWsUrl('/ws/time-sync'))
socket.onmessage = (event) => {
onMessage(JSON.parse(event.data))
}
return socket
}