Skip to content

Commit df80c87

Browse files
committed
mailbox: unify Client creation logic
1 parent 4dc43f8 commit df80c87

File tree

1 file changed

+42
-26
lines changed

1 file changed

+42
-26
lines changed

mailbox/client.go

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@ import (
1111
"google.golang.org/grpc"
1212
)
1313

14+
// ClientOption is the signature of a Client functional option.
15+
type ClientOption func(*Client)
16+
17+
// WithGrpcConn initialised the grpc client of the Client using the given
18+
// connection.
19+
func WithGrpcConn(conn *grpc.ClientConn) ClientOption {
20+
return func(client *Client) {
21+
client.grpcClient = hashmailrpc.NewHashMailClient(conn)
22+
}
23+
}
24+
1425
// Client manages the mailboxConn it holds and refreshes it on connection
1526
// retries.
1627
type Client struct {
@@ -26,52 +37,57 @@ type Client struct {
2637

2738
sid [64]byte
2839

29-
ctx context.Context
40+
ctx context.Context //nolint:containedctx
3041
}
3142

32-
// NewGrpcClient creates a new Client object which will handle the mailbox
33-
// connection and will use grpc streams to connect to the mailbox.
34-
func NewGrpcClient(ctx context.Context, serverHost string, connData *ConnData,
35-
dialOpts ...grpc.DialOption) (*Client, error) {
36-
37-
mailboxGrpcConn, err := grpc.Dial(serverHost, dialOpts...)
38-
if err != nil {
39-
return nil, fmt.Errorf("unable to connect to RPC server: %v",
40-
err)
41-
}
43+
// NewClient creates a new Client object which will handle the mailbox
44+
// connection.
45+
func NewClient(ctx context.Context, serverHost string, connData *ConnData,
46+
opts ...ClientOption) (*Client, error) {
4247

4348
sid, err := connData.SID()
4449
if err != nil {
4550
return nil, err
4651
}
4752

48-
return &Client{
53+
c := &Client{
4954
ctx: ctx,
5055
serverHost: serverHost,
5156
connData: connData,
52-
grpcClient: hashmailrpc.NewHashMailClient(mailboxGrpcConn),
5357
status: ClientStatusNotConnected,
5458
sid: sid,
55-
}, nil
59+
}
60+
61+
// Apply functional options.
62+
for _, o := range opts {
63+
o(c)
64+
}
65+
66+
return c, nil
67+
}
68+
69+
// NewGrpcClient creates a new Client object which will handle the mailbox
70+
// connection and will use grpc streams to connect to the mailbox.
71+
func NewGrpcClient(ctx context.Context, serverHost string, connData *ConnData,
72+
dialOpts ...grpc.DialOption) (*Client, error) {
73+
74+
mailboxGrpcConn, err := grpc.Dial(serverHost, dialOpts...)
75+
if err != nil {
76+
return nil, fmt.Errorf("unable to connect to RPC server: %w",
77+
err)
78+
}
79+
80+
return NewClient(
81+
ctx, serverHost, connData, WithGrpcConn(mailboxGrpcConn),
82+
)
5683
}
5784

5885
// NewWebsocketsClient creates a new Client object which will handle the mailbox
5986
// connection and will use websockets to connect to the mailbox.
6087
func NewWebsocketsClient(ctx context.Context, serverHost string,
6188
connData *ConnData) (*Client, error) {
6289

63-
sid, err := connData.SID()
64-
if err != nil {
65-
return nil, err
66-
}
67-
68-
return &Client{
69-
ctx: ctx,
70-
serverHost: serverHost,
71-
connData: connData,
72-
status: ClientStatusNotConnected,
73-
sid: sid,
74-
}, nil
90+
return NewClient(ctx, serverHost, connData)
7591
}
7692

7793
// Dial returns a net.Conn abstraction over the mailbox connection. Dial is

0 commit comments

Comments
 (0)