banjo-apn_sender 2.0.0 → 2.0.1
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.
- data/.gitignore +21 -0
- data/Gemfile +3 -0
- data/apn_sender.gemspec +6 -16
- data/lib/apn/connection.rb +67 -0
- metadata +4 -1
data/.gitignore
ADDED
data/Gemfile
ADDED
data/apn_sender.gemspec
CHANGED
@@ -5,28 +5,18 @@
|
|
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.1"
|
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}]
|
12
12
|
s.date = %q{2012-06-19}
|
13
13
|
s.description = %q{Based on Kali Donovan's APN sender 1.x. 2.0 keep things lean - we removed the resque layer, and make APN connection pluggable to multithreaded background worker (like SideKiq) to send Apple Push Notifications over a persistent TCP socket.}
|
14
14
|
s.email = %q{kali.donovan@gmail.com justin@teambanjo.com}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
s.
|
20
|
-
"LICENSE",
|
21
|
-
"README.rdoc",
|
22
|
-
"Rakefile",
|
23
|
-
"VERSION",
|
24
|
-
"apn_sender.gemspec",
|
25
|
-
"lib/apn.rb",
|
26
|
-
"lib/apn/base.rb",
|
27
|
-
"lib/apn/feedback.rb",
|
28
|
-
"lib/apn/notification.rb"
|
29
|
-
]
|
15
|
+
s.extra_rdoc_files = [ "LICENSE", "README.rdoc" ]
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
30
20
|
s.homepage = %q{http://github.com/BanjoInc/apn_sender}
|
31
21
|
s.require_paths = [%q{lib}]
|
32
22
|
s.rubygems_version = %q{1.8.6}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
class APN::Connection
|
2
|
+
include APN::Base
|
3
|
+
TIMES_TO_RETRY_SOCKET_ERROR = 2
|
4
|
+
|
5
|
+
@production_senders = Hash.new
|
6
|
+
@sandbox_senders = Hash.new
|
7
|
+
@enterprise_semaphore = Mutex.new
|
8
|
+
|
9
|
+
def send_to_apple(notification)
|
10
|
+
retries = 0
|
11
|
+
|
12
|
+
begin
|
13
|
+
self.socket.write( notification.to_s )
|
14
|
+
rescue => e
|
15
|
+
Rails.logger.error("Try #{retries}: APNConnection to #{apn_host} error with #{e}")
|
16
|
+
|
17
|
+
# Try reestablishing the connection
|
18
|
+
if (retries += 1) <= TIMES_TO_RETRY_SOCKET_ERROR
|
19
|
+
teardown_connection
|
20
|
+
setup_connection
|
21
|
+
retry
|
22
|
+
end
|
23
|
+
|
24
|
+
Rails.logger.error("APNConnection gave up send_to_apple after #{retries} failures")
|
25
|
+
raise e
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.send(token, options, sandbox = false, enterprise = false)
|
30
|
+
msg = APN::Notification.new(token, options)
|
31
|
+
raise "Invalid notification options (did you provide :alert, :badge, or :sound?): #{options.inspect}" unless msg.valid?
|
32
|
+
|
33
|
+
thread_id = Thread.current.object_id
|
34
|
+
|
35
|
+
# Use only 1 single thread for internal enterprise cert
|
36
|
+
sender = if enterprise
|
37
|
+
if sandbox
|
38
|
+
@sandbox_enterprise_sender ||= new(worker_count: 1, sandbox: 1, verbose: 1, enterprise: 1)
|
39
|
+
else
|
40
|
+
@production_enterprise_sender ||= new(worker_count: 1, verbose: 1, enterprise: 1)
|
41
|
+
end
|
42
|
+
else
|
43
|
+
if sandbox
|
44
|
+
@sandbox_senders[thread_id] ||= new(worker_count: 1, sandbox: 1, verbose: 1)
|
45
|
+
else
|
46
|
+
@production_senders[thread_id] ||= new(worker_count: 1, verbose: 1)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
Rails.logger.info "[APNConnection:#{sender.object_id} #{sandbox ? 'sandbox' : 'production'}#{enterprise ? ' enterprise' : ''}] token: #{token} message: #{options}"
|
51
|
+
if enterprise
|
52
|
+
@enterprise_semaphore.synchronize { sender.send_to_apple(msg) }
|
53
|
+
else
|
54
|
+
sender.send_to_apple(msg)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
def apn_host
|
60
|
+
@apn_host ||= apn_sandbox? ? "gateway.sandbox.push.apple.com" : "gateway.push.apple.com"
|
61
|
+
end
|
62
|
+
|
63
|
+
def apn_port
|
64
|
+
2195
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
metadata
CHANGED
@@ -1,7 +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.
|
4
|
+
version: 2.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -54,6 +54,8 @@ extra_rdoc_files:
|
|
54
54
|
- LICENSE
|
55
55
|
- README.rdoc
|
56
56
|
files:
|
57
|
+
- .gitignore
|
58
|
+
- Gemfile
|
57
59
|
- LICENSE
|
58
60
|
- README.rdoc
|
59
61
|
- Rakefile
|
@@ -61,6 +63,7 @@ files:
|
|
61
63
|
- apn_sender.gemspec
|
62
64
|
- lib/apn.rb
|
63
65
|
- lib/apn/base.rb
|
66
|
+
- lib/apn/connection.rb
|
64
67
|
- lib/apn/feedback.rb
|
65
68
|
- lib/apn/notification.rb
|
66
69
|
homepage: http://github.com/BanjoInc/apn_sender
|