Initial commit

This commit is contained in:
Djuri 2025-05-18 23:54:04 +02:00
commit c5111cb551
Signed by: djuri
GPG key ID: 61B9B2DDE5AA3AC1
20 changed files with 1764 additions and 0 deletions

54
handlers/v1.go Normal file
View file

@ -0,0 +1,54 @@
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
}

50
handlers/v2.go Normal file
View file

@ -0,0 +1,50 @@
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
}