Files
bj_power/bj_power_mes/internal/sse/bridge.go
T

55 lines
1.4 KiB
Go

package sse
import (
"context"
"encoding/json"
"log/slog"
"bj_power_mes/internal/eventbus"
"bj_power_mes/internal/eventlog"
)
// EventBridge 将 EventBus 事件转发给 SSE 客户端,实现内部事件到前端的实时推送。
type EventBridge struct {
sseHandler *Handler
bus eventbus.Bus
sub eventbus.Subscription
}
// NewEventBridge 创建桥接器并订阅所有 EventBus 事件。
func NewEventBridge(bus eventbus.Bus, sseHandler *Handler) *EventBridge {
bridge := &EventBridge{
sseHandler: sseHandler,
bus: bus,
}
bridge.sub = bus.SubscribeAll(bridge.onEvent)
return bridge
}
// Close 取消事件订阅。
func (b *EventBridge) Close() {
if b.sub != nil {
b.sub.Unsubscribe()
}
}
func (b *EventBridge) onEvent(_ context.Context, event eventbus.Event) error {
data, err := json.Marshal(map[string]any{
"id": event.ID,
"eventType": string(event.Type),
"sourceId": event.Source,
"entityType": event.EntityType,
"entityId": event.EntityID,
"entityVersion": event.EntityVersion,
"description": eventlog.EventDescription(event),
"payload": event.Payload,
"createdAt": event.Timestamp.Format("2006-01-02 15:04:05"),
})
if err != nil {
slog.Error("eventbridge: marshal failed", "err", err)
return nil
}
b.sseHandler.Emit("eventbus."+string(event.Type), string(data))
return nil
}