diff --git a/contrib/codecs/rdwr/client.go b/contrib/codecs/rdwr/client.go index c8ab73f76ade78233a18540263efbc108775abb0..6953a1f55775c072d8e9ea9ba835d0b4643c8653 100644 --- a/contrib/codecs/rdwr/client.go +++ b/contrib/codecs/rdwr/client.go @@ -10,6 +10,7 @@ import ( "gfx.cafe/open/jrpc/pkg/clientutil" "gfx.cafe/open/jrpc/pkg/jjson" "gfx.cafe/open/jrpc/pkg/jsonrpc" + "github.com/go-faster/jx" ) type Client struct { @@ -68,18 +69,9 @@ func (c *Client) listen() error { defer func() { _ = c.Close() }() - //jd := jx.GetDecoder() - //defer jx.PutDecoder(jd) - //jd.Reset(c.rd) - // for { - // msg, err := jd.RawAppend(nil) - // if err != nil { - // return err - // } - var msg json.RawMessage - dec := json.NewDecoder(bufio.NewReader(c.rd)) + jd := jx.Decode(c.rd, 4096*4) for { - err := dec.Decode(&msg) + msg, err := jd.Raw() if err != nil { return err } diff --git a/pkg/jsonrpc/json.go b/pkg/jsonrpc/json.go index b1b687347a478506a49aac30ad9865c1681c8643..d33d8e65288236f6754e144940de330ca555204e 100644 --- a/pkg/jsonrpc/json.go +++ b/pkg/jsonrpc/json.go @@ -89,7 +89,7 @@ func MarshalMessage(m *Message, enc *jx.Encoder) (err error) { return nil } -func UnmarshalMessage(m *Message, dec *jx.Decoder, doCopy bool) error { +func UnmarshalMessage(m *Message, dec *jx.Decoder) error { err := dec.Obj(func(d *jx.Decoder, key string) (err error) { switch key { default: @@ -97,9 +97,6 @@ func UnmarshalMessage(m *Message, dec *jx.Decoder, doCopy bool) error { if err != nil { return err } - if doCopy { - raw = append([]byte(nil), raw...) - } if m.Extensions == nil { m.Extensions = make(map[string]json.RawMessage) } @@ -130,18 +127,12 @@ func UnmarshalMessage(m *Message, dec *jx.Decoder, doCopy bool) error { if err != nil { return err } - if doCopy { - val = append([]byte(nil), val...) - } m.Params = json.RawMessage(val) case "result": val, err := d.Raw() if err != nil { return err } - if doCopy { - val = append([]byte(nil), val...) - } m.Result = io.NopCloser(bytes.NewBuffer(val)) case "error": val, err := d.Raw() @@ -165,8 +156,9 @@ func UnmarshalMessage(m *Message, dec *jx.Decoder, doCopy bool) error { func (m *Message) UnmarshalJSON(xs []byte) error { dec := jx.GetDecoder() defer jx.PutDecoder(dec) - dec.ResetBytes(xs) - return UnmarshalMessage(m, dec, true) + xsCopy := append([]byte(nil), xs...) + dec.ResetBytes(xsCopy) + return UnmarshalMessage(m, dec) } func (m Message) MarshalJSON() ([]byte, error) { @@ -228,22 +220,19 @@ func IsBatchMessage(raw json.RawMessage) bool { // is called. Any non-JSON-RPC messages in the input return the zero value of // Message. func ParseMessage(in json.RawMessage) ([]*Message, bool) { - return ReadMessage(jx.DecodeBytes(in), true) -} - -func ParseMessageCopyless(in json.RawMessage) ([]*Message, bool) { - return ReadMessage(jx.DecodeBytes(in), false) + inCopy := append([]byte(nil), in...) + return ReadMessage(jx.DecodeBytes(inCopy)) } // parseMessage parses raw bytes as a (batch of) JSON-RPC message(s). There are no error // checks in this function because the raw message has already been syntax-checked when it // is called. Any non-JSON-RPC messages in the input return the zero value of // Message. -func ReadMessage(dec *jx.Decoder, doCopy bool) ([]*Message, bool) { +func ReadMessage(dec *jx.Decoder) ([]*Message, bool) { msgs := []*Message{{}} switch dec.Next() { case jx.Object: - _ = UnmarshalMessage(msgs[0], dec, doCopy) + _ = UnmarshalMessage(msgs[0], dec) return msgs, false default: return msgs, false @@ -251,9 +240,14 @@ func ReadMessage(dec *jx.Decoder, doCopy bool) ([]*Message, bool) { msgs = []*Message{} dec.Arr(func(d *jx.Decoder) error { msg := new(Message) - err := UnmarshalMessage(msg, d, doCopy) + raw, err := d.Raw() if err != nil { msg = nil + } else { + err := UnmarshalMessage(msg, jx.DecodeBytes(raw)) + if err != nil { + msg = nil + } } msgs = append(msgs, msg) return nil