gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/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 "gitee.com/liuxuezhan/go-micro-v1.18.0/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 }