crusader e759caacb7 ing
2017-07-26 19:00:39 +09:00

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
}