| 
									
										
										
										
											2015-06-08 10:23:54 +02:00
										 |  |  | package shared | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | import ( | 
					
						
							|  |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2015-06-09 09:48:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/logger/glog" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-06-08 10:23:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-22 12:47:32 +02:00
										 |  |  | // Ethereum RPC API interface | 
					
						
							|  |  |  | type EthereumApi interface { | 
					
						
							|  |  |  | 	// API identifier | 
					
						
							|  |  |  | 	Name() string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// API version | 
					
						
							|  |  |  | 	ApiVersion() string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Execute the given request and returns the response or an error | 
					
						
							|  |  |  | 	Execute(*Request) (interface{}, error) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// List of supported RCP methods this API provides | 
					
						
							|  |  |  | 	Methods() []string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 10:23:54 +02:00
										 |  |  | // RPC request | 
					
						
							|  |  |  | type Request struct { | 
					
						
							|  |  |  | 	Id      interface{}     `json:"id"` | 
					
						
							|  |  |  | 	Jsonrpc string          `json:"jsonrpc"` | 
					
						
							|  |  |  | 	Method  string          `json:"method"` | 
					
						
							|  |  |  | 	Params  json.RawMessage `json:"params"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // RPC response | 
					
						
							|  |  |  | type Response struct { | 
					
						
							|  |  |  | 	Id      interface{} `json:"id"` | 
					
						
							|  |  |  | 	Jsonrpc string      `json:"jsonrpc"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // RPC success response | 
					
						
							|  |  |  | type SuccessResponse struct { | 
					
						
							|  |  |  | 	Id      interface{} `json:"id"` | 
					
						
							|  |  |  | 	Jsonrpc string      `json:"jsonrpc"` | 
					
						
							|  |  |  | 	Result  interface{} `json:"result"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // RPC error response | 
					
						
							|  |  |  | type ErrorResponse struct { | 
					
						
							|  |  |  | 	Id      interface{}  `json:"id"` | 
					
						
							|  |  |  | 	Jsonrpc string       `json:"jsonrpc"` | 
					
						
							|  |  |  | 	Error   *ErrorObject `json:"error"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // RPC error response details | 
					
						
							|  |  |  | type ErrorObject struct { | 
					
						
							|  |  |  | 	Code    int    `json:"code"` | 
					
						
							|  |  |  | 	Message string `json:"message"` | 
					
						
							|  |  |  | 	// Data    interface{} `json:"data"` | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-16 13:07:13 +02:00
										 |  |  | // Create RPC error response, this allows for custom error codes | 
					
						
							|  |  |  | func NewRpcErrorResponse(id interface{}, jsonrpcver string, errCode int, err error) *interface{} { | 
					
						
							|  |  |  | 	var response interface{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	jsonerr := &ErrorObject{errCode, err.Error()} | 
					
						
							|  |  |  | 	response = ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	glog.V(logger.Detail).Infof("Generated error response: %s", response) | 
					
						
							|  |  |  | 	return &response | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Create RPC response | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | func NewRpcResponse(id interface{}, jsonrpcver string, reply interface{}, err error) *interface{} { | 
					
						
							|  |  |  | 	var response interface{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch err.(type) { | 
					
						
							| 
									
										
										
										
											2015-06-09 09:48:18 +02:00
										 |  |  | 	case nil: | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 		response = &SuccessResponse{Jsonrpc: jsonrpcver, Id: id, Result: reply} | 
					
						
							| 
									
										
										
										
											2015-06-09 09:48:18 +02:00
										 |  |  | 	case *NotImplementedError: | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 		jsonerr := &ErrorObject{-32601, err.Error()} | 
					
						
							|  |  |  | 		response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} | 
					
						
							| 
									
										
										
										
											2015-06-09 09:48:18 +02:00
										 |  |  | 	case *DecodeParamError, *InsufficientParamsError, *ValidationError, *InvalidTypeError: | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 		jsonerr := &ErrorObject{-32602, err.Error()} | 
					
						
							|  |  |  | 		response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} | 
					
						
							| 
									
										
										
										
											2015-06-09 09:48:18 +02:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2015-06-08 10:41:04 +02:00
										 |  |  | 		jsonerr := &ErrorObject{-32603, err.Error()} | 
					
						
							|  |  |  | 		response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	glog.V(logger.Detail).Infof("Generated response: %T %s", response, response) | 
					
						
							|  |  |  | 	return &response | 
					
						
							|  |  |  | } |