lnprototest-v2/server/rpc.go

109 lines
2.3 KiB
Go

package server
import (
"bytes"
"context"
"encoding/hex"
"encoding/json"
"fmt"
"github.com/btcsuite/btcd/wire"
"github.com/sourcegraph/jsonrpc2"
)
type ConnectRPC struct {
NodeId string
Port uint32
// Afeter the connection we should have a
// init message from the node
Msg string
}
func ConnectCall(request *json.RawMessage, response *json.RawMessage) error {
var connect ConnectRPC
fmt.Println(string(*request))
if err := json.Unmarshal(*request, &connect); err != nil {
return nil
}
resp, err := lnprototestServer.Connect(connect.NodeId, connect.Port, wire.SimNet)
if err != nil {
return err
}
connect.Msg = hex.EncodeToString(resp.Bytes())
*response, err = json.Marshal(connect)
if err != nil {
return err
}
return nil
}
type SendRPC struct {
Msg string
}
func SendCall(request *json.RawMessage, response *json.RawMessage) error {
var sendCall SendRPC
if err := json.Unmarshal(*request, &sendCall); err != nil {
return nil
}
buff, err := hex.DecodeString(sendCall.Msg)
if err != nil {
return err
}
if err := lnprototestServer.Send(bytes.NewBuffer(buff)); err != nil {
return err
}
buffResp, err := lnprototestServer.Receive()
if err != nil {
return err
}
if buffResp == nil {
return fmt.Errorf("empty answer from the node")
}
sendCall.Msg = hex.EncodeToString(buffResp.Bytes())
*response, err = json.Marshal(sendCall)
return err
}
type RPCHandler struct{}
// Handle implements the jsonrpc2.Handler interface.
func (h *RPCHandler) Handle(ctx context.Context, c *jsonrpc2.Conn, r *jsonrpc2.Request) {
switch r.Method {
case "connect":
var response json.RawMessage
if err := ConnectCall(r.Params, &response); err != nil {
if err := c.ReplyWithError(ctx, r.ID, &jsonrpc2.Error{
Code: -1,
Message: fmt.Sprintf("%s", err),
Data: nil,
}); err != nil {
return
}
}
if err := c.Reply(ctx, r.ID, response); err != nil {
return
}
case "send":
var response json.RawMessage
if err := SendCall(r.Params, &response); err != nil {
if err := c.ReplyWithError(ctx, r.ID, &jsonrpc2.Error{
Code: -1,
Message: fmt.Sprintf("%s", err),
Data: nil,
}); err != nil {
return
}
}
default:
err := &jsonrpc2.Error{Code: jsonrpc2.CodeMethodNotFound, Message: "Method not found"}
if err := c.ReplyWithError(ctx, r.ID, err); err != nil {
return
}
}
}