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