73 lines
1.2 KiB
Go
73 lines
1.2 KiB
Go
package jsonrpc
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"io"
|
|
"log"
|
|
|
|
gws "git.loafle.net/overflow/overflow_gateway_websocket"
|
|
)
|
|
|
|
type MessageHandler interface {
|
|
gws.MessageHandler
|
|
}
|
|
|
|
type messageHandler struct {
|
|
ctx context.Context
|
|
o *Options
|
|
}
|
|
|
|
func NewHandler(ctx context.Context, o *Options) MessageHandler {
|
|
h := &messageHandler{
|
|
ctx: ctx,
|
|
o: o,
|
|
}
|
|
|
|
return h
|
|
}
|
|
|
|
func (h *messageHandler) OnMessage(soc gws.Socket, messageType int, r io.Reader) []byte {
|
|
var err error
|
|
req := &ServerRequest{}
|
|
err = json.NewDecoder(r).Decode(req)
|
|
if err != nil {
|
|
}
|
|
|
|
var result []byte
|
|
|
|
if nil != req.Id {
|
|
result = h.onRequest(soc, req)
|
|
} else {
|
|
h.onNotify(soc, req)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
func (h *messageHandler) onRequest(soc gws.Socket, req *ServerRequest) []byte {
|
|
var err error
|
|
result, err := h.o.OnRequest(soc, req.Method, req.Params)
|
|
|
|
res := &ServerResponse{
|
|
Protocol: req.Protocol,
|
|
Result: result,
|
|
Error: err,
|
|
Id: req.Id,
|
|
}
|
|
|
|
j, err := json.Marshal(res)
|
|
if nil != err {
|
|
log.Printf("JSON RPC error: %v", err)
|
|
}
|
|
|
|
return j
|
|
}
|
|
|
|
func (h *messageHandler) onNotify(soc gws.Socket, req *ServerRequest) {
|
|
err := h.o.OnNotify(soc, req.Method, req.Params)
|
|
if nil != err {
|
|
log.Printf("JSON RPC error: %v", err)
|
|
}
|
|
}
|