package handlers import ( "btclock/broker" ws "btclock/websocket" "context" "encoding/json" "fmt" "math" "github.com/gofiber/contrib/websocket" ) // WebSocketHandler implements broker.EventHandler for a websocket connection type WebSocketV1Handler struct { Cm *ws.ChannelManager } func (h *WebSocketV1Handler) Handle(ctx context.Context, event broker.Event) error { channel := event.Name() payload := map[string]interface{}{} switch event.Name() { case "ticker": payloadMap := event.Payload().(map[string]interface{}) if payloadMap["symbol"] != "BTC/USD" { return fmt.Errorf("unknown symbol: %s", payloadMap["symbol"]) } payload["bitcoin"] = int(math.Round(payloadMap["last"].(float64))) channel = "price-v1" case "mempool-fee-rate": payload["mempool-blocks"] = []map[string]interface{}{ { "medianFee": int(math.Round(event.Payload().(float64))), }, } channel = "blockfee-v1" case "mempool-block": payload["block"] = map[string]interface{}{ "height": event.Payload(), } channel = "blockheight-v1" default: return fmt.Errorf("unknown event type: %s", event.Name()) } b, err := json.Marshal(payload) if err != nil { return fmt.Errorf("error marshalling payload: %v", err) } h.Cm.BroadcastTo(channel, b, websocket.TextMessage) return nil }