lead_zeppelin 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,5 +16,4 @@ Gem::Specification.new do |gem|
16
16
  gem.version = LeadZeppelin::VERSION
17
17
  gem.add_dependency 'multi_json'
18
18
  gem.add_dependency 'json'
19
- gem.add_dependency 'connection_pool'
20
19
  end
@@ -7,10 +7,11 @@ require 'timeout'
7
7
  require 'securerandom'
8
8
  require_relative './apns/application'
9
9
  require_relative './apns/client'
10
+ require_relative './apns/error_response'
10
11
  require_relative './apns/gateway'
12
+ require_relative './apns/gateway_pool'
11
13
  require_relative './apns/logger'
12
14
  require_relative './apns/notification'
13
- require_relative './apns/error_response'
14
15
 
15
16
  module LeadZeppelin
16
17
  module APNS
@@ -1,8 +1,7 @@
1
1
  module LeadZeppelin
2
2
  module APNS
3
3
  class Application
4
- CONNECTION_POOL_SIZE = 5
5
- CONNECTION_POOL_TIMEOUT = 5
4
+ GATEWAY_POOL_SIZE = 3
6
5
 
7
6
  attr_reader :identifier
8
7
 
@@ -10,6 +9,8 @@ module LeadZeppelin
10
9
  @identifier = identifier
11
10
  @opts = opts
12
11
 
12
+ @gateway_pool = GatewayPool.new opts[:gateway_pool_size] || GATEWAY_POOL_SIZE
13
+
13
14
  @ssl_context = OpenSSL::SSL::SSLContext.new
14
15
 
15
16
  if opts[:p12]
@@ -24,22 +25,18 @@ module LeadZeppelin
24
25
  end
25
26
  end
26
27
 
27
- def connect
28
- cp_args = {size: (@opts[:connection_pool_size] || CONNECTION_POOL_SIZE),
29
- timeout: (@opts[:connection_pool_timeout] || CONNECTION_POOL_TIMEOUT)}
30
-
28
+ def new_gateway
31
29
  begin
32
- gateway_connection_pool = ConnectionPool.new(cp_args) do
33
- Gateway.new @ssl_context, (@opts[:gateway_opts] || {}).merge(notification_error_block: @opts[:notification_error_block],
34
- certificate_error_block: @opts[:certificate_error_block],
35
- application_identifier: @identifier)
36
- end
30
+ gateway = Gateway.new @ssl_context,
31
+ (@opts[:gateway_opts] || {}).merge(notification_error_block: @opts[:notification_error_block],
32
+ certificate_error_block: @opts[:certificate_error_block],
33
+ application_identifier: @identifier)
37
34
 
38
35
  rescue OpenSSL::SSL::SSLError => e
39
36
  if e.message =~ /alert certificate unknown/
40
37
  Logger.warn "bad certificate for #{@identifier}, failed to connect"
41
38
  end
42
-
39
+
43
40
  if e.message =~ /alert certificate expired/
44
41
  Logger.warn "expired certificate for #{@identifier}, failed to connect"
45
42
  end
@@ -50,20 +47,22 @@ module LeadZeppelin
50
47
  else
51
48
  @opts[:certificate_error_block].call @identifier
52
49
  end
53
- else
54
- @gateway_connection_pool = gateway_connection_pool
55
50
  end
51
+
52
+ gateway
56
53
  end
57
54
 
58
55
  def message(device_id, message, opts={})
59
- connect if @gateway_connection_pool.nil?
60
- return nil if @gateway_connection_pool.nil?
61
-
62
- @gateway_connection_pool.with_connection do |gateway|
63
- gateway.write Notification.new(device_id, message, opts)
56
+ if @gateway_pool.total < @gateway_pool.max
57
+ @gateway_pool.total += 1
58
+ Logger.info "adding new gateway connection for #{@identifier}"
59
+ gateway = new_gateway
60
+ else
61
+ gateway = @gateway_pool.pop
64
62
  end
65
63
 
66
- true
64
+ gateway.write Notification.new(device_id, message, opts)
65
+ @gateway_pool.push gateway
67
66
  end
68
67
  end
69
68
  end
@@ -70,10 +70,12 @@ module LeadZeppelin
70
70
  def remove_application(name)
71
71
  Logger.info "removing application \"#{name}\""
72
72
  Logger.thread 'r'
73
+
73
74
  @semaphore.synchronize do
74
75
  deleted = @applications.delete name
75
- Logger.warn "removing application \"#{name}\" failed! Name may be invalid." if deleted.nil?
76
76
  end
77
+
78
+ Logger.warn "removing application \"#{name}\" failed! Name may be invalid." if deleted.nil?
77
79
  end
78
80
 
79
81
  def message(app_name, device_id, message, opts={})
@@ -4,14 +4,13 @@ module LeadZeppelin
4
4
  HOST = 'gateway.push.apple.com'
5
5
  PORT = 2195
6
6
  DEFAULT_TIMEOUT = 10
7
- DEFAULT_SELECT_WAIT = 0.5
7
+ DEFAULT_SELECT_WAIT = 0.3
8
8
 
9
9
  def initialize(ssl_context, opts={})
10
10
  Logger.thread 'g'
11
11
  @semaphore = Mutex.new
12
12
  @ssl_context = ssl_context
13
13
  @opts = opts
14
-
15
14
  connect
16
15
  end
17
16
 
@@ -58,7 +57,7 @@ module LeadZeppelin
58
57
  error_response = @ssl_socket.read_nonblock 6
59
58
  error = ErrorResponse.new error_response, notification
60
59
 
61
- Logger.warn "error: #{error.code}, #{error.identifier.to_s}, #{error.message}"
60
+ Logger.warn "error: #{error.code}, #{error.identifier.inspect}, #{error.message}"
62
61
  Logger.thread 'e'
63
62
 
64
63
  reconnect
@@ -0,0 +1,12 @@
1
+ module LeadZeppelin
2
+ module APNS
3
+ class GatewayPool < SizedQueue
4
+ attr_accessor :total
5
+
6
+ def initialize(max)
7
+ @total = 0
8
+ super
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,3 +1,3 @@
1
1
  module LeadZeppelin
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lead_zeppelin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-11 00:00:00.000000000 Z
12
+ date: 2012-06-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
@@ -43,22 +43,6 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
- - !ruby/object:Gem::Dependency
47
- name: connection_pool
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: '0'
54
- type: :runtime
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
46
  description: Thread-safe, multi-application APNS client
63
47
  email:
64
48
  - kyledrake@gmail.com
@@ -78,6 +62,7 @@ files:
78
62
  - lib/lead_zeppelin/apns/client.rb
79
63
  - lib/lead_zeppelin/apns/error_response.rb
80
64
  - lib/lead_zeppelin/apns/gateway.rb
65
+ - lib/lead_zeppelin/apns/gateway_pool.rb
81
66
  - lib/lead_zeppelin/apns/logger.rb
82
67
  - lib/lead_zeppelin/apns/notification.rb
83
68
  - lib/lead_zeppelin/version.rb