andpush 0.2.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d034631f3463f8f106814846df48e8c5478b3b3fcc93abca065d8119bfa1fec7
4
- data.tar.gz: ef0c8920fd6c3f67dc530defb3862eee3fc6e72c6b0b66a0fc8460e38cfd7ae8
3
+ metadata.gz: df7b5f9eef2464f5682ffa020acd74acbbd353c482ee6442f3c4a01dcd77ebf2
4
+ data.tar.gz: 7c83817fcf0ea6035e1cbad68acaaab6ecb29fc4482c5e2c3154c597c50c58dc
5
5
  SHA512:
6
- metadata.gz: 3c6c4d56ef8135fee5385d3e94a42e017c9f79f0ea0263a73fb3da70dbae1c4f5c53129c711193cb3b1411335692014723dae8d75ed2107b4e8012d86b93b02c
7
- data.tar.gz: 121b05f40b5c143a73d495eccbe4469388d41ef5e0d6668671dbfdf0f2d1673cf4e2239e39b4146ffaceab5e72b7ac83bd59dea3ee5ff51fa4aff2e701dad09d
6
+ metadata.gz: d7918679620e77e3394684d7af5a2386223b9a7a514698b0cb7e645d374c67ae8de054aa58a87c7c5522d0137d1396bead19b83d03c2893a5a4cfe50baebf280
7
+ data.tar.gz: efe30498a620f7cc0504626751fe175e3b28f1cd648af0ac7ae469542e3aa0daf327e6640a5d5b40333270e50710deebefb06fa1b6b307c7fad1a468fea02613
@@ -5,19 +5,20 @@ sudo: false
5
5
 
6
6
  before_install:
7
7
  - gem update --system
8
- - gem pristine bundler
8
+ - gem install bundler
9
9
 
10
10
  rvm:
11
- - 2.2.9
12
- - 2.3.6
13
- - 2.4.3
14
- - 2.5.0
11
+ - 2.2.10
12
+ - 2.3.8
13
+ - 2.4.5
14
+ - 2.5.3
15
+ - 2.6.0
15
16
  - ruby-head
16
- - jruby-9.1.16.0
17
+ - jruby-9.2.5.0
17
18
  - jruby-head
18
19
 
19
20
  matrix:
20
21
  allow_failures:
21
22
  - rvm: ruby-head
22
- - rvm: jruby-9.1.16.0
23
+ - rvm: jruby-9.2.5.0
23
24
  - rvm: jruby-head
@@ -1,3 +1,12 @@
1
+ ## [v0.2.0](https://github.com/yuki24/andpush/tree/v0.2.0)
2
+
3
+ _<sup>released on 2018-03-08 01:33:21 UTC</sup>_
4
+
5
+ #### New Features
6
+
7
+ - Add support for Ruby 2.5.0
8
+ - Add the ability to pass in the `name`, `proxy` and`pool_size` options to the `Android.new` method to configure connection pool
9
+
1
10
  ## [v0.1.0: First release](https://github.com/yuki24/andpush/tree/v0.1.0)
2
11
 
3
12
  _<sup>released on 2017-06-03 02:04:28 UTC</sup>_
data/Gemfile CHANGED
@@ -7,3 +7,4 @@ gem 'oven', '0.1.0.rc1'
7
7
  gem 'rubocop'
8
8
  gem 'pry'
9
9
  gem 'http_logger'
10
+ gem 'curb'
data/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  Andpush is an HTTP client for FCM (Firebase Cloud Messaging). It implements [the Firebase Cloud Messaging HTTP Protocol](https://firebase.google.com/docs/cloud-messaging/http-server-ref).
4
4
 
5
- The `andpush` gem performs **about 3.7x faster** than [the fcm gem](https://github.com/spacialdb/fcm) in a single-threaded environment. In a multi-threaded environment, it could perform **10x or even faster!**
5
+ The `andpush` gem performs **about 3.7x faster** than [the fcm gem](https://github.com/spacialdb/fcm) in a single-threaded environment.
6
6
 
7
- **If you are thining to send push notifications from Rails, consider using the [pushing gem](https://github.com/yuki24/pushing), a push notification framework that does not hurt.**
7
+ **If you are thinking to send push notifications from Rails, consider using the [pushing gem](https://github.com/yuki24/pushing), a push notification framework that does not hurt.**
8
8
 
9
9
  ## Installation
10
10
 
@@ -68,6 +68,31 @@ payload = {
68
68
  response = client.push(payload) # => sends a message to the topic
69
69
  ```
70
70
 
71
+ ## Using HTTP/2 (Experimental)
72
+
73
+ The current GitHub master branch ships with experimental support for HTTP/2. It takes advantage of the fantastic library, [libcurl](https://curl.haxx.se/libcurl/). In order to use it, replace `Andpush.new(...)` with `Andpush.http2(...)`:
74
+
75
+ ```diff
76
+ +# Do not forget to add the curb gem to your Gemfile
77
+ +require 'curb'
78
+
79
+ -client = Andpush.new(server_key, pool_size: 25)
80
+ +client = Andpush.http2(server_key) # no need to specify the `pool_size' as HTTP/2 maintains a single connection
81
+ ```
82
+
83
+ ### Prerequisites
84
+
85
+ * [libcurl](https://curl.haxx.se/download.html) 7.43.0 or later
86
+ * [nghttp2](https://nghttp2.org/blog/) 1.0 or later
87
+
88
+ **Make sure that your production environment has the compatible versions installed. If you are not sure what version of libcurl you are using, try running `curl --version` and make sure it has `HTTP2` listed in the Features:**
89
+
90
+ ![Curl version](assets/curl-version.png "Curl version")
91
+
92
+ **If you wish to use the HTTP/2 client in heroku, make sure you are using [the `Heroku-18` stack](https://devcenter.heroku.com/articles/heroku-18-stack). Older stacks, such as `Heroku-16` and `Cedar-14` do not ship with a version of libcurl that has support for HTTP/2.**
93
+
94
+ If you are using an older version of libcurl that doesn't support HTTP/2, don't worry. It will just fall back to HTTP 1.1 (of course without header compression and multiplexing.)
95
+
71
96
  ## Performance
72
97
 
73
98
  The andpush gem uses [HTTP persistent connections](https://en.wikipedia.org/wiki/HTTP_persistent_connection) to improve performance. This is done by [the net-http-persistent gem](https://github.com/drbrain/net-http-persistent). [A simple benchmark](https://gist.github.com/yuki24/e0db97e887b8b6eb1932c41b4cea4a99) shows that the andpush gem performs at least 3x faster than the fcm gem:
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Andpush::VERSION
9
9
  spec.authors = ["Yuki Nishijima"]
10
10
  spec.email = ["mail@yukinishijima.net"]
11
- spec.summary = %q{FCM HTTP client}
12
- spec.description = %q{Andpush is an HTTP client for Firebase Cloud Messaging.}
11
+ spec.summary = %q{Simple, fast, high-quality client for FCM (Firebase Cloud Messaging)}
12
+ spec.description = %q{Android Push Notification in Ruby: simple, fast, high-quality client for FCM (Firebase Cloud Messaging)}
13
13
  spec.homepage = "https://github.com/yuki24/andpush"
14
14
  spec.license = "MIT"
15
15
  spec.files = `git ls-files -z`.split("\x0").reject {|f| f.match(%r{^(test)/}) }
Binary file
@@ -13,6 +13,22 @@ module Andpush
13
13
  .register_interceptor(Authenticator.new(server_key))
14
14
  end
15
15
  alias new build
16
+
17
+ def http2(server_key, domain: nil)
18
+ begin
19
+ require 'curb' if !defined?(Curl)
20
+ rescue LoadError => error
21
+ raise LoadError, "Could not load the curb gem. Make sure to install the gem by running:\n\n" \
22
+ " $ gem i curb\n\n" \
23
+ "Or the Gemfile has the following declaration:\n\n" \
24
+ " gem 'curb'\n\n" \
25
+ " (#{error.class}: #{error.message})"
26
+ end
27
+
28
+ ::Andpush::Client
29
+ .new(domain || DOMAIN, request_handler: Http2RequestHandler.new)
30
+ .register_interceptor(Authenticator.new(server_key))
31
+ end
16
32
  end
17
33
 
18
34
  class Authenticator
@@ -42,5 +58,50 @@ module Andpush
42
58
  end
43
59
  end
44
60
 
45
- private_constant :Authenticator, :ConnectionPool
61
+ class Http2RequestHandler
62
+ BY_HEADER_LINE = /[\r\n]+/.freeze
63
+ HEADER_VALUE = /^(\S+): (.+)/.freeze
64
+ EMPTY_HEADERS = {}.freeze
65
+
66
+ attr_reader :multi
67
+
68
+ def initialize(max_connects: 100)
69
+ @multi = Curl::Multi.new
70
+
71
+ @multi.pipeline = Curl::CURLPIPE_MULTIPLEX if defined?(Curl::CURLPIPE_MULTIPLEX)
72
+ @multi.max_connects = max_connects
73
+ end
74
+
75
+ def call(request_class, uri, headers, body, *_)
76
+ easy = Curl::Easy.new(uri.to_s)
77
+
78
+ easy.multi = @multi
79
+ easy.headers = headers || EMPTY_HEADERS
80
+ easy.post_body = body if request_class::REQUEST_HAS_BODY
81
+
82
+ if defined?(Curl::CURLPIPE_MULTIPLEX)
83
+ # This ensures libcurl waits for the connection to reveal if it is
84
+ # possible to pipeline/multiplex on before it continues.
85
+ easy.setopt(Curl::CURLOPT_PIPEWAIT, 1)
86
+ easy.version = Curl::HTTP_2_0
87
+ end
88
+
89
+ easy.public_send(:"http_#{request_class::METHOD.downcase}")
90
+
91
+ Response.new(
92
+ Hash[easy.header_str.split(BY_HEADER_LINE).flat_map {|s| s.scan(HEADER_VALUE) }],
93
+ easy.body,
94
+ easy.response_code.to_s, # to_s for compatibility with Net::HTTP
95
+ easy,
96
+ ).freeze
97
+ end
98
+
99
+ Response = Struct.new(:headers, :body, :code, :raw_response) do
100
+ alias to_hash headers
101
+ end
102
+
103
+ private_constant :BY_HEADER_LINE, :HEADER_VALUE, :Response
104
+ end
105
+
106
+ private_constant :Authenticator, :ConnectionPool, :Http2RequestHandler
46
107
  end
@@ -1,3 +1,3 @@
1
1
  module Andpush
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.2.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: andpush
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuki Nishijima
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-08 00:00:00.000000000 Z
11
+ date: 2018-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-http-persistent
@@ -66,7 +66,8 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- description: Andpush is an HTTP client for Firebase Cloud Messaging.
69
+ description: 'Android Push Notification in Ruby: simple, fast, high-quality client
70
+ for FCM (Firebase Cloud Messaging)'
70
71
  email:
71
72
  - mail@yukinishijima.net
72
73
  executables: []
@@ -82,6 +83,7 @@ files:
82
83
  - README.md
83
84
  - Rakefile
84
85
  - andpush.gemspec
86
+ - assets/curl-version.png
85
87
  - bin/console
86
88
  - bin/setup
87
89
  - fcm.apispec
@@ -114,5 +116,5 @@ rubyforge_project:
114
116
  rubygems_version: 2.7.6
115
117
  signing_key:
116
118
  specification_version: 4
117
- summary: FCM HTTP client
119
+ summary: Simple, fast, high-quality client for FCM (Firebase Cloud Messaging)
118
120
  test_files: []