lowdown 0.3.2 → 1.0.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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/Gemfile.lock +1 -1
- data/README.md +20 -5
- data/lib/lowdown/certificate.rb +3 -2
- data/lib/lowdown/connection.rb +28 -5
- data/lib/lowdown/mock.rb +7 -1
- data/lib/lowdown/response.rb +1 -1
- data/lib/lowdown/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2e108d10dee8fe2b683cc76da5f3c7514957699
|
4
|
+
data.tar.gz: dca96974b0b8bd162baf8df4d6dff344650a7c61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82d96f945d8234049c66a546bac040852446bb9db72c228775619f487fa7bab9d21e1ce5ce23e8584b0356da2c7ff72f3cd16aa811ac2ce9477cdcfdc823a314
|
7
|
+
data.tar.gz: d7082d411eb7e0e74ed63f091db0eab272763caeda71aceea2353f95cb4c92b8206799747db480069c100498cffe026933cd324543d252bc9bfe14c3f47bb000
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -4,8 +4,6 @@
|
|
4
4
|
|
5
5
|
[](https://travis-ci.org/alloy/lowdown)
|
6
6
|
|
7
|
-
⚠︎ NOTE: _This is not battle-tested yet, which will follow over the next few weeks. A v1 will be released at that time._
|
8
|
-
|
9
7
|
Lowdown is a Ruby client for the HTTP/2 version of the Apple Push Notification Service.
|
10
8
|
|
11
9
|
For efficiency, multiple notification requests are multiplexed and a single client can manage a pool of connections.
|
@@ -66,7 +64,7 @@ After obtaining a client, the simplest way to open a connection for a short peri
|
|
66
64
|
This will open the connection, yield the block, and close the connection by the end of the block:
|
67
65
|
|
68
66
|
```ruby
|
69
|
-
client = Lowdown::Client.production(true, File.read("path/to/certificate.pem")
|
67
|
+
client = Lowdown::Client.production(true, certificate: File.read("path/to/certificate.pem")
|
70
68
|
client.connect do |group|
|
71
69
|
# ...
|
72
70
|
end
|
@@ -79,7 +77,7 @@ end
|
|
79
77
|
The trick to creating a persistent connection is to specify the `keep_alive: true` option when creating the client:
|
80
78
|
|
81
79
|
```ruby
|
82
|
-
client = Lowdown::Client.production(true, File.read("path/to/certificate.pem"), keep_alive: true)
|
80
|
+
client = Lowdown::Client.production(true, certificate: File.read("path/to/certificate.pem"), keep_alive: true)
|
83
81
|
|
84
82
|
# Send a batch of notifications
|
85
83
|
client.group do |group|
|
@@ -160,7 +158,24 @@ connections to the remote service. By default Lowdown will initialize clients wi
|
|
160
158
|
increase this with the `pool_size` option:
|
161
159
|
|
162
160
|
```ruby
|
163
|
-
Lowdown::Client.production(true, File.read("path/to/certificate.pem"), pool_size: 3)
|
161
|
+
Lowdown::Client.production(true, certificate: File.read("path/to/certificate.pem"), pool_size: 3)
|
162
|
+
```
|
163
|
+
|
164
|
+
### Connect to APNS via proxy
|
165
|
+
|
166
|
+
`Lowdown::Connection#initialize` accepts a lambda to build TCPSocket. Build a duck type of TCPSocket which go through proxy.
|
167
|
+
|
168
|
+
```ruby
|
169
|
+
socket_maker = lambda do |uri|
|
170
|
+
Proxifier::Proxy('http://127.0.0.1:3128').open \
|
171
|
+
uri.host, uri.port, nil, nil, Celluloid::IO::TCPSocket
|
172
|
+
end
|
173
|
+
|
174
|
+
connection_pool = Lowdown::Connection.pool \
|
175
|
+
size: 2,
|
176
|
+
args: [uri, cert.ssl_context, true, socket_maker]
|
177
|
+
|
178
|
+
client = Lowdown::Client.client_with_connection connection_pool, certificate: cert
|
164
179
|
```
|
165
180
|
|
166
181
|
## Gotchas
|
data/lib/lowdown/certificate.rb
CHANGED
@@ -126,8 +126,9 @@ module Lowdown
|
|
126
126
|
#
|
127
127
|
def topics
|
128
128
|
if universal?
|
129
|
-
|
130
|
-
|
129
|
+
ext = extension(UNIVERSAL_CERTIFICATE_EXTENSION)
|
130
|
+
seq = OpenSSL::ASN1.decode(OpenSSL::ASN1.decode(ext.to_der).value[1].value)
|
131
|
+
seq.select.with_index { |_, index| index.even? }.map(&:value)
|
131
132
|
else
|
132
133
|
[app_bundle_id]
|
133
134
|
end
|
data/lib/lowdown/connection.rb
CHANGED
@@ -83,8 +83,25 @@ module Lowdown
|
|
83
83
|
# @param [Boolean] connect
|
84
84
|
# whether or not to immediately connect on initialization.
|
85
85
|
#
|
86
|
-
|
86
|
+
# @param [lambda] socket_maker
|
87
|
+
# a lambda takes uri and returns duck type of TCPSocket
|
88
|
+
# e.g.:
|
89
|
+
#
|
90
|
+
# @example Use `socket_maker` argument with modified ruby-proxifier
|
91
|
+
# socket_maker = lambda do |uri|
|
92
|
+
# Proxifier::Proxy('http://127.0.0.1:3128').open \
|
93
|
+
# uri.host, uri.port, nil, nil, Celluloid::IO::TCPSocket
|
94
|
+
# end
|
95
|
+
#
|
96
|
+
# connection_pool = Lowdown::Connection.pool \
|
97
|
+
# size: 2,
|
98
|
+
# args: [uri, cert.ssl_context, true, socket_maker]
|
99
|
+
#
|
100
|
+
# client = Lowdown::Client.client_with_connection connection_pool, certificate: cert
|
101
|
+
#
|
102
|
+
def initialize(uri, ssl_context, connect = true, socket_maker = nil)
|
87
103
|
@uri, @ssl_context = URI(uri), ssl_context
|
104
|
+
@socket_maker = socket_maker
|
88
105
|
reset_state!
|
89
106
|
|
90
107
|
if connect
|
@@ -165,7 +182,11 @@ module Lowdown
|
|
165
182
|
# 2. This tries to `NilClass#send` the hostname:
|
166
183
|
# https://github.com/celluloid/celluloid-io/blob/85cee9da22ef5e94ba0abfd46454a2d56572aff4/lib/celluloid/io/dns_resolver.rb#L44
|
167
184
|
begin
|
168
|
-
socket =
|
185
|
+
socket = if @socket_maker.respond_to? :call
|
186
|
+
@socket_maker.call @uri
|
187
|
+
else
|
188
|
+
TCPSocket.new(@uri.host, @uri.port)
|
189
|
+
end
|
169
190
|
rescue NoMethodError
|
170
191
|
raise SocketError, "(Probably) getaddrinfo: nodename nor servname provided, or not known"
|
171
192
|
end
|
@@ -240,6 +261,8 @@ module Lowdown
|
|
240
261
|
# @return [void]
|
241
262
|
#
|
242
263
|
def change_to_connected_state
|
264
|
+
return unless @http
|
265
|
+
|
243
266
|
@max_stream_count = @http.remote_settings[:settings_max_concurrent_streams]
|
244
267
|
@connected = true
|
245
268
|
|
@@ -327,14 +350,14 @@ module Lowdown
|
|
327
350
|
end
|
328
351
|
|
329
352
|
def try_to_perform_request!
|
330
|
-
|
353
|
+
if @connected
|
354
|
+
@warned_about_not_connected = false
|
355
|
+
else
|
331
356
|
unless @warned_about_not_connected
|
332
357
|
warn "Defer performing request, because the connection has not been established yet."
|
333
358
|
@warned_about_not_connected = true
|
334
359
|
end
|
335
360
|
return
|
336
|
-
else
|
337
|
-
@warned_about_not_connected = false
|
338
361
|
end
|
339
362
|
|
340
363
|
unless @http.active_stream_count < @max_stream_count
|
data/lib/lowdown/mock.rb
CHANGED
@@ -30,7 +30,13 @@ module Lowdown
|
|
30
30
|
|
31
31
|
# Make it a Universal Certificate
|
32
32
|
ext_name = Lowdown::Certificate::UNIVERSAL_CERTIFICATE_EXTENSION
|
33
|
-
|
33
|
+
ext_value = OpenSSL::ASN1::Sequence.new(
|
34
|
+
[
|
35
|
+
OpenSSL::ASN1::UTF8String.new(app_bundle_id),
|
36
|
+
OpenSSL::ASN1::Sequence.new([OpenSSL::ASN1::UTF8String.new("app")]),
|
37
|
+
]
|
38
|
+
).to_der
|
39
|
+
cert.extensions = [OpenSSL::X509::Extension.new(ext_name, ext_value)]
|
34
40
|
|
35
41
|
[cert, key]
|
36
42
|
end
|
data/lib/lowdown/response.rb
CHANGED
@@ -95,7 +95,7 @@ module Lowdown
|
|
95
95
|
# in case of an inactive token, the time at which the service last verified it.
|
96
96
|
#
|
97
97
|
def activity_last_checked_at
|
98
|
-
Time.at(body["timestamp"].to_i) if inactive_token?
|
98
|
+
Time.at(body["timestamp"].to_i / 1000) if inactive_token?
|
99
99
|
end
|
100
100
|
|
101
101
|
# @return [String]
|
data/lib/lowdown/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lowdown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eloy Durán
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http-2
|