55 lines
1.4 KiB
Go
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
|
|
}
|