package handlers import ( "btclock/broker" ws "btclock/websocket" "context" "fmt" "math" "strings" "github.com/gofiber/contrib/websocket" "github.com/vmihailenco/msgpack" ) // WebSocketHandler implements broker.EventHandler for a websocket connection type WebSocketV2Handler struct { Cm *ws.ChannelManager } func (h *WebSocketV2Handler) 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{}) symbol := strings.TrimPrefix(event.Payload().(map[string]interface{})["symbol"].(string), "BTC/") payload["price"] = map[string]interface{}{ symbol: int(math.Round(payloadMap["last"].(float64))), } channel = "price:" + symbol case "mempool-fee-rate": payload["blockfee"] = int(math.Round(event.Payload().(float64))) channel = "blockfee" case "mempool-block": payload["blockheight"] = event.Payload() channel = "blockheight" default: return fmt.Errorf("unknown event type: %s", event.Name()) } b, err := msgpack.Marshal(payload) if err != nil { return fmt.Errorf("error marshalling payload: %v", err) } h.Cm.BroadcastTo(channel, b, websocket.BinaryMessage) return nil }