package codec import ( "bufio" "encoding/json" "fmt" "io" ) type JsonCodec struct { conn io.ReadWriteCloser buf *bufio.Writer dec *json.Decoder enc *json.Encoder } func (j *JsonCodec) Close() error { return j.conn.Close() } func (j *JsonCodec) ReadHeader(h *Header) error { return j.dec.Decode(h) } func (j *JsonCodec) ReadBody(body interface{}) error { return j.dec.Decode(body) } func (j *JsonCodec) Write(header *Header, body interface{}) (err error) { defer func() { _ = j.buf.Flush() if err != nil { _ = j.Close() } }() if err = j.enc.Encode(header); err != nil { return fmt.Errorf("rpc codec: json error encoding header: %v", err) } if err = j.enc.Encode(body); err != nil { return fmt.Errorf("rpc codec: json error encoding body: %v", err) } return nil } var _ Codec = (*JsonCodec)(nil) func NewJsonCodec(conn io.ReadWriteCloser) Codec { buf := bufio.NewWriter(conn) return &JsonCodec{ conn: conn, buf: buf, dec: json.NewDecoder(conn), enc: json.NewEncoder(buf), } }