From 5db6a4360ec783ec33ac3334d27012e7b4df57a2 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Tue, 3 Feb 2026 20:37:00 -0700 Subject: [PATCH] maybe --- src/adapt.go | 21 ++++++++++++++++++--- src/config.go | 37 +++++++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/adapt.go b/src/adapt.go index a8bfd13..215a301 100644 --- a/src/adapt.go +++ b/src/adapt.go @@ -23,15 +23,30 @@ func adapt(ctx context.Context, config Config, conn net.Conn) error { if err == io.EOF { return true, nil } - return false, err + return true, err } if len(message) > 0 { hashKey := message[max(0, len(message)-1)].(string) hash := int(crc32.ChecksumIEEE([]byte(hashKey))) forward := config.forwards[hash%len(config.forwards)] - result := forward.Do(ctx, message...) - _ = forward + forwardCon := forward.Get() + if forwardCon == nil { + return true, io.EOF + } + forwardConn := forwardCon.(net.Conn) + if _, err := forwardConn.Write(raw); err != nil { + return true, err + } + replyer := bufio.NewReader(forwardConn) + raw, _, err := readMessage(replyer) + if err != nil { + return true, err + } + log.Printf("%q", raw) + if _, err := conn.Write(raw); err != nil { + return true, err + } } return false, nil diff --git a/src/config.go b/src/config.go index 9cd3e8b..ea3ad69 100644 --- a/src/config.go +++ b/src/config.go @@ -3,17 +3,18 @@ package src import ( "context" "encoding/json" + "fmt" + "net" "os" "slices" "strings" - - valkey "github.com/redis/go-redis/v9" + "sync" ) type Config struct { Listen string `json:"LISTEN"` Forwards string `json:"FORWARDS"` - forwards []*valkey.Client + forwards []*sync.Pool } func NewConfig(ctx context.Context) (Config, error) { @@ -38,17 +39,19 @@ func NewConfig(ctx context.Context) (Config, error) { forwards := strings.Split(config.Forwards, ",") forwards = slices.DeleteFunc(forwards, func(s string) bool { return s == "" }) - config.forwards = make([]*valkey.Client, len(forwards)) + if len(forwards) == 0 { + return config, fmt.Errorf("at least one $FORWARD required") + } + config.forwards = make([]*sync.Pool, len(forwards)) for i := range forwards { - opt, err := valkey.ParseURL(forwards[i]) - if err != nil { - config.Close() - return config, err - } - config.forwards[i] = valkey.NewClient(opt) - if err != nil { - config.Close() - return config, err + config.forwards[i] = &sync.Pool{ + New: func() any { + v, err := (&net.Dialer{}).DialContext(ctx, "tcp", forwards[i]) + if err != nil { + return nil + } + return v + }, } } @@ -58,7 +61,13 @@ func NewConfig(ctx context.Context) (Config, error) { func (c Config) Close() { for i := range c.forwards { if c.forwards[i] != nil { - c.forwards[i].Close() + c.forwards[i].New = nil + for { + got := c.forwards[i].Get() + if got != nil { + got.(net.Conn).Close() + } + } } } }