diff --git a/contrib/client/reconnecting.go b/contrib/client/reconnecting.go new file mode 100644 index 0000000000000000000000000000000000000000..ebafc1c60d87c7ab650c20694dbe8dc9d75df4fe --- /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{}) +}