@@ -11,6 +11,17 @@ import (
11
11
"google.golang.org/grpc"
12
12
)
13
13
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
+
14
25
// Client manages the mailboxConn it holds and refreshes it on connection
15
26
// retries.
16
27
type Client struct {
@@ -26,52 +37,57 @@ type Client struct {
26
37
27
38
sid [64 ]byte
28
39
29
- ctx context.Context
40
+ ctx context.Context //nolint:containedctx
30
41
}
31
42
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 ) {
42
47
43
48
sid , err := connData .SID ()
44
49
if err != nil {
45
50
return nil , err
46
51
}
47
52
48
- return & Client {
53
+ c := & Client {
49
54
ctx : ctx ,
50
55
serverHost : serverHost ,
51
56
connData : connData ,
52
- grpcClient : hashmailrpc .NewHashMailClient (mailboxGrpcConn ),
53
57
status : ClientStatusNotConnected ,
54
58
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
+ )
56
83
}
57
84
58
85
// NewWebsocketsClient creates a new Client object which will handle the mailbox
59
86
// connection and will use websockets to connect to the mailbox.
60
87
func NewWebsocketsClient (ctx context.Context , serverHost string ,
61
88
connData * ConnData ) (* Client , error ) {
62
89
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 )
75
91
}
76
92
77
93
// Dial returns a net.Conn abstraction over the mailbox connection. Dial is
0 commit comments