em-apns 0.1.0
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 +23 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/bin/em-apns +7 -0
- data/em-apns.gemspec +22 -0
- data/lib/em-apns.rb +67 -0
- data/lib/em-apns/connection.rb +33 -0
- data/lib/em-apns/connection_pool.rb +34 -0
- data/lib/em-apns/error.rb +34 -0
- data/lib/em-apns/notification.rb +59 -0
- data/lib/em-apns/server.rb +15 -0
- data/lib/em-apns/server_runner.rb +89 -0
- data/lib/em-apns/version.rb +5 -0
- data/spec/em-apns/connection_spec.rb +11 -0
- data/spec/em-apns/notifications_spec.rb +176 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/support/certs/cert.pem +941 -0
- data/spec/support/certs/key.pem +939 -0
- data/spec/support/helper_methods.rb +17 -0
- data/spec/support/mock_server.rb +59 -0
- metadata +125 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.expand_path('../mock_server.rb',__FILE__)
|
2
|
+
|
3
|
+
module HelperMethods
|
4
|
+
def run_em_apns(opts = {})
|
5
|
+
sock = EM::APNS.sock = File.expand_path('../tmp/sockets/em-apns-test.sock',__FILE__)
|
6
|
+
EM::APNS.key = File.expand_path('../certs/key.pem',__FILE__)
|
7
|
+
EM::APNS.cert = File.expand_path('../certs/cert.pem',__FILE__)
|
8
|
+
EM::APNS.host = 'localhost'
|
9
|
+
EM::APNS.logger.level = Logger::WARN
|
10
|
+
File.unlink(sock) if File.exists?(sock)
|
11
|
+
EM.run {
|
12
|
+
EM.start_server("localhost", 2195, EM::APNS::MockServer, opts)
|
13
|
+
EM.start_unix_domain_server(sock, EM::APNS::Server)
|
14
|
+
yield
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# Mock Apple push server
|
3
|
+
module EM
|
4
|
+
module APNS
|
5
|
+
module MockServer
|
6
|
+
|
7
|
+
def initialize opts
|
8
|
+
@on_ssl_handshake = opts[:ssl]
|
9
|
+
@on_request = opts[:request]
|
10
|
+
end
|
11
|
+
|
12
|
+
def post_init
|
13
|
+
@data = ""
|
14
|
+
start_tls(
|
15
|
+
:cert_chain_file => EM::APNS.cert,
|
16
|
+
:private_key_file => EM::APNS.key,
|
17
|
+
:verify_peer => false
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def ssl_handshake_completed
|
22
|
+
@on_ssl_handshake.call if @on_ssl_handshake
|
23
|
+
end
|
24
|
+
|
25
|
+
def receive_data(data)
|
26
|
+
@data << data
|
27
|
+
# Try to extract the payload header
|
28
|
+
headers = @data.unpack("cNNnH64n")
|
29
|
+
return if headers.last.nil?
|
30
|
+
|
31
|
+
# Try to grab the payload
|
32
|
+
payload_size = headers.last
|
33
|
+
payload = @data[45, payload_size]
|
34
|
+
return if payload.length != payload_size
|
35
|
+
|
36
|
+
@data = @data[45 + payload_size, -1] || ""
|
37
|
+
|
38
|
+
process(headers, payload)
|
39
|
+
end
|
40
|
+
|
41
|
+
def process(headers, payload)
|
42
|
+
message = "APN RECV #{headers[4]} #{payload}"
|
43
|
+
EM::APNS.logger.info(message)
|
44
|
+
|
45
|
+
args = JSON.parse(payload)
|
46
|
+
# If the alert is 'DISCONNECT', then we fake a bad payload by replying
|
47
|
+
# with an error and disconnecting.
|
48
|
+
if args["aps"]["alert"] == "DISCONNECT"
|
49
|
+
EM::APNS.logger.info("Disconnecting")
|
50
|
+
send_data([8, 1, 0].pack("ccN"))
|
51
|
+
close_connection_after_writing
|
52
|
+
end
|
53
|
+
|
54
|
+
@on_request.call(args) if @on_request
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: em-apns
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Yuri Barbashov
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: eventmachine
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.0.0.beta.3
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.0.0.beta.3
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: json
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.6.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.6.0
|
62
|
+
description: EventMachine-driven Apple Push Notifications Sender daemon
|
63
|
+
email:
|
64
|
+
- lolcoltd@gmail.com
|
65
|
+
executables:
|
66
|
+
- em-apns
|
67
|
+
extensions: []
|
68
|
+
extra_rdoc_files: []
|
69
|
+
files:
|
70
|
+
- .gitignore
|
71
|
+
- .rspec
|
72
|
+
- Gemfile
|
73
|
+
- LICENSE
|
74
|
+
- README.md
|
75
|
+
- Rakefile
|
76
|
+
- bin/em-apns
|
77
|
+
- em-apns.gemspec
|
78
|
+
- lib/em-apns.rb
|
79
|
+
- lib/em-apns/connection.rb
|
80
|
+
- lib/em-apns/connection_pool.rb
|
81
|
+
- lib/em-apns/error.rb
|
82
|
+
- lib/em-apns/notification.rb
|
83
|
+
- lib/em-apns/server.rb
|
84
|
+
- lib/em-apns/server_runner.rb
|
85
|
+
- lib/em-apns/version.rb
|
86
|
+
- spec/em-apns/connection_spec.rb
|
87
|
+
- spec/em-apns/notifications_spec.rb
|
88
|
+
- spec/spec_helper.rb
|
89
|
+
- spec/support/certs/cert.pem
|
90
|
+
- spec/support/certs/key.pem
|
91
|
+
- spec/support/helper_methods.rb
|
92
|
+
- spec/support/mock_server.rb
|
93
|
+
homepage: ''
|
94
|
+
licenses: []
|
95
|
+
post_install_message:
|
96
|
+
rdoc_options: []
|
97
|
+
require_paths:
|
98
|
+
- lib
|
99
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
101
|
+
requirements:
|
102
|
+
- - ! '>='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
requirements: []
|
112
|
+
rubyforge_project:
|
113
|
+
rubygems_version: 1.8.24
|
114
|
+
signing_key:
|
115
|
+
specification_version: 3
|
116
|
+
summary: EventMachine-driven Apple Push Notifications Sender daemon
|
117
|
+
test_files:
|
118
|
+
- spec/em-apns/connection_spec.rb
|
119
|
+
- spec/em-apns/notifications_spec.rb
|
120
|
+
- spec/spec_helper.rb
|
121
|
+
- spec/support/certs/cert.pem
|
122
|
+
- spec/support/certs/key.pem
|
123
|
+
- spec/support/helper_methods.rb
|
124
|
+
- spec/support/mock_server.rb
|
125
|
+
has_rdoc:
|