package repository import ( "blockchain/internal/domain/blockchain" "time" ) // ====== Adapter 介面(每家交易所各實作一份) ====== type ExchangeAdapter interface { Name() string // e.g. "binance" URL() string // 該交易所的 ws 連線位址 NormalizeSymbol(internal string) string // 內部 -> 交易所格式(ex: BTCUSDT -> BTC-USD / BTC-USDT) DenormalizeSymbol(external string) string // 交易所 -> 內部格式 BuildSubscribe(symbols []string, interval blockchain.Interval) ([][]byte, error) // BuildSubscribe 訂閱K線(可一次多個) BuildUnsubscribe(symbols []string, interval blockchain.Interval) ([][]byte, error) // BuildUnsubscribe 取消訂閱K線(可一次多個) ParseKLines(msg []byte) ([]blockchain.Kline, error) // ParseKLines 解析 WS 訊息:不是 K 線就回 (nil, nil) ClientPingInterval() time.Duration // ClientPingInterval 心跳:是否需要主動 ping(有些交易所 server 會送 ping) ,0 表示不用主動 ping ReadDeadline() time.Duration // 建議 read deadline } type StreamHandler interface { OnKline(k blockchain.Kline) OnError(err error) }