2016-01-12 13:50:06 -08:00
|
|
|
package rpctypes
|
|
|
|
|
|
|
|
import (
|
2016-01-13 15:37:35 -08:00
|
|
|
"encoding/json"
|
2016-02-18 13:07:49 -08:00
|
|
|
"strings"
|
2016-01-13 15:37:35 -08:00
|
|
|
|
2017-04-21 14:51:11 -07:00
|
|
|
events "github.com/tendermint/tmlibs/events"
|
2016-01-12 13:50:06 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
type RPCRequest struct {
|
2017-05-03 07:13:58 -07:00
|
|
|
JSONRPC string `json:"jsonrpc"`
|
|
|
|
ID string `json:"id"`
|
|
|
|
Method string `json:"method"`
|
|
|
|
Params *json.RawMessage `json:"params"` // must be map[string]interface{} or []interface{}
|
2016-01-12 13:50:06 -08:00
|
|
|
}
|
|
|
|
|
2017-05-03 07:13:58 -07:00
|
|
|
func NewRPCRequest(id string, method string, params json.RawMessage) RPCRequest {
|
2016-01-12 13:50:06 -08:00
|
|
|
return RPCRequest{
|
|
|
|
JSONRPC: "2.0",
|
|
|
|
ID: id,
|
|
|
|
Method: method,
|
2017-05-03 07:13:58 -07:00
|
|
|
Params: ¶ms,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func MapToRequest(id string, method string, params map[string]interface{}) (RPCRequest, error) {
|
|
|
|
payload, err := json.Marshal(params)
|
|
|
|
if err != nil {
|
|
|
|
return RPCRequest{}, err
|
|
|
|
}
|
|
|
|
request := NewRPCRequest(id, method, payload)
|
|
|
|
return request, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func ArrayToRequest(id string, method string, params []interface{}) (RPCRequest, error) {
|
|
|
|
payload, err := json.Marshal(params)
|
|
|
|
if err != nil {
|
|
|
|
return RPCRequest{}, err
|
2016-01-12 13:50:06 -08:00
|
|
|
}
|
2017-05-03 07:13:58 -07:00
|
|
|
request := NewRPCRequest(id, method, payload)
|
|
|
|
return request, nil
|
2016-01-12 13:50:06 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------
|
|
|
|
|
|
|
|
type RPCResponse struct {
|
2016-01-13 15:37:35 -08:00
|
|
|
JSONRPC string `json:"jsonrpc"`
|
|
|
|
ID string `json:"id"`
|
|
|
|
Result *json.RawMessage `json:"result"`
|
|
|
|
Error string `json:"error"`
|
2016-01-12 13:50:06 -08:00
|
|
|
}
|
|
|
|
|
2016-01-13 15:37:35 -08:00
|
|
|
func NewRPCResponse(id string, res interface{}, err string) RPCResponse {
|
2016-01-13 19:16:56 -08:00
|
|
|
var raw *json.RawMessage
|
|
|
|
if res != nil {
|
2017-04-28 07:24:06 -07:00
|
|
|
var js []byte
|
|
|
|
js, err2 := json.Marshal(res)
|
|
|
|
if err2 == nil {
|
|
|
|
rawMsg := json.RawMessage(js)
|
|
|
|
raw = &rawMsg
|
|
|
|
} else {
|
|
|
|
err = err2.Error()
|
|
|
|
}
|
2016-01-13 19:16:56 -08:00
|
|
|
}
|
2016-01-12 13:50:06 -08:00
|
|
|
return RPCResponse{
|
|
|
|
JSONRPC: "2.0",
|
|
|
|
ID: id,
|
2016-01-13 19:16:56 -08:00
|
|
|
Result: raw,
|
2016-01-12 13:50:06 -08:00
|
|
|
Error: err,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------
|
|
|
|
|
|
|
|
// *wsConnection implements this interface.
|
|
|
|
type WSRPCConnection interface {
|
|
|
|
GetRemoteAddr() string
|
2016-10-10 00:22:34 -07:00
|
|
|
GetEventSwitch() events.EventSwitch
|
2016-01-12 13:50:06 -08:00
|
|
|
WriteRPCResponse(resp RPCResponse)
|
|
|
|
TryWriteRPCResponse(resp RPCResponse) bool
|
|
|
|
}
|
|
|
|
|
|
|
|
// websocket-only RPCFuncs take this as the first parameter.
|
|
|
|
type WSRPCContext struct {
|
|
|
|
Request RPCRequest
|
|
|
|
WSRPCConnection
|
|
|
|
}
|
2016-02-18 13:07:49 -08:00
|
|
|
|
|
|
|
//----------------------------------------
|
|
|
|
// sockets
|
|
|
|
//
|
|
|
|
// Determine if its a unix or tcp socket.
|
|
|
|
// If tcp, must specify the port; `0.0.0.0` will return incorrectly as "unix" since there's no port
|
|
|
|
func SocketType(listenAddr string) string {
|
|
|
|
socketType := "unix"
|
2016-02-18 18:05:24 -08:00
|
|
|
if len(strings.Split(listenAddr, ":")) >= 2 {
|
2016-02-18 13:07:49 -08:00
|
|
|
socketType = "tcp"
|
|
|
|
}
|
|
|
|
return socketType
|
|
|
|
}
|