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 }