101 lines
2.1 KiB
Go
101 lines
2.1 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
|
|
}
|
|
|
|
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
|
|
}
|
|
if err := lnprototestServer.Connect(connect.NodeId, connect.Port, wire.SimNet); err != nil {
|
|
return err
|
|
}
|
|
*response = *request
|
|
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
|
|
}
|
|
}
|
|
}
|