rpc_safe_guard_01/pkg/otto/otto.go

74 lines
1.5 KiB
Go
Raw Permalink Normal View History

2023-07-13 17:39:26 +08:00
package otto
import (
"encoding/json"
"errors"
"github.com/robertkrimen/otto"
"rpc_safe_guard_01/pkg/interpreter"
"rpc_safe_guard_01/pkg/okrpc"
)
const (
RpcServiceName = "rpcRequest"
RpcName = "gw"
ExitName = "exit"
)
var ErrorCodeMap = map[int]string{
10001: "rpc request error",
}
func InitOtto() {
// 注册通用方法到otto里
instance := interpreter.GetInstance()
err := instance.Set(RpcName, map[string]interface{}{
RpcServiceName: call,
ExitName: exit,
})
if err != nil {
panic(err)
}
}
func call(call otto.FunctionCall) otto.Value {
if len(call.ArgumentList) != 2 {
value, _ := otto.ToValue(errors.New("argument invalid"))
return value
}
rpcName := call.Argument(0)
param := call.Argument(1)
p, err := param.ToString()
if err != nil {
value, _ := otto.ToValue(err)
return value
}
var args []interface{}
err = json.Unmarshal([]byte(p), &args)
if err != nil {
value, _ := otto.ToValue(err)
return value
}
var req okrpc.Request
req.Class = rpcName.String()
req.Method = "executeChain"
req.Args = args
resp, err := req.SendRpcRequest()
if err != nil {
value, _ := otto.ToValue(err)
return value
}
value, _ := otto.ToValue(resp)
return value
}
func exit(call otto.FunctionCall) otto.Value {
code, err := call.Argument(0).ToInteger()
if err != nil {
value, _ := otto.ToValue(errors.New("the code is not number"))
return value
}
// 此处传入Api Error Code先用map代替
value, _ := otto.ToValue(ErrorCodeMap[int(code)])
return value
}