forked from northwesternmutual/grammes
-
Notifications
You must be signed in to change notification settings - Fork 4
/
configuration.go
170 lines (148 loc) · 5.31 KB
/
configuration.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
// Copyright (c) 2018 Northwestern Mutual.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
package grammes
import (
"strconv"
"time"
"github.com/northwesternmutual/grammes/gremconnect"
"golang.org/x/sync/semaphore"
"github.com/northwesternmutual/grammes/logging"
)
// ClientConfiguration is the type used for configuring
// and changing values in the client and the dialer.
type ClientConfiguration func(*Client)
// WithErrorChannel will assign an error channel to send
// connection errors through for the user to handle.
func WithErrorChannel(err chan error) ClientConfiguration {
return func(c *Client) {
c.err = err
}
}
// WithLogger will replace the default zap.Logger with a
// custom logger that implements the logging.Logger interface.
func WithLogger(newLogger logging.Logger) ClientConfiguration {
return func(c *Client) {
c.logger = newLogger
}
}
// WithGremlinVersion sets the version of the gremlin traversal
// language being used by the client.
func WithGremlinVersion(versionNumber int) ClientConfiguration {
return func(c *Client) {
c.gremlinVersion = strconv.Itoa(versionNumber)
}
}
// WithMaxConcurrentMessages sets the limit as to how many
// requests can be stored in the requests buffer.
func WithMaxConcurrentMessages(limit int) ClientConfiguration {
return func(c *Client) {
c.request = make(chan []byte, limit)
}
}
// WithMaxConcurrentRequests sets the limit as to how many
// requests can done simultaneously.
func WithMaxConcurrentRequests(limit int) ClientConfiguration {
return func(c *Client) {
c.requestSemaphore = semaphore.NewWeighted(int64(limit))
}
}
// WithAuthUserPass sets the authentication credentials
// within the dialer. (This includes the username and password)
func WithAuthUserPass(user, pass string) ClientConfiguration {
return func(c *Client) {
c.conn.SetAuth(user, pass)
}
}
// WithHTTPAuth sets the authentication provider
// within the dialer
func WithHTTPAuth(provider gremconnect.AuthProvider) ClientConfiguration {
return func(c *Client) {
c.conn.SetHTTPAuth(provider)
}
}
// WithTimeout sets the timeout to wait when dialing
// with the dialer in seconds.
func WithTimeout(interval time.Duration) ClientConfiguration {
return func(c *Client) {
c.conn.SetTimeout(interval)
}
}
// WithPingInterval sets the interval of ping sending for know is
// connection is alive and in consequence the client is connected.
func WithPingInterval(interval time.Duration) ClientConfiguration {
return func(c *Client) {
c.conn.SetPingInterval(interval)
}
}
// WithWritingWait sets the time to wait when
// writing with the dialer in seconds.
func WithWritingWait(interval time.Duration) ClientConfiguration {
return func(c *Client) {
c.conn.SetWritingWait(interval)
}
}
// WithReadingWait sets the time to wait when
// reading with the dialer in seconds.
func WithReadingWait(interval time.Duration) ClientConfiguration {
return func(c *Client) {
c.conn.SetReadingWait(interval)
}
}
// WithRequestTimeout sets the timeout when
// reading a request from the gremlin server
func WithRequestTimeout(interval time.Duration) ClientConfiguration {
return func(c *Client) {
c.requestTimeout = interval
}
}
// WithWriteBufferSize sets the max write buffer size
// for the websocket frame
func WithWriteBufferSize(writeBufferSize int) ClientConfiguration {
return func(c *Client) {
c.conn.SetWriteBufferSize(writeBufferSize)
}
}
// WithWriteBufferResizing enables dynamic write buffer expansion, effectively disabling
// websocket frame fragmentation (which TinkerPop doesn't support)
func WithWriteBufferResizing(writeBufferResizing bool) ClientConfiguration {
return func(c *Client) {
c.conn.SetWriteBufferResizing(writeBufferResizing)
}
}
// WithReadBufferSize sets the max read buffer size
// for the websocket frame
func WithReadBufferSize(readBufferSize int) ClientConfiguration {
return func(c *Client) {
c.conn.SetReadBufferSize(readBufferSize)
}
}
// WithHandshakeTimeout sets the websocket handshake timeout
func WithHandshakeTimeout(handshakeTimeout time.Duration) ClientConfiguration {
return func(c *Client) {
c.conn.SetHandshakeTimeout(handshakeTimeout)
}
}
// WithCompression sets the compression
// flag for websocket connections
func WithCompression(enableCompression bool) ClientConfiguration {
return func(c *Client) {
c.conn.SetCompression(enableCompression)
}
}