96 lines
2.0 KiB
Go
96 lines
2.0 KiB
Go
package jsonrpc
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"strings"
|
|
|
|
"golang.org/x/net/context"
|
|
"google.golang.org/grpc"
|
|
|
|
serverGrpc "git.loafle.net/overflow/overflow_api_server/golang"
|
|
"git.loafle.net/overflow/overflow_service_websocket/config"
|
|
"git.loafle.net/overflow/overflow_service_websocket/pool"
|
|
grpcPool "git.loafle.net/overflow/overflow_service_websocket/pool/grpc"
|
|
"git.loafle.net/overflow/overflow_service_websocket/protocol"
|
|
)
|
|
|
|
type Request struct {
|
|
Method string `json:"method"`
|
|
Params []string `json:"params,omitempty"`
|
|
}
|
|
|
|
type Response struct {
|
|
Result string `json:"result,omitempty"`
|
|
}
|
|
|
|
// NewHandler returns a new JSON RPC handler.
|
|
func NewHandler() protocol.Handler {
|
|
c := config.GetConfig().GRpc
|
|
|
|
addr := fmt.Sprintf("%s:%d", c.Ip, c.Port)
|
|
|
|
servicePool, err := grpcPool.New(1, 5,
|
|
func(conn *grpc.ClientConn) (interface{}, error) {
|
|
return serverGrpc.NewOverflowApiServerClient(conn), nil
|
|
},
|
|
func() (*grpc.ClientConn, error) {
|
|
return grpc.Dial(addr, grpc.WithInsecure())
|
|
},
|
|
)
|
|
if nil != err {
|
|
log.Fatal(err)
|
|
return nil
|
|
}
|
|
h := &handler{
|
|
pool: servicePool,
|
|
}
|
|
|
|
return h
|
|
}
|
|
|
|
// Codec creates a CodecRequest to process each request.
|
|
type handler struct {
|
|
pool pool.Pool
|
|
}
|
|
|
|
// NewRequest returns a CodecRequest.
|
|
func (h *handler) Handle(data []byte) ([]byte, *protocol.Error) {
|
|
req := Request{}
|
|
err := json.Unmarshal(data, &req)
|
|
if nil != err {
|
|
return nil, protocol.NewError(protocol.E_PARSE, err, nil)
|
|
}
|
|
|
|
parts := strings.Split(req.Method, ".")
|
|
|
|
si := &serverGrpc.ServerInput{
|
|
Target: parts[0],
|
|
Method: parts[1],
|
|
Params: req.Params,
|
|
}
|
|
|
|
c, err := h.pool.Get()
|
|
if nil != err {
|
|
return nil, protocol.NewError(protocol.E_INTERNAL, err, nil)
|
|
}
|
|
defer h.pool.Put(c)
|
|
client := c.(serverGrpc.OverflowApiServerClient)
|
|
out, err := client.Exec(context.Background(), si)
|
|
if err != nil {
|
|
return nil, protocol.NewError(protocol.E_SERVER, err, err)
|
|
}
|
|
|
|
res := &Response{
|
|
Result: out.Result,
|
|
}
|
|
|
|
r, err := json.Marshal(res)
|
|
if err != nil {
|
|
return nil, protocol.NewError(protocol.E_INTERNAL, err, nil)
|
|
}
|
|
|
|
return r, nil
|
|
}
|