50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
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
|
|
}
|