From 0ccdaeac26353509c24b7d9f7104d94df96ee6b8 Mon Sep 17 00:00:00 2001
From: a <a@tuxpa.in>
Date: Fri, 4 Aug 2023 04:12:42 -0500
Subject: [PATCH] shitty

---
 contrib/client/reconnecting.go | 69 ++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)
 create mode 100644 contrib/client/reconnecting.go

diff --git a/contrib/client/reconnecting.go b/contrib/client/reconnecting.go
new file mode 100644
index 0000000..ebafc1c
--- /dev/null
+++ b/contrib/client/reconnecting.go
@@ -0,0 +1,69 @@
+package client
+
+import (
+	"context"
+	"sync"
+
+	"gfx.cafe/open/jrpc"
+	"gfx.cafe/open/jrpc/pkg/codec"
+)
+
+type Reconnecting struct {
+	dialer     func(ctx context.Context) (jrpc.Conn, error)
+	base       codec.Conn
+	middleware []codec.Middleware
+
+	mu sync.Mutex
+}
+
+func NewReconnecting(dialer func(ctx context.Context) (jrpc.Conn, error)) *Reconnecting {
+	r := &Reconnecting{
+		dialer: dialer,
+	}
+	return r
+}
+
+func (r *Reconnecting) getClient(ctx context.Context) (jrpc.Conn, error) {
+
+	return r.base, nil
+}
+
+func (r *Reconnecting) Do(ctx context.Context, result any, method string, params any) error {
+	errChan := make(chan error)
+	go func() {
+		conn, err := r.getClient(ctx)
+		if err != nil {
+			errChan <- err
+			return
+		}
+		errChan <- conn.Do(ctx, result, method, params)
+	}()
+	return <-errChan
+}
+
+func (r *Reconnecting) BatchCall(ctx context.Context, b ...*codec.BatchElem) error {
+	errChan := make(chan error)
+	go func() {
+		conn, err := r.getClient(ctx)
+		if err != nil {
+			errChan <- err
+			return
+		}
+		errChan <- conn.BatchCall(ctx, b...)
+	}()
+	return <-errChan
+}
+
+func (r *Reconnecting) Mount(m codec.Middleware) {
+	r.middleware = append(r.middleware, m)
+}
+
+// why would you want to do this....
+func (r *Reconnecting) Close() error {
+	return nil
+}
+
+// never....
+func (r *Reconnecting) Closed() <-chan struct{} {
+	return make(<-chan struct{})
+}
-- 
GitLab