diff --git a/client.go b/client.go
index 9d42cfc0519d816d76798de7c9248a1e1377db83..9746f739f27e0e94f39222fb27a5f60c725caa1f 100644
--- a/client.go
+++ b/client.go
@@ -616,7 +616,7 @@ func (c *Client) drainRead() {
 // read decodes RPC messages from a codec, feeding them into dispatch.
 func (c *Client) read(codec ServerCodec) {
 	for {
-		msgs, batch, err := codec.readBatch()
+		msgs, batch, err := codec.ReadBatch()
 		if _, ok := err.(*json.SyntaxError); ok {
 			codec.writeJSON(context.Background(), errorMessage(&parseError{err.Error()}))
 		}
diff --git a/http.go b/http.go
index 3a5da57ef213c893cf74bba74ed2cee95f300e7d..463686378d1e5b3d30078e317b1d6d1bc584349f 100644
--- a/http.go
+++ b/http.go
@@ -72,7 +72,7 @@ func (hc *httpConn) remoteAddr() string {
 	return hc.url
 }
 
-func (hc *httpConn) readBatch() ([]*jsonrpcMessage, bool, error) {
+func (hc *httpConn) ReadBatch() ([]*jsonrpcMessage, bool, error) {
 	<-hc.closeCh
 	return nil, false, io.EOF
 }
@@ -267,8 +267,8 @@ func (c *httpServerConn) PeerInfo() PeerInfo {
 	return c.pi
 }
 
-func (c *httpServerConn) readBatch() (messages []*jsonrpcMessage, batch bool, err error) {
-	return c.jc.readBatch()
+func (c *httpServerConn) ReadBatch() (messages []*jsonrpcMessage, batch bool, err error) {
+	return c.jc.ReadBatch()
 }
 
 func (c *httpServerConn) writeJSON(ctx context.Context, v any) error {
diff --git a/json.go b/json.go
index 5d2ef41de73282827303fa5276df167a2cc1f2b4..2cc9d99e09438f86fa08c8d83ae3c9d30ceb0c8d 100644
--- a/json.go
+++ b/json.go
@@ -225,7 +225,7 @@ func (c *jsonCodec) remoteAddr() string {
 	return c.remote
 }
 
-func (c *jsonCodec) readBatch() (messages []*jsonrpcMessage, batch bool, err error) {
+func (c *jsonCodec) ReadBatch() (messages []*jsonrpcMessage, batch bool, err error) {
 	// Decode the next JSON object in the input stream.
 	// This verifies basic syntax, etc.
 	var rawmsg json.RawMessage
diff --git a/server.go b/server.go
index ab37347a33578dcd1bff28247f6cb5a33becc453..4163d552f222d2407750edf3ef738fd894f97ee5 100644
--- a/server.go
+++ b/server.go
@@ -79,7 +79,7 @@ func (s *Server) serveSingleRequest(ctx context.Context, codec ServerCodec) {
 	defer h.close(io.EOF, nil)
 
 	// read the HTTP body
-	reqs, batch, err := codec.readBatch()
+	reqs, batch, err := codec.ReadBatch()
 	if err != nil {
 		if err != io.EOF {
 			codec.writeJSON(ctx, errorMessage(&invalidMessageError{"parse error"}))
diff --git a/types.go b/types.go
index 0cdeb630e838c5c3f5d496d1434d454b2e4aa5f2..5a0e309054e265e3e7f5c8e52f3756f596b0dd21 100644
--- a/types.go
+++ b/types.go
@@ -29,7 +29,7 @@ import (
 // multiple go-routines concurrently.
 type ServerCodec interface {
 	PeerInfo() PeerInfo
-	readBatch() (msgs []*jsonrpcMessage, isBatch bool, err error)
+	ReadBatch() (msgs []*jsonrpcMessage, isBatch bool, err error)
 	close()
 
 	jsonWriter