nsq-ruby 1.5.1 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 382e59adfb6836e6110aa8495e91be67ae04fa4b
4
- data.tar.gz: 0cb2761df138f48e1eb790b344b4af6a96ded5d3
3
+ metadata.gz: 74c7cac5f391e1845369f6589a19a411781bcd5a
4
+ data.tar.gz: 87bff660b9a046e391cc5535eb05766c23d0ae41
5
5
  SHA512:
6
- metadata.gz: daeee78b58c442fd6d72dc59ab0cdc411f7a6de847bd7df7ccdf4f19e5ab576d6cbdeba7a3c84ccb8dee15243c5c85e098a057e375e78ce287991b8b22915b1c
7
- data.tar.gz: cbe2582b629abfa542615641221f014be6c926f7bd370bd56c158ca6a7c2594839e9e7798dd17f54c6661b10ff38cf6eb2c7a0e206a1735af22f907f2a191ab2
6
+ metadata.gz: 287c61b256fd4473c43ead39228423044eb936a6823195388488c5e058ae6908833cef0fa62e659afa97ef4606f53501ad521cf9337dca3c56ced373f5eb851b
7
+ data.tar.gz: 9eeb96b9dab4965e6b2df5910803117119e23b56b98ca3f5d871f7538ac487cac51cb17eb158f38aeaad62b87b35073936268beee9de2c8abcc80fff22e6804e
data/README.md CHANGED
@@ -60,6 +60,7 @@ The Nsq::Producer constructor takes the following options:
60
60
  | `topic` | Topic to which to publish messages | |
61
61
  | `nsqd` | Host and port of the nsqd instance | '127.0.0.1:4150' |
62
62
  | `nsqlookupd` | Use lookupd to automatically discover nsqds | |
63
+ | `ssl_context` | Optional keys and certificates for TLS connections | |
63
64
 
64
65
  For example, if you'd like to publish messages to a single nsqd.
65
66
 
@@ -82,6 +83,19 @@ producer = Nsq::Producer.new(
82
83
  )
83
84
  ```
84
85
 
86
+ If you need to connect using SSL/TLS
87
+
88
+ ```Ruby
89
+ producer = Nsq::Producer.new(
90
+ nsqlookupd: ['1.2.3.4:4161', '6.7.8.9:4161'],
91
+ topic: 'topic-of-great-esteem',
92
+ ssl_context: {
93
+ key: '/path/to/ssl/key.pem',
94
+ certificate: '/path/to/ssl/certificate.pem'
95
+ }
96
+ )
97
+ ```
98
+
85
99
 
86
100
  ### `#write`
87
101
 
@@ -149,6 +163,7 @@ producers when you're done with them.
149
163
  | `max_in_flight` | Max number of messages for this consumer to have in flight at a time | 1 |
150
164
  | `discovery_interval` | Seconds between queue discovery via nsqlookupd | 60.0 |
151
165
  | `msg_timeout` | Milliseconds before nsqd will timeout a message | 60000 |
166
+ | `ssl_context` | Optional keys and certificates for TLS connections | |
152
167
 
153
168
 
154
169
  For example:
@@ -160,7 +175,11 @@ consumer = Nsq::Consumer.new(
160
175
  nsqlookupd: ['127.0.0.1:4161', '4.5.6.7:4161'],
161
176
  max_in_flight: 100,
162
177
  discovery_interval: 30,
163
- msg_timeout: 120_000
178
+ msg_timeout: 120_000,
179
+ ssl_context: {
180
+ key: '/path/to/ssl/key.pem',
181
+ certificate: '/path/to/ssl/certificate.pem'
182
+ }
164
183
  )
165
184
  ```
166
185
 
@@ -285,11 +304,11 @@ connection timeout support (0.2.29).
285
304
  - Discovery via nsqlookupd
286
305
  - Automatic reconnection to nsqd
287
306
  - Producing to all nsqd instances automatically via nsqlookupd
307
+ - TLS
288
308
 
289
309
 
290
310
  ### Does not support
291
311
 
292
- - TLS
293
312
  - Compression
294
313
  - Backoff
295
314
  - Authentication
@@ -318,16 +337,18 @@ VERBOSE=true rake spec
318
337
  ## Is this production ready?
319
338
 
320
339
  Yes! It's used in several critical parts of our infrastructure at
321
- [Wistia](http://wistia.com) and currently produces and consumes tens of
340
+ [Wistia](http://wistia.com) and currently produces and consumes hundreds of
322
341
  millions of messages a day.
323
342
 
324
343
 
325
344
  ## Authors
326
345
 
327
- - Robby Grossman (@freerobby)
328
- - Brendan Schwartz (@bschwartz)
329
- - Marshall Moutenot (@mmoutenot)
330
- - Danielle Sucher (@DanielleSucher)
346
+ - Robby Grossman ([@freerobby](https://github.com/freerobby))
347
+ - Brendan Schwartz ([@bschwartz](https://github.com/bschwartz))
348
+ - Marshall Moutenot ([@mmoutenot](https://github.com/mmoutenot))
349
+ - Danielle Sucher ([@DanielleSucher](https://github.com/DanielleSucher))
350
+ - Anders Chen ([@chen-anders](https://github.com/chen-anders))
351
+ - Thomas O'Neil ([@alieander](https://github.com/alieander))
331
352
 
332
353
 
333
354
  ## MIT License
@@ -89,7 +89,8 @@ module Nsq
89
89
  host, port = nsqd.split(':')
90
90
  connection = Connection.new({
91
91
  host: host,
92
- port: port
92
+ port: port,
93
+ ssl_context: @ssl_context
93
94
  }.merge(options))
94
95
  @connections[nsqd] = connection
95
96
  end
@@ -1,5 +1,6 @@
1
1
  require 'json'
2
2
  require 'socket'
3
+ require 'openssl'
3
4
  require 'timeout'
4
5
 
5
6
  require_relative 'frames/error'
@@ -24,12 +25,14 @@ module Nsq
24
25
 
25
26
  def initialize(opts = {})
26
27
  @host = opts[:host] || (raise ArgumentError, 'host is required')
27
- @port = opts[:port] || (raise ArgumentError, 'host is required')
28
+ @port = opts[:port] || (raise ArgumentError, 'port is required')
28
29
  @queue = opts[:queue]
29
30
  @topic = opts[:topic]
30
31
  @channel = opts[:channel]
31
32
  @msg_timeout = opts[:msg_timeout] || 60_000 # 60s
32
33
  @max_in_flight = opts[:max_in_flight] || 1
34
+ @ssl_context = opts[:ssl_context]
35
+ validate_ssl_context! if @ssl_context
33
36
 
34
37
  if @msg_timeout < 1000
35
38
  raise ArgumentError, 'msg_timeout cannot be less than 1000. it\'s in milliseconds.'
@@ -146,7 +149,7 @@ module Nsq
146
149
  heartbeat_interval: 30_000, # 30 seconds
147
150
  output_buffer: 16_000, # 16kb
148
151
  output_buffer_timeout: 250, # 250ms
149
- tls_v1: false,
152
+ tls_v1: !!@ssl_context,
150
153
  snappy: false,
151
154
  deflate: false,
152
155
  sample_rate: 0, # disable sampling
@@ -314,6 +317,7 @@ module Nsq
314
317
  # it gets to nsqd ahead of anything in the `@write_queue`
315
318
  write_to_socket ' V2'
316
319
  identify
320
+ upgrade_to_ssl_socket if @ssl_context
317
321
 
318
322
  start_read_loop
319
323
  start_write_loop
@@ -346,6 +350,23 @@ module Nsq
346
350
  end
347
351
 
348
352
 
353
+ def upgrade_to_ssl_socket
354
+ @socket = OpenSSL::SSL::SSLSocket.new(@socket, openssl_context)
355
+ @socket.connect
356
+ end
357
+
358
+
359
+ def openssl_context
360
+ context = OpenSSL::SSL::SSLContext.new
361
+ context.cert = OpenSSL::X509::Certificate.new(File.open(@ssl_context[:certificate]))
362
+ context.key = OpenSSL::PKey::RSA.new(File.open(@ssl_context[:key]))
363
+ if @ssl_context[:ca_certificate]
364
+ context.ca_file = OpenSSL::X509::Certificate.new(File.open(@ssl_context[:ca_certificate])).to_pem
365
+ end
366
+ context
367
+ end
368
+
369
+
349
370
  # Retry the supplied block with exponential backoff.
350
371
  #
351
372
  # Borrowed liberally from:
@@ -398,5 +419,18 @@ module Nsq
398
419
  end
399
420
 
400
421
 
422
+ def validate_ssl_context!
423
+ [:key, :certificate].each do |key|
424
+ unless @ssl_context.has_key?(key)
425
+ raise ArgumentError.new "ssl_context requires a :#{key}"
426
+ end
427
+ end
428
+
429
+ [:key, :certificate, :ca_certificate].each do |key|
430
+ if @ssl_context[key] && !File.readable?(@ssl_context[key])
431
+ raise LoadError.new "ssl_context :#{key} is unreadable"
432
+ end
433
+ end
434
+ end
401
435
  end
402
436
  end
data/lib/nsq/consumer.rb CHANGED
@@ -17,6 +17,7 @@ module Nsq
17
17
  @max_in_flight = opts[:max_in_flight] || 1
18
18
  @discovery_interval = opts[:discovery_interval] || 60
19
19
  @msg_timeout = opts[:msg_timeout]
20
+ @ssl_context = opts[:ssl_context]
20
21
 
21
22
  # This is where we queue up the messages we receive from each connection
22
23
  @messages = opts[:queue] || Queue.new
data/lib/nsq/producer.rb CHANGED
@@ -8,6 +8,7 @@ module Nsq
8
8
  @connections = {}
9
9
  @topic = opts[:topic]
10
10
  @discovery_interval = opts[:discovery_interval] || 60
11
+ @ssl_context = opts[:ssl_context]
11
12
 
12
13
  nsqlookupds = []
13
14
  if opts[:nsqlookupd]
data/lib/version.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Nsq
2
2
  module Version
3
3
  MAJOR = 1
4
- MINOR = 5
5
- PATCH = 1
4
+ MINOR = 6
5
+ PATCH = 0
6
6
  BUILD = nil
7
7
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nsq-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wistia
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-13 00:00:00.000000000 Z
11
+ date: 2016-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler