banjo-apn_sender 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/apn_sender.gemspec +1 -1
- data/lib/apn/base.rb +12 -8
- data/lib/apn/connection.rb +17 -6
- metadata +3 -9
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MmViNGY0ZDRiZDE3NjZlMmJjODlkM2QyZDNjY2U3NWNmN2Q2NjE4YQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NWVhYzU5YzNjZjkzOTQyZmQ0NWRhYTk0ZTc1N2M1NmU0OWY1ZDI2Yg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MDZmMjJjODgyOTVjY2MyODIzNjk3ZjQ5NDg0NWNjZDAwZjlmN2JiOTdkZjA1
|
10
|
+
MjY5YmQ5MWRkOTMxZjQ3MDFhNjVhNzUzN2I1YzdkYWJhYmY2ZDBlOTMyODJl
|
11
|
+
OGVlNTBlMzFkYjJlNTE4NTU2NmQwY2FiZTgyOGE1NzQxMjcwNzI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZTlhZGRiZjQ1M2VkMTE0NzNmZTFkYzMwOTQ2ZDdmNmM4MjMzNDkwM2UyMWY5
|
14
|
+
MGQzODk1MDczMDNmMTliMjUyYzRjNGZhZDM4ZTc4M2ZmZGExOTM1MjYyYWVj
|
15
|
+
YmEyNWIwNWE2YjE0MTFlZTc2ZTFhZmIxNmMyMjExMGY1OGRiNDM=
|
data/apn_sender.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{banjo-apn_sender}
|
8
|
-
s.version = "2.0.
|
8
|
+
s.version = "2.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = [%q{Kali Donovan}, %q{KW Justin Leung}]
|
data/lib/apn/base.rb
CHANGED
@@ -5,10 +5,13 @@ module APN
|
|
5
5
|
# APN::Base takes care of all the boring certificate loading, socket creating, and logging
|
6
6
|
# responsibilities so APN::Sender and APN::Feedback and focus on their respective specialties.
|
7
7
|
module Base
|
8
|
-
attr_accessor :opts, :logger
|
8
|
+
attr_accessor :opts, :logger, :fifos
|
9
|
+
|
10
|
+
FIFO_SIZE = 5
|
9
11
|
|
10
12
|
def initialize(opts = {})
|
11
13
|
@opts = opts
|
14
|
+
@fifos = Hash.new { [] }
|
12
15
|
|
13
16
|
setup_logger
|
14
17
|
setup_paths
|
@@ -21,12 +24,6 @@ module APN
|
|
21
24
|
return @socket
|
22
25
|
end
|
23
26
|
|
24
|
-
protected
|
25
|
-
# Default to Rails logger, if available
|
26
|
-
def setup_logger
|
27
|
-
@logger = defined?(::Rails.logger) ? ::Rails.logger : Logger.new(STDOUT)
|
28
|
-
end
|
29
|
-
|
30
27
|
# Log message to any logger provided by the user (e.g. the Rails logger).
|
31
28
|
# Accepts +log_level+, +message+, since that seems to make the most sense,
|
32
29
|
# and just +message+, to be compatible with Resque's log method and to enable
|
@@ -38,7 +35,7 @@ module APN
|
|
38
35
|
level, message = 'info', level if message.nil? # Handle only one argument if called from Resque, which expects only message
|
39
36
|
|
40
37
|
return false unless self.logger && self.logger.respond_to?(level)
|
41
|
-
self.logger.send(level, "[
|
38
|
+
self.logger.send(level, "[APNConnection:#{object_id} #{apn_environment}] #{message}")
|
42
39
|
end
|
43
40
|
|
44
41
|
# Log the message first, to ensure it reports what went wrong if in daemon mode.
|
@@ -48,6 +45,12 @@ module APN
|
|
48
45
|
raise msg
|
49
46
|
end
|
50
47
|
|
48
|
+
protected
|
49
|
+
# Default to Rails logger, if available
|
50
|
+
def setup_logger
|
51
|
+
@logger = defined?(::Rails.logger) ? ::Rails.logger : Logger.new(STDOUT)
|
52
|
+
end
|
53
|
+
|
51
54
|
def apn_enterprise?
|
52
55
|
@apn_enterprise ||= @opts[:enterprise].present?
|
53
56
|
end
|
@@ -89,6 +92,7 @@ module APN
|
|
89
92
|
return true if @socket && @socket_tcp && !@socket.closed? && !@socket_tcp.closed?
|
90
93
|
log_and_die("Trying to open half-open connection") if (@socket && !@socket.closed?) || (@socket_tcp && !@socket_tcp.closed?)
|
91
94
|
|
95
|
+
log(:info, "Setting up SSL connection to APN...")
|
92
96
|
ctx = OpenSSL::SSL::SSLContext.new
|
93
97
|
ctx.cert = OpenSSL::X509::Certificate.new(@apn_cert)
|
94
98
|
ctx.key = OpenSSL::PKey::RSA.new(@apn_cert)
|
data/lib/apn/connection.rb
CHANGED
@@ -6,22 +6,30 @@ class APN::Connection
|
|
6
6
|
@sandbox_senders = Hash.new
|
7
7
|
@enterprise_semaphore = Mutex.new
|
8
8
|
|
9
|
-
|
9
|
+
|
10
|
+
def push_fifo(env, token)
|
11
|
+
@fifos[env] <<= token
|
12
|
+
@fifos[env].shift if @fifos[env][FIFO_SIZE]
|
13
|
+
end
|
14
|
+
|
15
|
+
def send_to_apple(notification, token, env, tag)
|
10
16
|
retries = 0
|
17
|
+
push_fifo(env, token)
|
11
18
|
|
12
19
|
begin
|
13
20
|
self.socket.write( notification.to_s )
|
14
21
|
rescue => e
|
15
|
-
|
22
|
+
log(:error, "Try #{retries}: #{e.class} to #{apn_host}: #{e.message}, recent_tokens: #{@fifos[env]}")
|
16
23
|
|
17
24
|
# Try reestablishing the connection
|
18
25
|
if (retries += 1) <= TIMES_TO_RETRY_SOCKET_ERROR
|
19
26
|
teardown_connection
|
27
|
+
sleep 1
|
20
28
|
setup_connection
|
21
29
|
retry
|
22
30
|
end
|
23
31
|
|
24
|
-
|
32
|
+
log(:error, "#{e.class} to #{apn_host}: #{e.message}, recent_tokens: #{@fifos[env]}")
|
25
33
|
raise e
|
26
34
|
end
|
27
35
|
end
|
@@ -47,11 +55,14 @@ class APN::Connection
|
|
47
55
|
end
|
48
56
|
end
|
49
57
|
|
50
|
-
|
58
|
+
env = sandbox ? 'sandbox' : enterprise ? 'enterprise' : 'production'
|
59
|
+
tag = "#{sandbox ? 'sandbox' : 'production'}#{enterprise ? ' enterprise' : ''}"
|
60
|
+
sender.log(:info, "token: #{token} message: #{options}")
|
61
|
+
|
51
62
|
if enterprise
|
52
|
-
@enterprise_semaphore.synchronize { sender.send_to_apple(msg) }
|
63
|
+
@enterprise_semaphore.synchronize { sender.send_to_apple(msg, token, env, tag) }
|
53
64
|
else
|
54
|
-
sender.send_to_apple(msg)
|
65
|
+
sender.send_to_apple(msg, token, env, tag)
|
55
66
|
end
|
56
67
|
end
|
57
68
|
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: banjo-apn_sender
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
5
|
-
prerelease:
|
4
|
+
version: 2.0.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Kali Donovan
|
@@ -15,7 +14,6 @@ dependencies:
|
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: apn_sender
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
18
|
- - ! '>='
|
21
19
|
- !ruby/object:Gem::Version
|
@@ -23,7 +21,6 @@ dependencies:
|
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
25
|
- - ! '>='
|
29
26
|
- !ruby/object:Gem::Version
|
@@ -31,7 +28,6 @@ dependencies:
|
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: yajl-ruby
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
32
|
- - ! '>='
|
37
33
|
- !ruby/object:Gem::Version
|
@@ -39,7 +35,6 @@ dependencies:
|
|
39
35
|
type: :runtime
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
39
|
- - ! '>='
|
45
40
|
- !ruby/object:Gem::Version
|
@@ -68,25 +63,24 @@ files:
|
|
68
63
|
- lib/apn/notification.rb
|
69
64
|
homepage: http://github.com/BanjoInc/apn_sender
|
70
65
|
licenses: []
|
66
|
+
metadata: {}
|
71
67
|
post_install_message:
|
72
68
|
rdoc_options: []
|
73
69
|
require_paths:
|
74
70
|
- lib
|
75
71
|
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
-
none: false
|
77
72
|
requirements:
|
78
73
|
- - ! '>='
|
79
74
|
- !ruby/object:Gem::Version
|
80
75
|
version: '0'
|
81
76
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
77
|
requirements:
|
84
78
|
- - ! '>='
|
85
79
|
- !ruby/object:Gem::Version
|
86
80
|
version: '0'
|
87
81
|
requirements: []
|
88
82
|
rubyforge_project:
|
89
|
-
rubygems_version:
|
83
|
+
rubygems_version: 2.2.2
|
90
84
|
signing_key:
|
91
85
|
specification_version: 3
|
92
86
|
summary: APN connection pluggable to multithreaded background worker (like SideKiq)
|