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

     1  // Package jsonrpc provides a json-rpc 1.0 codec
     2  package jsonrpc
     3  
     4  import (
     5  	"bytes"
     6  	"encoding/json"
     7  	"fmt"
     8  	"io"
     9  
    10  	"github.com/btccom/go-micro/v2/codec"
    11  )
    12  
    13  type jsonCodec struct {
    14  	buf *bytes.Buffer
    15  	mt  codec.MessageType
    16  	rwc io.ReadWriteCloser
    17  	c   *clientCodec
    18  	s   *serverCodec
    19  }
    20  
    21  func (j *jsonCodec) Close() error {
    22  	j.buf.Reset()
    23  	return j.rwc.Close()
    24  }
    25  
    26  func (j *jsonCodec) String() string {
    27  	return "json-rpc"
    28  }
    29  
    30  func (j *jsonCodec) Write(m *codec.Message, b interface{}) error {
    31  	switch m.Type {
    32  	case codec.Request:
    33  		return j.c.Write(m, b)
    34  	case codec.Response, codec.Error:
    35  		return j.s.Write(m, b)
    36  	case codec.Event:
    37  		data, err := json.Marshal(b)
    38  		if err != nil {
    39  			return err
    40  		}
    41  		_, err = j.rwc.Write(data)
    42  		return err
    43  	default:
    44  		return fmt.Errorf("Unrecognised message type: %v", m.Type)
    45  	}
    46  }
    47  
    48  func (j *jsonCodec) ReadHeader(m *codec.Message, mt codec.MessageType) error {
    49  	j.buf.Reset()
    50  	j.mt = mt
    51  
    52  	switch mt {
    53  	case codec.Request:
    54  		return j.s.ReadHeader(m)
    55  	case codec.Response:
    56  		return j.c.ReadHeader(m)
    57  	case codec.Event:
    58  		_, err := io.Copy(j.buf, j.rwc)
    59  		return err
    60  	default:
    61  		return fmt.Errorf("Unrecognised message type: %v", mt)
    62  	}
    63  }
    64  
    65  func (j *jsonCodec) ReadBody(b interface{}) error {
    66  	switch j.mt {
    67  	case codec.Request:
    68  		return j.s.ReadBody(b)
    69  	case codec.Response:
    70  		return j.c.ReadBody(b)
    71  	case codec.Event:
    72  		if b != nil {
    73  			return json.Unmarshal(j.buf.Bytes(), b)
    74  		}
    75  	default:
    76  		return fmt.Errorf("Unrecognised message type: %v", j.mt)
    77  	}
    78  	return nil
    79  }
    80  
    81  func NewCodec(rwc io.ReadWriteCloser) codec.Codec {
    82  	return &jsonCodec{
    83  		buf: bytes.NewBuffer(nil),
    84  		rwc: rwc,
    85  		c:   newClientCodec(rwc),
    86  		s:   newServerCodec(rwc),
    87  	}
    88  }