| 
									
										
										
										
											2015-03-15 13:21:54 +07:00
										 |  |  | package rpc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2015-04-02 14:00:49 +02:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2015-03-15 13:21:54 +07:00
										 |  |  | 	// "fmt" | 
					
						
							| 
									
										
										
										
											2015-03-20 13:22:01 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/jsre" | 
					
						
							|  |  |  | 	"github.com/robertkrimen/otto" | 
					
						
							| 
									
										
										
										
											2015-03-15 13:21:54 +07:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Jeth struct { | 
					
						
							|  |  |  | 	ethApi *EthereumApi | 
					
						
							|  |  |  | 	toVal  func(interface{}) otto.Value | 
					
						
							| 
									
										
										
										
											2015-03-20 13:22:01 +01:00
										 |  |  | 	re     *jsre.JSRE | 
					
						
							| 
									
										
										
										
											2015-03-15 13:21:54 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-20 13:22:01 +01:00
										 |  |  | func NewJeth(ethApi *EthereumApi, toVal func(interface{}) otto.Value, re *jsre.JSRE) *Jeth { | 
					
						
							|  |  |  | 	return &Jeth{ethApi, toVal, re} | 
					
						
							| 
									
										
										
										
											2015-03-15 13:21:54 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-20 13:22:01 +01:00
										 |  |  | func (self *Jeth) err(code int, msg string, id interface{}) (response otto.Value) { | 
					
						
							| 
									
										
										
										
											2015-03-15 13:21:54 +07:00
										 |  |  | 	rpcerr := &RpcErrorObject{code, msg} | 
					
						
							| 
									
										
										
										
											2015-03-20 13:22:01 +01:00
										 |  |  | 	self.re.Set("ret_jsonrpc", jsonrpcver) | 
					
						
							|  |  |  | 	self.re.Set("ret_id", id) | 
					
						
							|  |  |  | 	self.re.Set("ret_error", rpcerr) | 
					
						
							|  |  |  | 	response, _ = self.re.Run(` | 
					
						
							|  |  |  | 		ret_response = { jsonrpc: ret_jsonrpc, id: ret_id, error: ret_error }; | 
					
						
							|  |  |  | 	`) | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2015-03-15 13:21:54 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *Jeth) Send(call otto.FunctionCall) (response otto.Value) { | 
					
						
							|  |  |  | 	reqif, err := call.Argument(0).Export() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return self.err(-32700, err.Error(), nil) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	jsonreq, err := json.Marshal(reqif) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var req RpcRequest | 
					
						
							|  |  |  | 	err = json.Unmarshal(jsonreq, &req) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var respif interface{} | 
					
						
							|  |  |  | 	err = self.ethApi.GetRequestReply(&req, &respif) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2015-04-02 14:00:49 +02:00
										 |  |  | 		fmt.Printf("error: %s\n", err) | 
					
						
							| 
									
										
										
										
											2015-03-15 13:21:54 +07:00
										 |  |  | 		return self.err(-32603, err.Error(), req.Id) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-20 13:22:01 +01:00
										 |  |  | 	self.re.Set("ret_jsonrpc", jsonrpcver) | 
					
						
							|  |  |  | 	self.re.Set("ret_id", req.Id) | 
					
						
							| 
									
										
										
										
											2015-03-24 23:50:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	res, _ := json.Marshal(respif) | 
					
						
							|  |  |  | 	self.re.Set("ret_result", string(res)) | 
					
						
							| 
									
										
										
										
											2015-03-20 13:22:01 +01:00
										 |  |  | 	response, err = self.re.Run(` | 
					
						
							| 
									
										
										
										
											2015-03-24 23:50:27 +01:00
										 |  |  | 		ret_response = { jsonrpc: ret_jsonrpc, id: ret_id, result: JSON.parse(ret_result) }; | 
					
						
							| 
									
										
										
										
											2015-03-20 13:22:01 +01:00
										 |  |  | 	`) | 
					
						
							| 
									
										
										
										
											2015-03-15 13:21:54 +07:00
										 |  |  | 	return | 
					
						
							|  |  |  | } |