rpush 2.3.2-java → 2.4.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/README.md +1 -1
  4. data/lib/generators/rpush_migration_generator.rb +21 -6
  5. data/lib/generators/templates/rpush.rb +5 -5
  6. data/lib/generators/templates/rpush_2_0_0_updates.rb +24 -0
  7. data/lib/rpush/client/active_model/apns/notification.rb +1 -1
  8. data/lib/rpush/client/mongoid/adm/app.rb +14 -0
  9. data/lib/rpush/client/mongoid/adm/notification.rb +11 -0
  10. data/lib/rpush/client/mongoid/apns/app.rb +11 -0
  11. data/lib/rpush/client/mongoid/apns/feedback.rb +21 -0
  12. data/lib/rpush/client/mongoid/apns/notification.rb +15 -0
  13. data/lib/rpush/client/mongoid/app.rb +23 -0
  14. data/lib/rpush/client/mongoid/gcm/app.rb +11 -0
  15. data/lib/rpush/client/mongoid/gcm/notification.rb +11 -0
  16. data/lib/rpush/client/mongoid/notification.rb +43 -0
  17. data/lib/rpush/client/mongoid/wpns/app.rb +11 -0
  18. data/lib/rpush/client/mongoid/wpns/notification.rb +11 -0
  19. data/lib/rpush/client/mongoid.rb +31 -0
  20. data/lib/rpush/client/redis.rb +2 -2
  21. data/lib/rpush/configuration.rb +48 -29
  22. data/lib/rpush/daemon/adm/delivery.rb +1 -1
  23. data/lib/rpush/daemon/apns/feedback_receiver.rb +2 -3
  24. data/lib/rpush/daemon/apns.rb +1 -1
  25. data/lib/rpush/daemon/dispatcher/apns_tcp.rb +2 -1
  26. data/lib/rpush/daemon/feeder.rb +4 -7
  27. data/lib/rpush/daemon/gcm/delivery.rb +1 -1
  28. data/lib/rpush/daemon/interruptible_sleep.rb +5 -50
  29. data/lib/rpush/daemon/proc_title.rb +2 -1
  30. data/lib/rpush/daemon/store/active_record.rb +4 -0
  31. data/lib/rpush/daemon/store/interface.rb +1 -1
  32. data/lib/rpush/daemon/store/mongoid.rb +157 -0
  33. data/lib/rpush/daemon/store/redis.rb +6 -2
  34. data/lib/rpush/deprecatable.rb +1 -2
  35. data/lib/rpush/deprecation.rb +6 -0
  36. data/lib/rpush/embed.rb +5 -0
  37. data/lib/rpush/logger.rb +5 -8
  38. data/lib/rpush/push.rb +5 -0
  39. data/lib/rpush/version.rb +1 -1
  40. data/lib/tasks/quality.rake +1 -1
  41. data/lib/tasks/test.rake +9 -4
  42. data/spec/functional/apns_spec.rb +2 -1
  43. data/spec/functional_spec_helper.rb +2 -2
  44. data/spec/spec_helper.rb +18 -7
  45. data/spec/support/config/mongoid.yml +69 -0
  46. data/spec/support/mongoid_setup.rb +10 -0
  47. data/spec/unit/client/active_record/adm/app_spec.rb +1 -1
  48. data/spec/unit/client/active_record/adm/notification_spec.rb +1 -1
  49. data/spec/unit/client/active_record/apns/app_spec.rb +1 -1
  50. data/spec/unit/client/active_record/apns/feedback_spec.rb +1 -1
  51. data/spec/unit/client/active_record/apns/notification_spec.rb +11 -11
  52. data/spec/unit/client/active_record/app_spec.rb +1 -1
  53. data/spec/unit/client/active_record/gcm/notification_spec.rb +1 -1
  54. data/spec/unit/client/active_record/notification_spec.rb +1 -1
  55. data/spec/unit/client/active_record/wpns/notification_spec.rb +1 -1
  56. data/spec/unit/configuration_spec.rb +7 -0
  57. data/spec/unit/daemon/apns/feedback_receiver_spec.rb +5 -5
  58. data/spec/unit/daemon/feeder_spec.rb +2 -2
  59. data/spec/unit/daemon/proc_title_spec.rb +11 -0
  60. data/spec/unit/daemon/store/active_record/reconnectable_spec.rb +1 -1
  61. data/spec/unit/daemon/store/active_record_spec.rb +21 -12
  62. data/spec/unit/daemon/store/mongoid_spec.rb +339 -0
  63. data/spec/unit/daemon/store/redis_spec.rb +365 -0
  64. data/spec/unit/embed_spec.rb +4 -2
  65. data/spec/unit/logger_spec.rb +14 -5
  66. data/spec/unit/notification_shared.rb +1 -1
  67. data/spec/unit/push_spec.rb +4 -2
  68. data/spec/unit_spec_helper.rb +3 -3
  69. metadata +27 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 781a6d71dd94117ad91ad2f72da207d25e61d3ea
4
- data.tar.gz: 460ef2c7fb2f5f00168f913f0eb3207697090501
3
+ metadata.gz: 49a209aeb1cf3b46511c9376fb0f35ba4ca1398e
4
+ data.tar.gz: c1402f1adf30cbb8c3fa2a81f1851920d0b4271d
5
5
  SHA512:
6
- metadata.gz: 0e039767bf42481ec7f34ed89be0dc0991670a9683ccff6bc92907a5ea9bad29c84b204ab0176e5936f766b245ba36477c67066e002790f0c60fdeaf47e72a84
7
- data.tar.gz: 9229d9d37108f5cef4eabfcea7b46c527e1eab2e2da689ad3f5bc8d250b40bd3bdc0feba84d860e7e151fe2be1810c91c47fd77e5eee31a72847b00cc225f03d
6
+ metadata.gz: ecea38aeb595d81a6b45ca2c83a9c4e45592e3fdc03022872948892153db560ac0719134d51823b188d1cde2e7f39709706497f3af37b30499b73acf5c176c58
7
+ data.tar.gz: 80229d942221cd34f38ae7a8a9684b102e7954cfb0201b7dd5eb63bfbdd9d6f05a4f87e0413b7fd857254fbc44df17ec5ed84d9a56d28622fc98f69c6a776f8f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## 2.4.0 (Fed 18, 2015)
2
+ Features:
3
+ * Support for MongoDB (using Mongoid).
4
+ * config.feedback_poll is now deprecated, use config.apns.feedback_receiver.frequency instead.
5
+ * Add config.apns.feedback_receiver.enabled to optionally enable the APNs feedback receiver (#129).
6
+ * Passing configuration options directly to Rpush.embed and Rpush.push is now deprecated.
7
+
8
+ Bug fixes:
9
+ * Fix setting the log level when using Rails 4+ or without Rails (#124).
10
+ * Fix the possibility for excessive error logging when using APNs (#128).
11
+ * Re-use timestamp when replacing a migration with the same name (#91).
12
+ * Ensure App/Notification type is updated during 2.0 upgrade migration (#102).
13
+
1
14
  ## 2.3.2 (Jan 30, 2015)
2
15
  Bug fixes:
3
16
  * Internal sleep mechanism would sometimes no wait for the full duration specified.
data/README.md CHANGED
@@ -19,7 +19,7 @@ Rpush aims to be the *de facto* gem for sending push notifications in Ruby. Its
19
19
 
20
20
  #### Feature Highlights
21
21
 
22
- * Use [**ActiveRecord**](https://github.com/rpush/rpush/wiki/Using-ActiveRecord) or [**Redis**](https://github.com/rpush/rpush/wiki/Using-Redis) for storage.
22
+ * Use [**ActiveRecord**](https://github.com/rpush/rpush/wiki/Using-ActiveRecord), [**Redis**](https://github.com/rpush/rpush/wiki/Using-Redis) or [**MongoDB**](https://github.com/rpush/rpush/wiki/Using-Mongodb) for storage.
23
23
  * Plugins for [**Bugsnag**](https://github.com/rpush/rpush-plugin-bugsnag),
24
24
  [**Sentry**](https://github.com/rpush/rpush-plugin-sentry), [**StatsD**](https://github.com/rpush/rpush-plugin-statsd).
25
25
  * Seamless integration with your projects, including **Rails**.
@@ -2,11 +2,25 @@ class RpushMigrationGenerator < Rails::Generators::Base
2
2
  include Rails::Generators::Migration
3
3
  source_root File.expand_path('../templates', __FILE__)
4
4
 
5
- def self.next_migration_number(path)
6
- @time ||= Time.now.utc
7
- @calls ||= -1
8
- @calls += 1
9
- (@time + @calls.seconds).strftime('%Y%m%d%H%M%S')
5
+ class << self
6
+ attr_accessor :next_template
7
+
8
+ def next_migration_number(path)
9
+ return new_migration_number unless next_template
10
+
11
+ if existing_migration = migration_exists?(File.expand_path('db/migrate'), next_template)
12
+ return File.basename(existing_migration).scan(/(\d+)_/).flatten.first
13
+ end
14
+
15
+ new_migration_number
16
+ end
17
+
18
+ def new_migration_number
19
+ @time ||= Time.now.utc
20
+ @calls ||= -1
21
+ @calls += 1
22
+ (@time + @calls.seconds).strftime('%Y%m%d%H%M%S')
23
+ end
10
24
  end
11
25
 
12
26
  def copy_migration
@@ -36,6 +50,7 @@ class RpushMigrationGenerator < Rails::Generators::Base
36
50
  end
37
51
 
38
52
  def add_rpush_migration(template)
39
- migration_template "#{template}.rb", "db/migrate/#{template}.rb"
53
+ self.class.next_template = template
54
+ migration_template "#{template}.rb", "db/migrate/#{template}.rb"
40
55
  end
41
56
  end
@@ -1,6 +1,6 @@
1
1
  Rpush.configure do |config|
2
2
 
3
- # Supported clients are :active_record and :redis.
3
+ # Supported clients are :active_record, :redis and :mongoid
4
4
  config.client = :active_record
5
5
 
6
6
  # Options passed to Redis.new
@@ -9,9 +9,6 @@ Rpush.configure do |config|
9
9
  # Frequency in seconds to check for new notifications.
10
10
  config.push_poll = 2
11
11
 
12
- # Frequency in seconds to check for feedback
13
- config.feedback_poll = 60
14
-
15
12
  # The maximum number of notifications to load from the store every `push_poll` seconds.
16
13
  # If some notifications are still enqueued internally, Rpush will load the batch_size less
17
14
  # the number enqueued. An exception to this is if the service is able to receive multiple
@@ -24,11 +21,14 @@ Rpush.configure do |config|
24
21
  # Path to log file. Relative to current directory unless absolute.
25
22
  config.log_file = 'log/rpush.log'
26
23
 
27
- config.log_level = (defined?(Rails) && Rails.logger) ? Rails.logger.level : ::Logger::Severity::INFO
24
+ config.log_level = (defined?(Rails) && Rails.logger) ? Rails.logger.level : ::Logger::Severity::DEBUG
28
25
 
29
26
  # Define a custom logger.
30
27
  # config.logger = MyLogger.new
31
28
 
29
+ # config.apns.feedback_receiver.enabled = true
30
+ # config.apns.feedback_receiver.frequency = 60
31
+
32
32
  end
33
33
 
34
34
  Rpush.reflect do |on|
@@ -1,4 +1,18 @@
1
1
  class Rpush200Updates < ActiveRecord::Migration
2
+ module Rpush
3
+ class App < ActiveRecord::Base
4
+ self.table_name = 'rpush_apps'
5
+ end
6
+
7
+ class Notification < ActiveRecord::Base
8
+ self.table_name = 'rpush_notifications'
9
+ end
10
+ end
11
+
12
+ def self.update_type(model, from, to)
13
+ model.where(type: from).update_all(type: to)
14
+ end
15
+
2
16
  def self.up
3
17
  add_column :rpush_notifications, :processing, :boolean, null: false, default: false
4
18
  add_column :rpush_notifications, :priority, :integer, null: true
@@ -16,9 +30,19 @@ class Rpush200Updates < ActiveRecord::Migration
16
30
  else
17
31
  change_column :rpush_feedback, :app_id, :integer
18
32
  end
33
+
34
+ [:Apns, :Gcm, :Wpns, :Adm].each do |service|
35
+ update_type(Rpush200Updates::Rpush::App, "Rpush::#{service}::App", "Rpush::Client::ActiveRecord::#{service}::App")
36
+ update_type(Rpush200Updates::Rpush::Notification, "Rpush::#{service}::Notification", "Rpush::Client::ActiveRecord::#{service}::Notification")
37
+ end
19
38
  end
20
39
 
21
40
  def self.down
41
+ [:Apns, :Gcm, :Wpns, :Adm].each do |service|
42
+ update_type(Rpush200Updates::Rpush::App, "Rpush::Client::ActiveRecord::#{service}::App", "Rpush::#{service}::App")
43
+ update_type(Rpush200Updates::Rpush::Notification, "Rpush::Client::ActiveRecord::#{service}::Notification", "Rpush::#{service}::Notification")
44
+ end
45
+
22
46
  change_column :rpush_feedback, :app_id, :string
23
47
  rename_column :rpush_feedback, :app_id, :app
24
48
 
@@ -66,7 +66,7 @@ module Rpush
66
66
 
67
67
  def to_binary(options = {}) # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
68
68
  frame_payload = payload
69
- frame_id = options[:for_validation] ? 0 : id
69
+ frame_id = options[:for_validation] ? 0 : send(options.fetch(:id_attribute, :id))
70
70
  frame = ""
71
71
  frame << [1, 32, device_token].pack("cnH*")
72
72
  frame << [2, frame_payload.bytesize, frame_payload].pack("cna*")
@@ -0,0 +1,14 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ module Adm
5
+ class App < Rpush::Client::Mongoid::App
6
+ include Rpush::Client::ActiveModel::Adm::App
7
+
8
+ field :access_token, type: String
9
+ field :access_token_expiration, type: Time
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ module Adm
5
+ class Notification < Rpush::Client::Mongoid::Notification
6
+ include Rpush::Client::ActiveModel::Adm::Notification
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ module Apns
5
+ class App < Rpush::Client::Mongoid::App
6
+ include Rpush::Client::ActiveModel::Apns::App
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ module Apns
5
+ class Feedback
6
+ include ::Mongoid::Document
7
+
8
+ field :device_token, type: String
9
+ field :failed_at, type: Time
10
+
11
+ belongs_to :app
12
+
13
+ validates :device_token, presence: true
14
+ validates :failed_at, presence: true
15
+
16
+ validates_with Rpush::Client::ActiveModel::Apns::DeviceTokenFormatValidator
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ module Apns
5
+ class Notification < Rpush::Client::Mongoid::Notification
6
+ include Rpush::Client::ActiveModel::Apns::Notification
7
+
8
+ def to_binary(options = {})
9
+ super(options.merge(id_attribute: :integer_id))
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ class App
5
+ include ::Mongoid::Document
6
+
7
+ field :name, type: String
8
+ field :environment, type: String
9
+ field :certificate, type: String
10
+ field :password, type: String
11
+ field :connections, type: Integer, default: 1
12
+ field :auth_key, type: String
13
+ field :client_id, type: String
14
+ field :client_secret, type: String
15
+
16
+ index name: 1
17
+
18
+ validates :name, presence: true
19
+ validates_numericality_of :connections, greater_than: 0, only_integer: true
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ module Gcm
5
+ class App < Rpush::Client::Mongoid::App
6
+ include Rpush::Client::ActiveModel::Gcm::App
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ module Gcm
5
+ class Notification < Rpush::Client::Mongoid::Notification
6
+ include Rpush::Client::ActiveModel::Gcm::Notification
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,43 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ class Notification
5
+ include ::Mongoid::Document
6
+ include ::Mongoid::Autoinc
7
+ include Rpush::MultiJsonHelper
8
+ include Rpush::Client::ActiveModel::Notification
9
+
10
+ field :badge, type: Integer
11
+ field :device_token, type: String
12
+ field :sound, type: String, default: 'default'
13
+ field :alert, type: String
14
+ field :data, type: Hash
15
+ field :expiry, type: Integer, default: 1.day.to_i
16
+ field :delivered, type: Boolean, default: false
17
+ field :delivered_at, type: Time
18
+ field :processing, type: Boolean, default: false
19
+ field :failed, type: Boolean, default: false
20
+ field :failed_at, type: Time
21
+ field :fail_after, type: Time
22
+ field :retries, type: Integer, default: 0
23
+ field :error_code, type: Integer
24
+ field :error_description, type: String
25
+ field :deliver_after, type: Time
26
+ field :alert_is_json, type: Boolean
27
+ field :collapse_key, type: String
28
+ field :delay_while_idle, type: Boolean
29
+ field :registration_ids, type: Array
30
+ field :uri, type: String
31
+ field :priority, type: Integer
32
+ field :url_args, type: Array
33
+ field :category, type: String
34
+
35
+ field :integer_id, type: Integer
36
+ increments :integer_id, model_name: name
37
+ index integer_id: 1
38
+
39
+ belongs_to :app
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,11 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ module Wpns
5
+ class App < Rpush::Client::Mongoid::App
6
+ include Rpush::Client::ActiveModel::Wpns::App
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ module Wpns
5
+ class Notification < Rpush::Client::Mongoid::Notification
6
+ include Rpush::Client::ActiveModel::Wpns::Notification
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,31 @@
1
+
2
+ # :nocov:
3
+ begin
4
+ require 'mongoid'
5
+ require 'autoinc'
6
+ rescue LoadError
7
+ puts
8
+ str = "* Please add 'rpush-mongoid' to your Gemfile to use the Mongoid client. *"
9
+ puts "*" * str.size
10
+ puts str
11
+ puts "*" * str.size
12
+ puts
13
+ end
14
+
15
+ require 'rpush/client/active_model'
16
+
17
+ require 'rpush/client/mongoid/notification'
18
+ require 'rpush/client/mongoid/app'
19
+
20
+ require 'rpush/client/mongoid/apns/notification'
21
+ require 'rpush/client/mongoid/apns/feedback'
22
+ require 'rpush/client/mongoid/apns/app'
23
+
24
+ require 'rpush/client/mongoid/gcm/notification'
25
+ require 'rpush/client/mongoid/gcm/app'
26
+
27
+ require 'rpush/client/mongoid/wpns/notification'
28
+ require 'rpush/client/mongoid/wpns/app'
29
+
30
+ require 'rpush/client/mongoid/adm/notification'
31
+ require 'rpush/client/mongoid/adm/app'
@@ -1,6 +1,8 @@
1
+
1
2
  # :nocov:
2
3
  begin
3
4
  require 'modis'
5
+ require 'redis'
4
6
  rescue LoadError
5
7
  puts
6
8
  str = "* Please add 'rpush-redis' to your Gemfile to use the Redis client. *"
@@ -10,8 +12,6 @@ rescue LoadError
10
12
  puts
11
13
  end
12
14
 
13
- require 'redis'
14
-
15
15
  require 'rpush/client/active_model'
16
16
 
17
17
  require 'rpush/client/redis/app'
@@ -1,35 +1,64 @@
1
1
  require 'pathname'
2
2
 
3
3
  module Rpush
4
- def self.config
5
- @config ||= Rpush::Configuration.new
6
- end
4
+ class << self
5
+ attr_writer :config
6
+
7
+ def config
8
+ @config ||= Rpush::Configuration.new
9
+ end
7
10
 
8
- def self.configure
9
- if block_given?
11
+ def configure
12
+ return unless block_given?
10
13
  yield config
11
14
  config.initialize_client
12
15
  end
13
16
  end
14
17
 
15
- CURRENT_ATTRS = [:push_poll, :feedback_poll, :embedded, :pid_file, :batch_size,
16
- :push, :client, :logger, :log_file, :foreground, :log_level, :plugin]
17
- DEPRECATED_ATTRS = [:log_dir]
18
+ CURRENT_ATTRS = [:push_poll, :embedded, :pid_file, :batch_size, :push, :client, :logger, :log_file, :foreground, :log_level, :plugin, :apns]
19
+ DEPRECATED_ATTRS = [:feedback_poll]
18
20
  CONFIG_ATTRS = CURRENT_ATTRS + DEPRECATED_ATTRS
19
21
 
20
22
  class ConfigurationError < StandardError; end
21
- class ConfigurationWithoutDefaults < Struct.new(*CONFIG_ATTRS); end
23
+ class ConfigurationWithoutDefaults < Struct.new(*CONFIG_ATTRS); end # rubocop:disable Style/StructInheritance
22
24
 
23
- class Configuration < Struct.new(*CONFIG_ATTRS)
24
- include Deprecatable
25
+ class ApnsFeedbackReceiverConfiguration < Struct.new(:frequency, :enabled) # rubocop:disable Style/StructInheritance
26
+ def initialize
27
+ super
28
+ self.enabled = true
29
+ self.frequency = 60
30
+ end
31
+ end
32
+
33
+ class ApnsConfiguration < Struct.new(:feedback_receiver) # rubocop:disable Style/StructInheritance
34
+ def initialize
35
+ super
36
+ self.feedback_receiver = ApnsFeedbackReceiverConfiguration.new
37
+ end
38
+ end
25
39
 
26
- deprecated(:log_dir=, '2.3.0', 'Please use log_file instead.')
40
+ class Configuration < Struct.new(*CONFIG_ATTRS) # rubocop:disable Style/StructInheritance
41
+ include Deprecatable
27
42
 
28
43
  delegate :redis_options, to: '::Modis'
29
44
 
30
45
  def initialize
31
46
  super
32
- set_defaults
47
+
48
+ self.push_poll = 2
49
+ self.batch_size = 100
50
+ self.logger = nil
51
+ self.log_file = 'log/rpush.log'
52
+ self.pid_file = 'tmp/rpush.pid'
53
+ self.log_level = (defined?(Rails) && Rails.logger) ? Rails.logger.level : ::Logger::Severity::DEBUG
54
+ self.plugin = OpenStruct.new
55
+ self.foreground = false
56
+
57
+ self.apns = ApnsConfiguration.new
58
+
59
+ # Internal options.
60
+ self.embedded = false
61
+ self.push = false
33
62
  end
34
63
 
35
64
  def update(other)
@@ -68,31 +97,21 @@ module Rpush
68
97
  Modis.redis_options = options if client == :redis
69
98
  end
70
99
 
71
- def set_defaults
72
- self.push_poll = 2
73
- self.feedback_poll = 60
74
- self.batch_size = 100
75
- self.logger = nil
76
- self.log_file = 'log/rpush.log'
77
- self.pid_file = 'tmp/rpush.pid'
78
- self.log_level = (defined?(Rails) && Rails.logger) ? Rails.logger.level : ::Logger::Severity::INFO
79
- self.plugin = OpenStruct.new
80
- self.foreground = false
81
-
82
- # Internal options.
83
- self.embedded = false
84
- self.push = false
100
+ def feedback_poll=(frequency)
101
+ apns.feedback_receiver.frequency = frequency
85
102
  end
103
+ deprecated(:feedback_poll=, '2.5.0', 'Please use apns.feedback_receiver.frequency= instead.')
86
104
 
87
105
  def initialize_client
88
106
  return if @client_initialized
89
107
  raise ConfigurationError, 'Rpush.config.client is not set.' unless client
90
108
  require "rpush/client/#{client}"
109
+
91
110
  client_module = Rpush::Client.const_get(client.to_s.camelize)
92
- Rpush.send(:include, client_module)
111
+ Rpush.send(:include, client_module) unless Rpush.ancestors.include?(client_module)
93
112
 
94
113
  [:Apns, :Gcm, :Wpns, :Adm].each do |service|
95
- Rpush.const_set(service, client_module.const_get(service))
114
+ Rpush.const_set(service, client_module.const_get(service)) unless Rpush.const_defined?(service)
96
115
  end
97
116
 
98
117
  @client_initialized = true
@@ -151,7 +151,7 @@ module Rpush
151
151
  end
152
152
 
153
153
  def create_new_notification(response, registration_ids)
154
- attrs = @notification.attributes.slice('app_id', 'collapse_key', 'delay_while_idle')
154
+ attrs = { 'app_id' => @notification.app_id, 'collapse_key' => @notification.collapse_key, 'delay_while_idle' => @notification.delay_while_idle }
155
155
  Rpush::Daemon.store.create_adm_notification(attrs, @notification.data, registration_ids, deliver_after_header(response), @notification.app)
156
156
  end
157
157
 
@@ -19,19 +19,18 @@ module Rpush
19
19
  @host, @port = HOSTS[@app.environment.to_sym]
20
20
  @certificate = app.certificate
21
21
  @password = app.password
22
- @interruptible_sleep = InterruptibleSleep.new(Rpush.config.feedback_poll)
22
+ @interruptible_sleep = InterruptibleSleep.new
23
23
  end
24
24
 
25
25
  def start
26
26
  return if Rpush.config.push
27
27
  Rpush.logger.info("[#{@app.name}] Starting feedback receiver... ", true)
28
- @interruptible_sleep.start
29
28
 
30
29
  @thread = Thread.new do
31
30
  loop do
32
31
  break if @stop
33
32
  check_for_feedback
34
- @interruptible_sleep.sleep
33
+ @interruptible_sleep.sleep(Rpush.config.apns.feedback_receiver.frequency)
35
34
  end
36
35
 
37
36
  Rpush::Daemon.store.release_connection
@@ -11,7 +11,7 @@ module Rpush
11
11
 
12
12
  batch_deliveries true
13
13
  dispatcher :apns_tcp, host: proc { |app| HOSTS[app.environment.to_sym] }
14
- loops Rpush::Daemon::Apns::FeedbackReceiver, if: -> { !Rpush.config.push }
14
+ loops Rpush::Daemon::Apns::FeedbackReceiver, if: -> { Rpush.config.apns.feedback_receiver.enabled && !Rpush.config.push }
15
15
  end
16
16
  end
17
17
  end
@@ -63,7 +63,7 @@ module Rpush
63
63
  # On Linux, select returns nil from a dropped connection.
64
64
  # On OS X, Errno::EBADF is raised following a Errno::EADDRNOTAVAIL from the write call.
65
65
  return unless @connection.select(SELECT_TIMEOUT)
66
- rescue SystemCallError
66
+ rescue SystemCallError, IOError
67
67
  # Connection closed.
68
68
  return
69
69
  end
@@ -93,6 +93,7 @@ module Rpush
93
93
  end
94
94
 
95
95
  def handle_error(code, notification_id)
96
+ notification_id = Rpush::Daemon.store.translate_integer_notification_id(notification_id)
96
97
  failed_pos = delivered_buffer.index(notification_id)
97
98
  description = APNS_ERRORS[code.to_i] || "Unknown error code #{code.inspect}. Possible Rpush bug?"
98
99
  log_error(description + " (#{code})")
@@ -21,7 +21,7 @@ module Rpush
21
21
  end
22
22
 
23
23
  def self.wakeup
24
- interruptible_sleeper.wakeup
24
+ interruptible_sleeper.stop
25
25
  end
26
26
 
27
27
  class << self
@@ -35,8 +35,8 @@ module Rpush
35
35
  def self.feed_forever
36
36
  loop do
37
37
  enqueue_notifications
38
- interruptible_sleeper.sleep
39
- break if should_stop
38
+ interruptible_sleeper.sleep(Rpush.config.push_poll)
39
+ return if should_stop
40
40
  end
41
41
  end
42
42
 
@@ -51,10 +51,7 @@ module Rpush
51
51
  end
52
52
 
53
53
  def self.interruptible_sleeper
54
- return @interruptible_sleeper if @interruptible_sleeper
55
- @interruptible_sleeper = InterruptibleSleep.new(Rpush.config.push_poll)
56
- @interruptible_sleeper.start
57
- @interruptible_sleeper
54
+ @interruptible_sleeper ||= InterruptibleSleep.new
58
55
  end
59
56
  end
60
57
  end
@@ -100,7 +100,7 @@ module Rpush
100
100
  end
101
101
 
102
102
  def create_new_notification(response, unavailable_idxs)
103
- attrs = @notification.attributes.slice('app_id', 'collapse_key', 'delay_while_idle')
103
+ attrs = { 'app_id' => @notification.app_id, 'collapse_key' => @notification.collapse_key, 'delay_while_idle' => @notification.delay_while_idle }
104
104
  registration_ids = @notification.registration_ids.values_at(*unavailable_idxs)
105
105
  Rpush::Daemon.store.create_gcm_notification(attrs, @notification.data,
106
106
  registration_ids, deliver_after_header(response), @notification.app)