github.com/btccom/go-micro/v2@v2.9.3/codec/jsonrpc/server.go (about)

     1  package jsonrpc
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  
     8  	"github.com/btccom/go-micro/v2/codec"
     9  )
    10  
    11  type serverCodec struct {
    12  	dec *json.Decoder // for reading JSON values
    13  	enc *json.Encoder // for writing JSON values
    14  	c   io.Closer
    15  
    16  	// temporary work space
    17  	req  serverRequest
    18  	resp serverResponse
    19  }
    20  
    21  type serverRequest struct {
    22  	Method string           `json:"method"`
    23  	Params *json.RawMessage `json:"params"`
    24  	ID     interface{}      `json:"id"`
    25  }
    26  
    27  type serverResponse struct {
    28  	ID     interface{} `json:"id"`
    29  	Result interface{} `json:"result"`
    30  	Error  interface{} `json:"error"`
    31  }
    32  
    33  func newServerCodec(conn io.ReadWriteCloser) *serverCodec {
    34  	return &serverCodec{
    35  		dec: json.NewDecoder(conn),
    36  		enc: json.NewEncoder(conn),
    37  		c:   conn,
    38  	}
    39  }
    40  
    41  func (r *serverRequest) reset() {
    42  	r.Method = ""
    43  	if r.Params != nil {
    44  		*r.Params = (*r.Params)[0:0]
    45  	}
    46  	if r.ID != nil {
    47  		r.ID = nil
    48  	}
    49  }
    50  
    51  func (c *serverCodec) ReadHeader(m *codec.Message) error {
    52  	c.req.reset()
    53  	if err := c.dec.Decode(&c.req); err != nil {
    54  		return err
    55  	}
    56  	m.Method = c.req.Method
    57  	m.Id = fmt.Sprintf("%v", c.req.ID)
    58  	c.req.ID = nil
    59  	return nil
    60  }
    61  
    62  func (c *serverCodec) ReadBody(x interface{}) error {
    63  	if x == nil {
    64  		return nil
    65  	}
    66  	var params [1]interface{}
    67  	params[0] = x
    68  	return json.Unmarshal(*c.req.Params, &params)
    69  }
    70  
    71  var null = json.RawMessage([]byte("null"))
    72  
    73  func (c *serverCodec) Write(m *codec.Message, x interface{}) error {
    74  	var resp serverResponse
    75  	resp.ID = m.Id
    76  	resp.Result = x
    77  	if m.Error == "" {
    78  		resp.Error = nil
    79  	} else {
    80  		resp.Error = m.Error
    81  	}
    82  	return c.enc.Encode(resp)
    83  }
    84  
    85  func (c *serverCodec) Close() error {
    86  	return c.c.Close()
    87  }