From 677776244c261e122e8c311eabee432e7565fcf0 Mon Sep 17 00:00:00 2001
From: a <a@tuxpa.in>
Date: Wed, 22 Nov 2023 12:23:23 -0600
Subject: [PATCH] more dependency reduction

---
 cmd/jrpcc/main.go                             | 118 ------------------
 cmd/jrpcc/test.script                         |   6 -
 contrib/codecs/http/client.go                 |  18 +--
 contrib/codecs/rdwr/client.go                 |  10 +-
 .../extension/subscription/subscription.go    |   4 +-
 .../handlers/argreflect/reflect_handler.go    |   2 -
 go.mod                                        |   8 +-
 go.sum                                        |  12 --
 pkg/clientutil/helper.go                      |  23 ----
 pkg/jjson/json.go                             |  14 ++-
 pkg/jjson/pool.go                             |  47 +++++++
 pkg/server/server.go                          |   6 +-
 12 files changed, 76 insertions(+), 192 deletions(-)
 delete mode 100644 cmd/jrpcc/main.go
 delete mode 100644 cmd/jrpcc/test.script
 create mode 100644 pkg/jjson/pool.go

diff --git a/cmd/jrpcc/main.go b/cmd/jrpcc/main.go
deleted file mode 100644
index 4966aff..0000000
--- a/cmd/jrpcc/main.go
+++ /dev/null
@@ -1,118 +0,0 @@
-package main
-
-import (
-	"bufio"
-	"context"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"os"
-	"strings"
-
-	"gfx.cafe/open/jrpc"
-	"sigs.k8s.io/yaml"
-)
-
-func main() {
-	scan := bufio.NewReader(os.Stdin)
-	ctx := context.Background()
-	c := &cli{}
-	c.silent(`commands:
-  [m]ethod, [d]ial, [s]end, [p]arams, [c]lient, [q]uit
-	`)
-	for {
-		if err := c.tick(ctx, scan); err != nil {
-			if !errors.Is(err, context.Canceled) {
-				c.silent("%s", err)
-			}
-			break
-		}
-	}
-}
-
-type cli struct {
-	remote  string
-	method  string
-	params  json.RawMessage
-	verbose bool
-
-	conn jrpc.Conn
-}
-
-func (c *cli) silent(s string, args ...any) {
-	if c.verbose {
-		fmt.Printf(s+"\n", args...)
-	}
-}
-
-func (c *cli) tick(ctx context.Context, scan *bufio.Reader) error {
-	cmd, err := scan.ReadString('\n')
-	if err != nil {
-		return err
-	}
-	cmd = strings.TrimSpace(cmd)
-	if cmd == "" {
-		return nil
-	}
-	splt := strings.SplitN(cmd, " ", 2)
-	if len(splt) == 0 {
-		return nil
-	}
-	switch splt[0] {
-	case "d", "dial":
-		if len(splt) == 1 {
-			c.silent("need to specify url to dial to")
-			return nil
-		}
-		c.conn, err = jrpc.DialContext(ctx, splt[1])
-		if err != nil {
-			return fmt.Errorf("failed to dial: %w", err)
-		}
-		c.remote = splt[1]
-		c.silent("connected to %s", splt[1])
-	case "m", "method":
-		if len(splt) == 1 {
-			fmt.Println("need to specify method to use")
-			return nil
-		}
-		c.method = splt[1]
-		c.silent("method to %s", splt[1])
-	case "p", "params":
-		nextExit := false
-		bts := []byte(splt[1])
-		for {
-			tmp, err := scan.ReadBytes('\n')
-			if err != nil {
-				return err
-			}
-			if len(tmp) == 1 {
-				if nextExit {
-					break
-				}
-				nextExit = true
-				continue
-			}
-			bts = append(bts, tmp...)
-		}
-		var m any
-		err = yaml.Unmarshal(bts, &m)
-		if err != nil {
-			return err
-		}
-		c.params, _ = json.Marshal(m)
-	case "c", "client":
-		fmt.Printf(
-			`
-remote: %s
-method: %s
-params: %s
-`, c.remote, c.method, c.params)
-	case "s", "send":
-		var res json.RawMessage
-		c.conn.Do(ctx, &res, c.method, c.params)
-		fmt.Println(string(res))
-	case "q", "quit", "exit":
-		os.Exit(0)
-	}
-	return nil
-}
diff --git a/cmd/jrpcc/test.script b/cmd/jrpcc/test.script
deleted file mode 100644
index ca4ba17..0000000
--- a/cmd/jrpcc/test.script
+++ /dev/null
@@ -1,6 +0,0 @@
-d wss://mainnet.rpc.gfx.xyz
-m eth_getBlockByNumber
-p [1500000, true]
-
-
-send
diff --git a/contrib/codecs/http/client.go b/contrib/codecs/http/client.go
index 62e297b..1937fa7 100644
--- a/contrib/codecs/http/client.go
+++ b/contrib/codecs/http/client.go
@@ -12,12 +12,9 @@ import (
 	"sync"
 	"sync/atomic"
 
+	"gfx.cafe/open/jrpc/pkg/jjson"
 	"gfx.cafe/open/jrpc/pkg/jsonrpc"
 	"golang.org/x/net/http2"
-
-	"gfx.cafe/util/go/bufpool"
-
-	"gfx.cafe/open/jrpc/pkg/clientutil"
 )
 
 var (
@@ -104,8 +101,7 @@ func (c *Client) Do(ctx context.Context, result any, method string, params any)
 			Body:       b,
 		}
 	}
-	msg := clientutil.GetMessage()
-	defer clientutil.PutMessage(msg)
+	msg := &jsonrpc.Message{}
 
 	err = json.NewDecoder(resp.Body).Decode(&msg)
 	if err != nil {
@@ -146,14 +142,18 @@ func (c *Client) Closed() <-chan struct{} {
 
 func (c *Client) post(req *jsonrpc.Request) (*http.Response, error) {
 	// TODO: use buffer for this
-	buf := bufpool.GetStd()
-	defer bufpool.PutStd(buf)
+	buf := jjson.GetBuf()
+	defer jjson.PutBuf(buf)
 	buf.Reset()
 	err := json.NewEncoder(buf).Encode(req)
 	if err != nil {
 		return nil, err
 	}
-	return c.postBuf(req.Context(), buf)
+	resp, err := c.postBuf(req.Context(), buf)
+	if err != nil {
+		return nil, err
+	}
+	return resp, nil
 }
 
 func (c *Client) postBuf(ctx context.Context, rd io.Reader) (*http.Response, error) {
diff --git a/contrib/codecs/rdwr/client.go b/contrib/codecs/rdwr/client.go
index 9008596..a8303ae 100644
--- a/contrib/codecs/rdwr/client.go
+++ b/contrib/codecs/rdwr/client.go
@@ -8,8 +8,8 @@ import (
 	"sync"
 
 	"gfx.cafe/open/jrpc/pkg/clientutil"
+	"gfx.cafe/open/jrpc/pkg/jjson"
 	"gfx.cafe/open/jrpc/pkg/jsonrpc"
-	"gfx.cafe/util/go/bufpool"
 )
 
 type Client struct {
@@ -110,17 +110,11 @@ func (c *Client) listen() error {
 
 func (c *Client) Do(ctx context.Context, result any, method string, params any) error {
 	id := c.p.NextId()
-	buf := bufpool.GetStd()
-	defer bufpool.PutStd(buf)
 	req, err := jsonrpc.NewRequest(ctx, jsonrpc.NewId(id), method, params)
 	if err != nil {
 		return err
 	}
-	err = json.NewEncoder(buf).Encode(req)
-	if err != nil {
-		return err
-	}
-	err = c.writeContext(req.Context(), buf.Bytes())
+	err = jjson.MarshalAndEncode(c.wr, req)
 	if err != nil {
 		return err
 	}
diff --git a/contrib/extension/subscription/subscription.go b/contrib/extension/subscription/subscription.go
index 61b1f34..f7aaba9 100644
--- a/contrib/extension/subscription/subscription.go
+++ b/contrib/extension/subscription/subscription.go
@@ -2,6 +2,7 @@ package subscription
 
 import (
 	"context"
+	"crypto/rand"
 	"encoding/binary"
 	"encoding/hex"
 	"encoding/json"
@@ -12,7 +13,6 @@ import (
 
 	"gfx.cafe/open/jrpc/pkg/jjson"
 	"gfx.cafe/open/jrpc/pkg/jsonrpc"
-	"gfx.cafe/util/go/frand"
 )
 
 var serviceMethodSeparator = "/"
@@ -52,7 +52,7 @@ func NewID() SubID {
 func randomIDGenerator() func() SubID {
 	return func() SubID {
 		id := make([]byte, 32)
-		frand.Read(id)
+		rand.Read(id)
 		id = binary.LittleEndian.AppendUint64(id, uint64(globalInc.Add(1)))
 		return encodeSubID(id)
 	}
diff --git a/contrib/handlers/argreflect/reflect_handler.go b/contrib/handlers/argreflect/reflect_handler.go
index 58d7be9..22bf92d 100644
--- a/contrib/handlers/argreflect/reflect_handler.go
+++ b/contrib/handlers/argreflect/reflect_handler.go
@@ -6,7 +6,6 @@ import (
 	"unicode"
 
 	"gfx.cafe/open/jrpc/pkg/jsonrpc"
-	"github.com/davecgh/go-spew/spew"
 )
 
 var (
@@ -143,7 +142,6 @@ func (c *callback) makeArgTypes() jsonrpc.Handler {
 			if !c.rcvr.IsValid() {
 				cb, ok := c.fn.Interface().(func(jsonrpc.ResponseWriter, *jsonrpc.Request))
 				if !ok {
-					spew.Println("bad callback:", c)
 					panic("invalid callback registered")
 				}
 				return jsonrpc.HandlerFunc(cb)
diff --git a/go.mod b/go.mod
index 50d74b4..9d85a32 100644
--- a/go.mod
+++ b/go.mod
@@ -4,20 +4,15 @@ go 1.21
 
 require (
 	gfx.cafe/open/websocket v1.9.2
-	gfx.cafe/util/go/bufpool v0.0.0-20230721185457-c559e86c829c
-	gfx.cafe/util/go/frand v0.0.0-20230721185457-c559e86c829c
-	gfx.cafe/util/go/generic v0.0.0-20230721185457-c559e86c829c
-	github.com/davecgh/go-spew v1.1.1
 	github.com/go-faster/jx v1.1.0
 	github.com/json-iterator/go v1.1.12
 	github.com/stretchr/testify v1.8.4
 	golang.org/x/net v0.17.0
 	golang.org/x/sync v0.4.0
-	sigs.k8s.io/yaml v1.3.0
 )
 
 require (
-	github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect
+	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/go-faster/errors v0.6.1 // indirect
 	github.com/klauspost/compress v1.17.0 // indirect
 	github.com/kr/pretty v0.3.1 // indirect
@@ -29,6 +24,5 @@ require (
 	golang.org/x/sys v0.13.0 // indirect
 	golang.org/x/text v0.13.0 // indirect
 	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
-	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )
diff --git a/go.sum b/go.sum
index b251c09..835b9fe 100644
--- a/go.sum
+++ b/go.sum
@@ -1,13 +1,5 @@
 gfx.cafe/open/websocket v1.9.2 h1:WePNf2xJ/TFfIXQAHWwVJ5Qa2PZNcf1WwrZAZkvrs9w=
 gfx.cafe/open/websocket v1.9.2/go.mod h1:HVqrW2llBPBeRV6htwgKzTe/0jKyPofDG4GY8LSyKW4=
-gfx.cafe/util/go/bufpool v0.0.0-20230721185457-c559e86c829c h1:vhRmvfpB4dEg/IRXmB6rm8A66tvrm1HNkyIITaxQOdA=
-gfx.cafe/util/go/bufpool v0.0.0-20230721185457-c559e86c829c/go.mod h1:+DiyiCOBGS9O9Ce4ewHQO3Y59h66WSWAbgZZ2O2AYYw=
-gfx.cafe/util/go/frand v0.0.0-20230721185457-c559e86c829c h1:ZCCkzLPmcbw9tcON8DOx7YMZQIRzd/Z+5RH8bcvrNsA=
-gfx.cafe/util/go/frand v0.0.0-20230721185457-c559e86c829c/go.mod h1:LNHxMJl0WnIr5+OChYxlVopxk+j7qxZv0XvWCzB6uGE=
-gfx.cafe/util/go/generic v0.0.0-20230721185457-c559e86c829c h1:alCfDKmPC0EC0KGlZWrNF0hilVWBkzMz+aAYTJ/2hY4=
-gfx.cafe/util/go/generic v0.0.0-20230721185457-c559e86c829c/go.mod h1:WvSX4JsCRBuIXj0FRBFX9YLg+2SoL3w8Ww19uZO9yNE=
-github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
-github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -62,9 +54,5 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
-sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
diff --git a/pkg/clientutil/helper.go b/pkg/clientutil/helper.go
index 3fd99c5..f26d68c 100644
--- a/pkg/clientutil/helper.go
+++ b/pkg/clientutil/helper.go
@@ -1,24 +1 @@
 package clientutil
-
-import (
-	"gfx.cafe/util/go/generic"
-
-	"gfx.cafe/open/jrpc/pkg/jsonrpc"
-)
-
-var msgPool = generic.HookPool[*jsonrpc.Message]{
-	New: func() *jsonrpc.Message {
-		return &jsonrpc.Message{}
-	},
-	FnPut: func(msg *jsonrpc.Message) {
-		*msg = jsonrpc.Message{}
-	},
-}
-
-func GetMessage() *jsonrpc.Message {
-	return msgPool.Get()
-}
-
-func PutMessage(x *jsonrpc.Message) {
-	msgPool.Put(x)
-}
diff --git a/pkg/jjson/json.go b/pkg/jjson/json.go
index 5537bea..5bda960 100644
--- a/pkg/jjson/json.go
+++ b/pkg/jjson/json.go
@@ -7,12 +7,25 @@ import (
 	jsoniter "github.com/json-iterator/go"
 )
 
+var encPool = NewPool()
+
 var jConfig = jsoniter.Config{
 	ValidateJsonRawMessage: false,
 	EscapeHTML:             false,
 	SortMapKeys:            true,
 }.Froze()
 
+func MarshalAndEncode(w io.Writer, v any) error {
+	d := encPool.Get()
+	defer encPool.Put(d)
+	err := Encode(w, v)
+	if err != nil {
+		return err
+	}
+	_, err = d.WriteTo(w)
+	return err
+}
+
 func Encode(w io.Writer, v any) error {
 	s := jConfig.BorrowStream(w)
 	defer jConfig.ReturnStream(s)
@@ -31,7 +44,6 @@ func Unmarshal(xs []byte, v any) error {
 }
 
 func Marshal(v any) ([]byte, error) {
-
 	out := &bytes.Buffer{}
 	s := jConfig.BorrowStream(out)
 	defer jConfig.ReturnStream(s)
diff --git a/pkg/jjson/pool.go b/pkg/jjson/pool.go
new file mode 100644
index 0000000..15a76f4
--- /dev/null
+++ b/pkg/jjson/pool.go
@@ -0,0 +1,47 @@
+package jjson
+
+import (
+	"bytes"
+	"sync"
+)
+
+var globalPool *pool
+
+func init() {
+	globalPool = NewPool()
+}
+
+// New returns a new object of the Buffers Pool
+func NewPool() *pool {
+	p := pool{
+		pool: sync.Pool{
+			New: func() any {
+				return new(bytes.Buffer)
+			},
+		},
+	}
+
+	return &p
+}
+
+type pool struct {
+	pool sync.Pool
+}
+
+func (p *pool) Get() *bytes.Buffer {
+	return p.pool.Get().(*bytes.Buffer)
+}
+func (p *pool) Put(buf *bytes.Buffer) {
+	buf.Reset()
+	p.pool.Put(buf)
+}
+
+// Get returns a buffer from the pool or creates a new one
+func GetBuf() *bytes.Buffer {
+	return globalPool.Get()
+}
+
+// Put resets and puts back a given buffer to the pool
+func PutBuf(buf *bytes.Buffer) {
+	globalPool.Put(buf)
+}
diff --git a/pkg/server/server.go b/pkg/server/server.go
index dad9053..3e6a186 100644
--- a/pkg/server/server.go
+++ b/pkg/server/server.go
@@ -12,8 +12,6 @@ import (
 	"gfx.cafe/open/jrpc/pkg/jjson"
 	"gfx.cafe/open/jrpc/pkg/jsonrpc"
 
-	"gfx.cafe/util/go/bufpool"
-
 	"github.com/go-faster/jx"
 )
 
@@ -358,8 +356,8 @@ type notifyEnv struct {
 func (c *callResponder) notify(ctx context.Context, env *notifyEnv) (err error) {
 	msg := &jsonrpc.Message{}
 	//  allocate a temp buffer for this packet
-	buf := bufpool.GetStd()
-	defer bufpool.PutStd(buf)
+	buf := jjson.GetBuf()
+	defer jjson.PutBuf(buf)
 	err = jjson.Encode(buf, env.dat)
 	if err != nil {
 		msg.Error = err
-- 
GitLab