@@ -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.
1627type 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.
6087func 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