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