mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 15:09:42 +00:00
Merge branch 'master' into engine
This commit is contained in:
@@ -143,7 +143,7 @@ func (e *Event) ExecuteAction() bool {
|
||||
// String turns the structure event into a string
|
||||
func (e *Event) String() string {
|
||||
return fmt.Sprintf(
|
||||
"If the %s [%s] %s on %s meets the following %v then %s.\n", e.Pair.String(),
|
||||
"If the %s [%s] %s on %s meets the following %v then %s.", e.Pair.String(),
|
||||
strings.ToUpper(e.Asset.String()), e.Item, e.Exchange, e.Condition, e.Action,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -417,6 +417,7 @@ type WebsocketEventResponse struct {
|
||||
Pair currency.Pair `json:"pair,omitempty"`
|
||||
RequestID int64 `json:"reqid,omitempty"` // Optional, client originated ID reflected in response message.
|
||||
Subscription WebsocketSubscriptionResponseData `json:"subscription,omitempty"`
|
||||
ChannelName string `json:"channelName,omitempty"`
|
||||
WebsocketSubscriptionEventResponse
|
||||
WebsocketStatusResponse
|
||||
WebsocketErrorResponse
|
||||
|
||||
@@ -27,7 +27,7 @@ import (
|
||||
const (
|
||||
krakenWSURL = "wss://ws.kraken.com"
|
||||
krakenWSSandboxURL = "wss://sandbox.kraken.com"
|
||||
krakenWSSupportedVersion = "0.1.1"
|
||||
krakenWSSupportedVersion = "0.2.0"
|
||||
// If a checksum fails, then resubscribing to the channel fails, fatal after these attempts
|
||||
krakenWsResubscribeFailureLimit = 3
|
||||
krakenWsResubscribeDelayInSeconds = 3
|
||||
@@ -72,7 +72,8 @@ func (k *Kraken) writeToWebsocket(message []byte) error {
|
||||
k.wsRequestMtx.Lock()
|
||||
defer k.wsRequestMtx.Unlock()
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Sending message to WS: %v",
|
||||
log.Debugf(log.ExchangeSys, "%v Sending message to WS: %v",
|
||||
k.Name,
|
||||
string(message))
|
||||
}
|
||||
// Really basic WS rate limit
|
||||
@@ -98,7 +99,8 @@ func (k *Kraken) WsConnect() error {
|
||||
|
||||
var err error
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Attempting to connect to %v",
|
||||
log.Debugf(log.ExchangeSys, "%v Attempting to connect to %v",
|
||||
k.Name,
|
||||
k.Websocket.GetWebsocketURL())
|
||||
}
|
||||
k.WebsocketConn, _, err = dialer.Dial(k.Websocket.GetWebsocketURL(),
|
||||
@@ -109,7 +111,8 @@ func (k *Kraken) WsConnect() error {
|
||||
err)
|
||||
}
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Successful connection to %v",
|
||||
log.Debugf(log.ExchangeSys, "%v Successful connection to %v",
|
||||
k.Name,
|
||||
k.Websocket.GetWebsocketURL())
|
||||
}
|
||||
go k.WsHandleData()
|
||||
@@ -166,7 +169,7 @@ func (k *Kraken) wsPingHandler() {
|
||||
pingEvent := fmt.Sprintf("{\"event\":\"%v\"}", krakenWsPing)
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "%v sending ping",
|
||||
k.GetName())
|
||||
k.Name)
|
||||
}
|
||||
err := k.writeToWebsocket([]byte(pingEvent))
|
||||
if err != nil {
|
||||
@@ -193,7 +196,7 @@ func (k *Kraken) WsHandleData() {
|
||||
k.Websocket.DataHandler <- fmt.Errorf("%v WsHandleData: %v",
|
||||
k.Name,
|
||||
err)
|
||||
time.Sleep(time.Second)
|
||||
return
|
||||
}
|
||||
// event response handling
|
||||
var eventResponse WebsocketEventResponse
|
||||
@@ -222,36 +225,37 @@ func (k *Kraken) WsHandleDataResponse(response WebsocketDataResponse) {
|
||||
case krakenWsTicker:
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "%v Websocket ticker data received",
|
||||
k.GetName())
|
||||
k.Name)
|
||||
}
|
||||
k.wsProcessTickers(&channelData, response[1])
|
||||
case krakenWsOHLC:
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "%v Websocket OHLC data received",
|
||||
k.GetName())
|
||||
k.Name)
|
||||
}
|
||||
k.wsProcessCandles(&channelData, response[1])
|
||||
case krakenWsOrderbook:
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "%v Websocket Orderbook data received",
|
||||
k.GetName())
|
||||
k.Name)
|
||||
}
|
||||
k.wsProcessOrderBook(&channelData, response[1])
|
||||
case krakenWsSpread:
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "%v Websocket Spread data received",
|
||||
k.GetName())
|
||||
k.Name)
|
||||
}
|
||||
k.wsProcessSpread(&channelData, response[1])
|
||||
case krakenWsTrade:
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "%v Websocket Trade data received",
|
||||
k.GetName())
|
||||
k.Name)
|
||||
}
|
||||
k.wsProcessTrades(&channelData, response[1])
|
||||
default:
|
||||
log.Errorf(log.ExchangeSys, "%v Unidentified websocket data received: %v",
|
||||
k.GetName(), response)
|
||||
k.Name,
|
||||
response)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -261,34 +265,37 @@ func (k *Kraken) WsHandleEventResponse(response *WebsocketEventResponse) {
|
||||
case krakenWsHeartbeat:
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "%v Websocket heartbeat data received",
|
||||
k.GetName())
|
||||
k.Name)
|
||||
}
|
||||
case krakenWsPong:
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "%v Websocket pong data received",
|
||||
k.GetName())
|
||||
k.Name)
|
||||
}
|
||||
case krakenWsSystemStatus:
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "%v Websocket status data received",
|
||||
k.GetName())
|
||||
k.Name)
|
||||
}
|
||||
if response.Status != "online" {
|
||||
k.Websocket.DataHandler <- fmt.Errorf("%v Websocket status '%v'",
|
||||
k.GetName(), response.Status)
|
||||
k.Name, response.Status)
|
||||
}
|
||||
if response.WebsocketStatusResponse.Version != krakenWSSupportedVersion {
|
||||
log.Warnf(log.ExchangeSys, "%v New version of Websocket API released. Was %v Now %v",
|
||||
k.GetName(), krakenWSSupportedVersion, response.WebsocketStatusResponse.Version)
|
||||
k.Name, krakenWSSupportedVersion, response.WebsocketStatusResponse.Version)
|
||||
}
|
||||
case krakenWsSubscriptionStatus:
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "%v Websocket subscription status data received",
|
||||
k.GetName())
|
||||
k.Name)
|
||||
}
|
||||
if response.Status != "subscribed" {
|
||||
if response.RequestID > 0 {
|
||||
k.Websocket.DataHandler <- fmt.Errorf("requestID: '%v'. Error: %v", response.RequestID, response.WebsocketErrorResponse.ErrorMessage)
|
||||
k.Websocket.DataHandler <- fmt.Errorf("%v requestID: '%v'. Error: %v",
|
||||
k.Name,
|
||||
response.RequestID,
|
||||
response.WebsocketErrorResponse.ErrorMessage)
|
||||
} else {
|
||||
k.Websocket.DataHandler <- fmt.Errorf(response.WebsocketErrorResponse.ErrorMessage)
|
||||
}
|
||||
@@ -296,7 +303,8 @@ func (k *Kraken) WsHandleEventResponse(response *WebsocketEventResponse) {
|
||||
}
|
||||
addNewSubscriptionChannelData(response)
|
||||
default:
|
||||
log.Errorf(log.ExchangeSys, "%v Unidentified websocket data received: %v", k.GetName(), response)
|
||||
log.Errorf(log.ExchangeSys, "%v Unidentified websocket data received: %v",
|
||||
k.Name, response)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -354,7 +362,7 @@ func (k *Kraken) wsProcessTickers(channelData *WebsocketChannelData, data interf
|
||||
|
||||
k.Websocket.DataHandler <- exchange.TickerData{
|
||||
Timestamp: time.Now(),
|
||||
Exchange: k.GetName(),
|
||||
Exchange: k.Name,
|
||||
AssetType: krakenWsAssetType,
|
||||
Pair: channelData.Pair,
|
||||
ClosePrice: closePrice,
|
||||
@@ -371,14 +379,20 @@ func (k *Kraken) wsProcessSpread(channelData *WebsocketChannelData, data interfa
|
||||
bestBid := spreadData[0].(string)
|
||||
bestAsk := spreadData[1].(string)
|
||||
timeData, _ := strconv.ParseFloat(spreadData[2].(string), 64)
|
||||
bidVolume := spreadData[3].(string)
|
||||
askVolume := spreadData[4].(string)
|
||||
sec, dec := math.Modf(timeData)
|
||||
spreadTimestamp := time.Unix(int64(sec), int64(dec*(1e9)))
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Spread data for '%v' received. Best bid: '%v' Best ask: '%v' Time: '%v'",
|
||||
log.Debugf(log.ExchangeSys,
|
||||
"%v Spread data for '%v' received. Best bid: '%v' Best ask: '%v' Time: '%v', Bid volume '%v', Ask volume '%v'",
|
||||
k.Name,
|
||||
channelData.Pair,
|
||||
bestBid,
|
||||
bestAsk,
|
||||
spreadTimestamp)
|
||||
spreadTimestamp,
|
||||
bidVolume,
|
||||
askVolume)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -396,7 +410,7 @@ func (k *Kraken) wsProcessTrades(channelData *WebsocketChannelData, data interfa
|
||||
AssetType: krakenWsAssetType,
|
||||
CurrencyPair: channelData.Pair,
|
||||
EventTime: time.Now().Unix(),
|
||||
Exchange: k.GetName(),
|
||||
Exchange: k.Name,
|
||||
Price: price,
|
||||
Amount: amount,
|
||||
Timestamp: timeUnix,
|
||||
@@ -478,14 +492,14 @@ func (k *Kraken) wsProcessOrderBookPartial(channelData *WebsocketChannelData, ob
|
||||
}
|
||||
|
||||
ob.LastUpdated = highestLastUpdate
|
||||
err := k.Websocket.Orderbook.LoadSnapshot(&ob, k.GetName(), true)
|
||||
err := k.Websocket.Orderbook.LoadSnapshot(&ob, k.Name, true)
|
||||
if err != nil {
|
||||
k.Websocket.DataHandler <- err
|
||||
return
|
||||
}
|
||||
|
||||
k.Websocket.DataHandler <- exchange.WebsocketOrderbookUpdate{
|
||||
Exchange: k.GetName(),
|
||||
Exchange: k.Name,
|
||||
Asset: krakenWsAssetType,
|
||||
Pair: channelData.Pair,
|
||||
}
|
||||
@@ -499,7 +513,7 @@ func (k *Kraken) wsProcessOrderBookPartial(channelData *WebsocketChannelData, ob
|
||||
func (k *Kraken) wsProcessOrderBookBuffer(channelData *WebsocketChannelData, obData map[string]interface{}) {
|
||||
ob := orderbook.Base{
|
||||
AssetType: krakenWsAssetType,
|
||||
ExchangeName: k.GetName(),
|
||||
ExchangeName: k.Name,
|
||||
Pair: channelData.Pair,
|
||||
}
|
||||
|
||||
@@ -535,7 +549,6 @@ func (k *Kraken) wsProcessOrderBookBuffer(channelData *WebsocketChannelData, obD
|
||||
Amount: amount,
|
||||
Price: price,
|
||||
})
|
||||
|
||||
timeData, _ := strconv.ParseFloat(bids[2].(string), 64)
|
||||
sec, dec := math.Modf(timeData)
|
||||
bidUpdatedTime := time.Unix(int64(sec), int64(dec*(1e9)))
|
||||
@@ -550,7 +563,9 @@ func (k *Kraken) wsProcessOrderBookBuffer(channelData *WebsocketChannelData, obD
|
||||
}
|
||||
orderbookBuffer[channelData.ChannelID] = append(orderbookBuffer[channelData.ChannelID], ob)
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Adding orderbook to buffer for channel %v. Lastupdated: %v. %v / %v",
|
||||
log.Debugf(log.ExchangeSys,
|
||||
"%v Adding orderbook to buffer for channel %v. Lastupdated: %v. %v / %v",
|
||||
k.Name,
|
||||
channelData.ChannelID,
|
||||
ob.LastUpdated,
|
||||
len(orderbookBuffer[channelData.ChannelID]),
|
||||
@@ -561,12 +576,15 @@ func (k *Kraken) wsProcessOrderBookBuffer(channelData *WebsocketChannelData, obD
|
||||
// wsProcessOrderBookUpdate updates an orderbook entry for a given currency pair
|
||||
func (k *Kraken) wsProcessOrderBookUpdate(channelData *WebsocketChannelData) error {
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Current orderbook 'LastUpdated': %v",
|
||||
log.Debugf(log.ExchangeSys, "%v Current orderbook 'LastUpdated': %v",
|
||||
k.Name,
|
||||
krakenOrderBooks[channelData.ChannelID].LastUpdated)
|
||||
}
|
||||
lowestLastUpdated := orderbookBuffer[channelData.ChannelID][0].LastUpdated
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Sorting orderbook. Earliest 'LastUpdated' entry: %v",
|
||||
log.Debugf(log.ExchangeSys,
|
||||
"%v Sorting orderbook. Earliest 'LastUpdated' entry: %v",
|
||||
k.Name,
|
||||
lowestLastUpdated)
|
||||
}
|
||||
sort.Slice(orderbookBuffer[channelData.ChannelID], func(i, j int) bool {
|
||||
@@ -575,12 +593,15 @@ func (k *Kraken) wsProcessOrderBookUpdate(channelData *WebsocketChannelData) err
|
||||
|
||||
lowestLastUpdated = orderbookBuffer[channelData.ChannelID][0].LastUpdated
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Sorted orderbook. Earliest 'LastUpdated' entry: %v",
|
||||
log.Debugf(log.ExchangeSys,
|
||||
"%v Sorted orderbook. Earliest 'LastUpdated' entry: %v",
|
||||
k.Name,
|
||||
lowestLastUpdated)
|
||||
}
|
||||
// The earliest update has to be after the previously stored orderbook
|
||||
if krakenOrderBooks[channelData.ChannelID].LastUpdated.After(lowestLastUpdated) {
|
||||
err := fmt.Errorf("orderbook update out of order. Existing: %v, Attempted: %v",
|
||||
err := fmt.Errorf("%v orderbook update out of order. Existing: %v, Attempted: %v",
|
||||
k.Name,
|
||||
krakenOrderBooks[channelData.ChannelID].LastUpdated,
|
||||
lowestLastUpdated)
|
||||
k.Websocket.DataHandler <- err
|
||||
@@ -590,20 +611,21 @@ func (k *Kraken) wsProcessOrderBookUpdate(channelData *WebsocketChannelData) err
|
||||
k.updateChannelOrderbookEntries(channelData)
|
||||
highestLastUpdate := orderbookBuffer[channelData.ChannelID][len(orderbookBuffer[channelData.ChannelID])-1].LastUpdated
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Saving orderbook. Lastupdated: %v",
|
||||
log.Debugf(log.ExchangeSys, "%v Saving orderbook. Lastupdated: %v",
|
||||
k.Name,
|
||||
highestLastUpdate)
|
||||
}
|
||||
|
||||
ob := krakenOrderBooks[channelData.ChannelID]
|
||||
ob.LastUpdated = highestLastUpdate
|
||||
err := k.Websocket.Orderbook.LoadSnapshot(&ob, k.GetName(), true)
|
||||
err := k.Websocket.Orderbook.LoadSnapshot(&ob, k.Name, true)
|
||||
if err != nil {
|
||||
k.Websocket.DataHandler <- err
|
||||
return err
|
||||
}
|
||||
|
||||
k.Websocket.DataHandler <- exchange.WebsocketOrderbookUpdate{
|
||||
Exchange: k.GetName(),
|
||||
Exchange: k.Name,
|
||||
Asset: krakenWsAssetType,
|
||||
Pair: channelData.Pair,
|
||||
}
|
||||
@@ -627,7 +649,9 @@ func (k *Kraken) updateChannelOrderbookAsks(i, j int, channelData *WebsocketChan
|
||||
askFound := k.updateChannelOrderbookAsk(i, j, channelData)
|
||||
if !askFound {
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Adding Ask for channel %v. Price %v. Amount %v",
|
||||
log.Debugf(log.ExchangeSys,
|
||||
"%v Adding Ask for channel %v. Price %v. Amount %v",
|
||||
k.Name,
|
||||
channelData.ChannelID,
|
||||
orderbookBuffer[channelData.ChannelID][i].Asks[j].Price,
|
||||
orderbookBuffer[channelData.ChannelID][i].Asks[j].Amount)
|
||||
@@ -646,7 +670,9 @@ func (k *Kraken) updateChannelOrderbookAsk(i, j int, channelData *WebsocketChann
|
||||
if orderbookBuffer[channelData.ChannelID][i].Asks[j].Amount == 0 {
|
||||
// Remove existing entry
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Removing Ask for channel %v. Price %v. Old amount %v. Buffer %v",
|
||||
log.Debugf(log.ExchangeSys,
|
||||
"%v Removing Ask for channel %v. Price %v. Old amount %v. Buffer %v",
|
||||
k.Name,
|
||||
channelData.ChannelID,
|
||||
orderbookBuffer[channelData.ChannelID][i].Asks[j].Price,
|
||||
krakenOrderBooks[channelData.ChannelID].Asks[l].Amount, i)
|
||||
@@ -657,7 +683,8 @@ func (k *Kraken) updateChannelOrderbookAsk(i, j int, channelData *WebsocketChann
|
||||
l--
|
||||
} else if krakenOrderBooks[channelData.ChannelID].Asks[l].Amount != orderbookBuffer[channelData.ChannelID][i].Asks[j].Amount {
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Updating Ask for channel %v. Price %v. Old amount %v, New Amount %v",
|
||||
log.Debugf(log.ExchangeSys, "%v Updating Ask for channel %v. Price %v. Old amount %v, New Amount %v",
|
||||
k.Name,
|
||||
channelData.ChannelID,
|
||||
orderbookBuffer[channelData.ChannelID][i].Asks[j].Price,
|
||||
krakenOrderBooks[channelData.ChannelID].Asks[l].Amount,
|
||||
@@ -675,7 +702,9 @@ func (k *Kraken) updateChannelOrderbookBids(i, j int, channelData *WebsocketChan
|
||||
bidFound := k.updateChannelOrderbookBid(i, j, channelData)
|
||||
if !bidFound {
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Adding Bid for channel %v. Price %v. Amount %v",
|
||||
log.Debugf(log.ExchangeSys,
|
||||
"%v Adding Bid for channel %v. Price %v. Amount %v",
|
||||
k.Name,
|
||||
channelData.ChannelID,
|
||||
orderbookBuffer[channelData.ChannelID][i].Bids[j].Price,
|
||||
orderbookBuffer[channelData.ChannelID][i].Bids[j].Amount)
|
||||
@@ -694,7 +723,9 @@ func (k *Kraken) updateChannelOrderbookBid(i, j int, channelData *WebsocketChann
|
||||
if orderbookBuffer[channelData.ChannelID][i].Bids[j].Amount == 0 {
|
||||
// Remove existing entry
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Removing Bid for channel %v. Price %v. Old amount %v. Buffer %v",
|
||||
log.Debugf(log.ExchangeSys,
|
||||
"%v Removing Bid for channel %v. Price %v. Old amount %v. Buffer %v",
|
||||
k.Name,
|
||||
channelData.ChannelID,
|
||||
orderbookBuffer[channelData.ChannelID][i].Bids[j].Price,
|
||||
krakenOrderBooks[channelData.ChannelID].Bids[l].Amount, i)
|
||||
@@ -705,7 +736,9 @@ func (k *Kraken) updateChannelOrderbookBid(i, j int, channelData *WebsocketChann
|
||||
l--
|
||||
} else if krakenOrderBooks[channelData.ChannelID].Bids[l].Amount != orderbookBuffer[channelData.ChannelID][i].Bids[j].Amount {
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Updating Bid for channel %v. Price %v. Old amount %v, New Amount %v",
|
||||
log.Debugf(log.ExchangeSys,
|
||||
"%v Updating Bid for channel %v. Price %v. Old amount %v, New Amount %v",
|
||||
k.Name,
|
||||
channelData.ChannelID,
|
||||
orderbookBuffer[channelData.ChannelID][i].Bids[j].Price,
|
||||
krakenOrderBooks[channelData.ChannelID].Bids[l].Amount,
|
||||
@@ -736,7 +769,7 @@ func (k *Kraken) wsProcessCandles(channelData *WebsocketChannelData, data interf
|
||||
AssetType: krakenWsAssetType,
|
||||
Pair: channelData.Pair,
|
||||
Timestamp: time.Now(),
|
||||
Exchange: k.GetName(),
|
||||
Exchange: k.Name,
|
||||
StartTime: startTimeUnix,
|
||||
CloseTime: endTimeUnix,
|
||||
// Candles are sent every 60 seconds
|
||||
|
||||
4
go.mod
4
go.mod
@@ -6,7 +6,7 @@ require (
|
||||
github.com/gogo/protobuf v1.2.1 // indirect
|
||||
github.com/golang/protobuf v1.3.1
|
||||
github.com/google/go-querystring v1.0.0
|
||||
github.com/gorilla/mux v1.7.2
|
||||
github.com/gorilla/mux v1.7.3
|
||||
github.com/gorilla/websocket v1.4.0
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.2
|
||||
@@ -14,7 +14,7 @@ require (
|
||||
github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b
|
||||
github.com/urfave/cli v1.20.0
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5
|
||||
golang.org/x/net v0.0.0-20190606173856-1492cefac77f
|
||||
golang.org/x/net v0.0.0-20190606173856-1492cefac77f // indirect
|
||||
google.golang.org/genproto v0.0.0-20190605220351-eb0b1bdb6ae6
|
||||
google.golang.org/grpc v1.21.1
|
||||
)
|
||||
|
||||
6
go.sum
6
go.sum
@@ -18,14 +18,12 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
|
||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||
github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I=
|
||||
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw=
|
||||
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0 h1:bM6ZAFZmc/wPFaRDi0d5L7hGEZEx/2u+Tmr2evNHDiI=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.2 h1:S+ef0492XaIknb8LMjcwgW2i3cNTzDYMmDrOThOJNWc=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
|
||||
Reference in New Issue
Block a user