Initial commit
This commit is contained in:
commit
c5111cb551
20 changed files with 1764 additions and 0 deletions
54
handlers/v1.go
Normal file
54
handlers/v1.go
Normal 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
50
handlers/v2.go
Normal 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
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue