rpush 1.0.0 → 2.0.0.beta1

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.
Files changed (193) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/README.md +12 -14
  4. data/bin/rpush +11 -2
  5. data/lib/generators/rpush_generator.rb +2 -0
  6. data/lib/generators/templates/add_adm.rb +5 -5
  7. data/lib/generators/templates/add_alert_is_json_to_rapns_notifications.rb +1 -1
  8. data/lib/generators/templates/add_app_to_rapns.rb +2 -2
  9. data/lib/generators/templates/add_fail_after_to_rpush_notifications.rb +1 -1
  10. data/lib/generators/templates/add_gcm.rb +32 -32
  11. data/lib/generators/templates/add_rpush.rb +67 -67
  12. data/lib/generators/templates/add_wpns.rb +2 -2
  13. data/lib/generators/templates/create_rapns_apps.rb +5 -5
  14. data/lib/generators/templates/create_rapns_feedback.rb +2 -2
  15. data/lib/generators/templates/create_rapns_notifications.rb +15 -15
  16. data/lib/generators/templates/rpush.rb +10 -7
  17. data/lib/generators/templates/rpush_2_0_0_updates.rb +23 -0
  18. data/lib/rpush.rb +4 -28
  19. data/lib/rpush/client/active_model.rb +21 -0
  20. data/lib/rpush/client/active_model/adm/app.rb +23 -0
  21. data/lib/rpush/client/active_model/adm/data_validator.rb +14 -0
  22. data/lib/rpush/client/active_model/adm/notification.rb +28 -0
  23. data/lib/rpush/client/active_model/apns/app.rb +37 -0
  24. data/lib/rpush/client/active_model/apns/binary_notification_validator.rb +16 -0
  25. data/lib/rpush/client/active_model/apns/device_token_format_validator.rb +14 -0
  26. data/lib/rpush/client/active_model/apns/notification.rb +90 -0
  27. data/lib/rpush/client/active_model/gcm/app.rb +19 -0
  28. data/lib/rpush/client/active_model/gcm/expiry_collapse_key_mutual_inclusion_validator.rb +14 -0
  29. data/lib/rpush/client/active_model/gcm/notification.rb +31 -0
  30. data/lib/rpush/client/active_model/notification.rb +26 -0
  31. data/lib/rpush/client/active_model/payload_data_size_validator.rb +13 -0
  32. data/lib/rpush/client/active_model/registration_ids_count_validator.rb +13 -0
  33. data/lib/rpush/client/active_model/wpns/app.rb +13 -0
  34. data/lib/rpush/client/active_model/wpns/notification.rb +17 -0
  35. data/lib/rpush/client/active_record.rb +19 -0
  36. data/lib/rpush/client/active_record/adm/app.rb +11 -0
  37. data/lib/rpush/client/active_record/adm/notification.rb +11 -0
  38. data/lib/rpush/client/active_record/apns/app.rb +11 -0
  39. data/lib/rpush/client/active_record/apns/feedback.rb +20 -0
  40. data/lib/rpush/client/active_record/apns/notification.rb +46 -0
  41. data/lib/rpush/client/active_record/app.rb +17 -0
  42. data/lib/rpush/client/active_record/gcm/app.rb +11 -0
  43. data/lib/rpush/client/active_record/gcm/notification.rb +11 -0
  44. data/lib/rpush/client/active_record/notification.rb +38 -0
  45. data/lib/rpush/client/active_record/wpns/app.rb +11 -0
  46. data/lib/rpush/client/active_record/wpns/notification.rb +11 -0
  47. data/lib/rpush/client/redis.rb +35 -0
  48. data/lib/rpush/client/redis/adm/app.rb +14 -0
  49. data/lib/rpush/client/redis/adm/notification.rb +11 -0
  50. data/lib/rpush/client/redis/apns/app.rb +11 -0
  51. data/lib/rpush/client/redis/apns/feedback.rb +20 -0
  52. data/lib/rpush/client/redis/apns/notification.rb +11 -0
  53. data/lib/rpush/client/redis/app.rb +22 -0
  54. data/lib/rpush/client/redis/gcm/app.rb +11 -0
  55. data/lib/rpush/client/redis/gcm/notification.rb +11 -0
  56. data/lib/rpush/client/redis/notification.rb +68 -0
  57. data/lib/rpush/client/redis/wpns/app.rb +11 -0
  58. data/lib/rpush/client/redis/wpns/notification.rb +11 -0
  59. data/lib/rpush/configuration.rb +27 -6
  60. data/lib/rpush/daemon.rb +36 -56
  61. data/lib/rpush/daemon/adm/delivery.rb +50 -52
  62. data/lib/rpush/daemon/apns.rb +6 -5
  63. data/lib/rpush/daemon/apns/delivery.rb +20 -44
  64. data/lib/rpush/daemon/apns/feedback_receiver.rb +11 -8
  65. data/lib/rpush/daemon/app_runner.rb +67 -60
  66. data/lib/rpush/daemon/batch.rb +54 -40
  67. data/lib/rpush/daemon/delivery.rb +13 -3
  68. data/lib/rpush/daemon/delivery_error.rb +10 -2
  69. data/lib/rpush/daemon/dispatcher/apns_tcp.rb +106 -0
  70. data/lib/rpush/daemon/dispatcher/http.rb +3 -3
  71. data/lib/rpush/daemon/dispatcher/tcp.rb +3 -3
  72. data/lib/rpush/daemon/dispatcher_loop.rb +15 -6
  73. data/lib/rpush/daemon/errors.rb +18 -0
  74. data/lib/rpush/daemon/feeder.rb +28 -39
  75. data/lib/rpush/daemon/gcm/delivery.rb +19 -20
  76. data/lib/rpush/daemon/interruptible_sleep.rb +26 -45
  77. data/lib/rpush/daemon/loggable.rb +2 -4
  78. data/lib/rpush/daemon/proc_title.rb +16 -0
  79. data/lib/rpush/daemon/queue_payload.rb +12 -0
  80. data/lib/rpush/daemon/reflectable.rb +3 -5
  81. data/lib/rpush/daemon/retry_header_parser.rb +6 -6
  82. data/lib/rpush/daemon/ring_buffer.rb +16 -0
  83. data/lib/rpush/daemon/service_config_methods.rb +23 -7
  84. data/lib/rpush/daemon/signal_handler.rb +51 -0
  85. data/lib/rpush/daemon/store/active_record.rb +71 -38
  86. data/lib/rpush/daemon/store/active_record/reconnectable.rb +15 -15
  87. data/lib/rpush/daemon/store/interface.rb +19 -0
  88. data/lib/rpush/daemon/store/redis.rb +149 -0
  89. data/lib/rpush/daemon/tcp_connection.rb +6 -11
  90. data/lib/rpush/daemon/wpns/delivery.rb +21 -30
  91. data/lib/rpush/deprecatable.rb +4 -3
  92. data/lib/rpush/deprecation.rb +7 -10
  93. data/lib/rpush/embed.rb +7 -2
  94. data/lib/rpush/logger.rb +11 -15
  95. data/lib/rpush/push.rb +0 -1
  96. data/lib/rpush/reflection.rb +6 -12
  97. data/lib/rpush/version.rb +1 -1
  98. data/lib/tasks/quality.rake +34 -0
  99. data/spec/.rubocop.yml +4 -0
  100. data/spec/functional/adm_spec.rb +3 -6
  101. data/spec/functional/apns_spec.rb +118 -24
  102. data/spec/functional/embed_spec.rb +22 -20
  103. data/spec/functional/gcm_spec.rb +4 -7
  104. data/spec/functional/new_app_spec.rb +61 -0
  105. data/spec/functional/retry_spec.rb +46 -0
  106. data/spec/functional/wpns_spec.rb +3 -6
  107. data/spec/functional_spec_helper.rb +26 -0
  108. data/spec/integration/rpush_spec.rb +13 -0
  109. data/spec/integration/support/gcm_success_response.json +1 -0
  110. data/spec/spec_helper.rb +60 -0
  111. data/spec/support/active_record_setup.rb +48 -0
  112. data/{config → spec/support/config}/database.yml +0 -0
  113. data/spec/support/install.sh +43 -7
  114. data/spec/support/simplecov_helper.rb +9 -5
  115. data/spec/support/simplecov_quality_formatter.rb +10 -6
  116. data/spec/unit/apns_feedback_spec.rb +3 -3
  117. data/spec/unit/{adm → client/active_record/adm}/app_spec.rb +3 -3
  118. data/spec/unit/{adm → client/active_record/adm}/notification_spec.rb +5 -7
  119. data/spec/unit/client/active_record/apns/app_spec.rb +29 -0
  120. data/spec/unit/client/active_record/apns/feedback_spec.rb +9 -0
  121. data/spec/unit/client/active_record/apns/notification_spec.rb +231 -0
  122. data/spec/unit/client/active_record/app_spec.rb +30 -0
  123. data/spec/unit/client/active_record/gcm/app_spec.rb +4 -0
  124. data/spec/unit/{gcm → client/active_record/gcm}/notification_spec.rb +5 -7
  125. data/spec/unit/client/active_record/notification_spec.rb +15 -0
  126. data/spec/unit/client/active_record/wpns/app_spec.rb +4 -0
  127. data/spec/unit/client/active_record/wpns/notification_spec.rb +21 -0
  128. data/spec/unit/configuration_spec.rb +12 -5
  129. data/spec/unit/daemon/adm/delivery_spec.rb +57 -54
  130. data/spec/unit/daemon/apns/certificate_expired_error_spec.rb +3 -3
  131. data/spec/unit/daemon/apns/delivery_spec.rb +90 -83
  132. data/spec/unit/daemon/apns/feedback_receiver_spec.rb +24 -17
  133. data/spec/unit/daemon/app_runner_spec.rb +66 -123
  134. data/spec/unit/daemon/batch_spec.rb +52 -115
  135. data/spec/unit/daemon/delivery_spec.rb +15 -1
  136. data/spec/unit/daemon/dispatcher/http_spec.rb +3 -2
  137. data/spec/unit/daemon/dispatcher/tcp_spec.rb +10 -9
  138. data/spec/unit/daemon/dispatcher_loop_spec.rb +7 -12
  139. data/spec/unit/daemon/feeder_spec.rb +40 -39
  140. data/spec/unit/daemon/gcm/delivery_spec.rb +108 -89
  141. data/spec/unit/daemon/reflectable_spec.rb +2 -2
  142. data/spec/unit/daemon/retryable_error_spec.rb +1 -1
  143. data/spec/unit/daemon/service_config_methods_spec.rb +6 -3
  144. data/spec/unit/daemon/signal_handler_spec.rb +72 -0
  145. data/spec/unit/daemon/store/active_record/reconnectable_spec.rb +9 -9
  146. data/spec/unit/daemon/store/active_record_spec.rb +38 -47
  147. data/spec/unit/daemon/tcp_connection_spec.rb +22 -34
  148. data/spec/unit/daemon/too_many_requests_error_spec.rb +1 -1
  149. data/spec/unit/daemon/wpns/delivery_spec.rb +61 -50
  150. data/spec/unit/daemon_spec.rb +46 -81
  151. data/spec/unit/embed_spec.rb +4 -2
  152. data/spec/unit/logger_spec.rb +30 -40
  153. data/spec/unit/notification_shared.rb +9 -79
  154. data/spec/unit/push_spec.rb +3 -8
  155. data/spec/unit/reflection_spec.rb +25 -25
  156. data/spec/unit/rpush_spec.rb +1 -2
  157. data/spec/unit_spec_helper.rb +33 -88
  158. metadata +119 -67
  159. data/lib/rpush/TODO +0 -3
  160. data/lib/rpush/adm/app.rb +0 -15
  161. data/lib/rpush/adm/data_validator.rb +0 -11
  162. data/lib/rpush/adm/notification.rb +0 -29
  163. data/lib/rpush/apns/app.rb +0 -29
  164. data/lib/rpush/apns/binary_notification_validator.rb +0 -12
  165. data/lib/rpush/apns/device_token_format_validator.rb +0 -12
  166. data/lib/rpush/apns/feedback.rb +0 -16
  167. data/lib/rpush/apns/notification.rb +0 -84
  168. data/lib/rpush/app.rb +0 -18
  169. data/lib/rpush/daemon/apns/certificate_expired_error.rb +0 -20
  170. data/lib/rpush/daemon/apns/disconnection_error.rb +0 -20
  171. data/lib/rpush/gcm/app.rb +0 -11
  172. data/lib/rpush/gcm/expiry_collapse_key_mutual_inclusion_validator.rb +0 -11
  173. data/lib/rpush/gcm/notification.rb +0 -30
  174. data/lib/rpush/notification.rb +0 -69
  175. data/lib/rpush/notifier.rb +0 -52
  176. data/lib/rpush/payload_data_size_validator.rb +0 -10
  177. data/lib/rpush/railtie.rb +0 -11
  178. data/lib/rpush/registration_ids_count_validator.rb +0 -10
  179. data/lib/rpush/wpns/app.rb +0 -9
  180. data/lib/rpush/wpns/notification.rb +0 -26
  181. data/lib/tasks/cane.rake +0 -18
  182. data/lib/tasks/rpush.rake +0 -16
  183. data/spec/unit/apns/app_spec.rb +0 -29
  184. data/spec/unit/apns/feedback_spec.rb +0 -9
  185. data/spec/unit/apns/notification_spec.rb +0 -208
  186. data/spec/unit/app_spec.rb +0 -30
  187. data/spec/unit/daemon/apns/disconnection_error_spec.rb +0 -18
  188. data/spec/unit/daemon/interruptible_sleep_spec.rb +0 -68
  189. data/spec/unit/gcm/app_spec.rb +0 -4
  190. data/spec/unit/notification_spec.rb +0 -15
  191. data/spec/unit/notifier_spec.rb +0 -49
  192. data/spec/unit/wpns/app_spec.rb +0 -4
  193. data/spec/unit/wpns/notification_spec.rb +0 -30
@@ -1,3 +0,0 @@
1
- * Should internal errors mark a notification as failed?
2
- * Check cert expiry when connected.
3
- * Lazy connect on socket write? - would allow to catch initial expiry error and mark on notification.
@@ -1,15 +0,0 @@
1
- module Rpush
2
- module Adm
3
- class App < Rpush::App
4
- validates :client_id, :client_secret, :presence => true
5
-
6
- def access_token_expired?
7
- self.access_token_expiration.nil? || self.access_token_expiration < Time.now
8
- end
9
-
10
- def service_name
11
- 'adm'
12
- end
13
- end
14
- end
15
- end
@@ -1,11 +0,0 @@
1
- module Rpush
2
- module Adm
3
- class DataValidator < ActiveModel::Validator
4
- def validate(record)
5
- if record.collapse_key.nil? && record.data.nil?
6
- record.errors[:data] << "must be set unless collapse_key is specified"
7
- end
8
- end
9
- end
10
- end
11
- end
@@ -1,29 +0,0 @@
1
- module Rpush
2
- module Adm
3
- class Notification < Rpush::Notification
4
- validates :registration_ids, :presence => true
5
-
6
- validates_with Rpush::PayloadDataSizeValidator, limit: 6144
7
- validates_with Rpush::RegistrationIdsCountValidator, limit: 100
8
-
9
- validates_with Rpush::Adm::DataValidator
10
-
11
- def as_json
12
- json = {
13
- 'data' => data
14
- }
15
-
16
- if collapse_key
17
- json['consolidationKey'] = collapse_key
18
- end
19
-
20
- # number of seconds before message is expired
21
- if expiry
22
- json['expiresAfter'] = expiry
23
- end
24
-
25
- json
26
- end
27
- end
28
- end
29
- end
@@ -1,29 +0,0 @@
1
- module Rpush
2
- module Apns
3
- class App < Rpush::App
4
- validates :environment, :presence => true, :inclusion => { :in => %w(development production sandbox) }
5
- validates :certificate, :presence => true
6
- validate :certificate_has_matching_private_key
7
-
8
- def service_name
9
- 'apns'
10
- end
11
-
12
- private
13
-
14
- def certificate_has_matching_private_key
15
- result = false
16
- if certificate.present?
17
- begin
18
- x509 = OpenSSL::X509::Certificate.new(certificate)
19
- pkey = OpenSSL::PKey::RSA.new(certificate, password)
20
- result = !x509.nil? && !pkey.nil?
21
- rescue OpenSSL::OpenSSLError
22
- errors.add :certificate, 'Certificate value must contain a certificate and a private key.'
23
- end
24
- end
25
- result
26
- end
27
- end
28
- end
29
- end
@@ -1,12 +0,0 @@
1
- module Rpush
2
- module Apns
3
- class BinaryNotificationValidator < ActiveModel::Validator
4
-
5
- def validate(record)
6
- if record.payload_size > 256
7
- record.errors[:base] << "APN notification cannot be larger than 256 bytes. Try condensing your alert and device attributes."
8
- end
9
- end
10
- end
11
- end
12
- end
@@ -1,12 +0,0 @@
1
- module Rpush
2
- module Apns
3
- class DeviceTokenFormatValidator < ActiveModel::Validator
4
-
5
- def validate(record)
6
- if record.device_token !~ /^[a-z0-9]{64}$/i
7
- record.errors[:device_token] << "is invalid"
8
- end
9
- end
10
- end
11
- end
12
- end
@@ -1,16 +0,0 @@
1
- module Rpush
2
- module Apns
3
- class Feedback < ActiveRecord::Base
4
- self.table_name = 'rpush_feedback'
5
-
6
- if Rpush.attr_accessible_available?
7
- attr_accessible :device_token, :failed_at, :app
8
- end
9
-
10
- validates :device_token, :presence => true
11
- validates :failed_at, :presence => true
12
-
13
- validates_with Rpush::Apns::DeviceTokenFormatValidator
14
- end
15
- end
16
- end
@@ -1,84 +0,0 @@
1
- module Rpush
2
- module Apns
3
- class Notification < Rpush::Notification
4
- class MultipleAppAssignmentError < StandardError; end
5
-
6
- validates :device_token, :presence => true
7
- validates :badge, :numericality => true, :allow_nil => true
8
-
9
- validates_with Rpush::Apns::DeviceTokenFormatValidator
10
- validates_with Rpush::Apns::BinaryNotificationValidator
11
-
12
- alias_method :attributes_for_device=, :data=
13
- alias_method :attributes_for_device, :data
14
-
15
- def device_token=(token)
16
- write_attribute(:device_token, token.delete(" <>")) if !token.nil?
17
- end
18
-
19
- def alert=(alert)
20
- if alert.is_a?(Hash)
21
- write_attribute(:alert, multi_json_dump(alert))
22
- self.alert_is_json = true if has_attribute?(:alert_is_json)
23
- else
24
- write_attribute(:alert, alert)
25
- self.alert_is_json = false if has_attribute?(:alert_is_json)
26
- end
27
- end
28
-
29
- def alert
30
- string_or_json = read_attribute(:alert)
31
-
32
- if has_attribute?(:alert_is_json)
33
- if alert_is_json?
34
- multi_json_load(string_or_json)
35
- else
36
- string_or_json
37
- end
38
- else
39
- multi_json_load(string_or_json) rescue string_or_json
40
- end
41
- end
42
-
43
- MDM_KEY = '__rpush_mdm__'
44
- def mdm=(magic)
45
- self.attributes_for_device = (attributes_for_device || {}).merge({ MDM_KEY => magic })
46
- end
47
-
48
- CONTENT_AVAILABLE_KEY = '__rpush_content_available__'
49
- def content_available=(bool)
50
- return unless bool
51
- self.attributes_for_device = (attributes_for_device || {}).merge({ CONTENT_AVAILABLE_KEY => true })
52
- end
53
-
54
- def as_json
55
- json = ActiveSupport::OrderedHash.new
56
-
57
- if attributes_for_device && attributes_for_device.key?(MDM_KEY)
58
- json['mdm'] = attributes_for_device[MDM_KEY]
59
- else
60
- json['aps'] = ActiveSupport::OrderedHash.new
61
- json['aps']['alert'] = alert if alert
62
- json['aps']['badge'] = badge if badge
63
- json['aps']['sound'] = sound if sound
64
-
65
- if attributes_for_device && attributes_for_device[CONTENT_AVAILABLE_KEY]
66
- json['aps']['content-available'] = 1
67
- end
68
-
69
- if attributes_for_device
70
- non_aps_attributes = attributes_for_device.reject { |k, v| k == CONTENT_AVAILABLE_KEY }
71
- non_aps_attributes.each { |k, v| json[k.to_s] = v }
72
- end
73
- end
74
-
75
- json
76
- end
77
-
78
- def to_binary(options = {})
79
- id_for_pack = options[:for_validation] ? 0 : id
80
- [1, id_for_pack, expiry, 0, 32, device_token, payload_size, payload].pack("cNNccH*na*")
81
- end
82
- end
83
- end
84
- end
@@ -1,18 +0,0 @@
1
- module Rpush
2
- class App < ActiveRecord::Base
3
- self.table_name = 'rpush_apps'
4
-
5
- if Rpush.attr_accessible_available?
6
- attr_accessible :name, :environment, :certificate, :password, :connections, :auth_key, :client_id, :client_secret
7
- end
8
-
9
- has_many :notifications, :class_name => 'Rpush::Notification', :dependent => :destroy
10
-
11
- validates :name, :presence => true, :uniqueness => { :scope => [:type, :environment] }
12
- validates_numericality_of :connections, :greater_than => 0, :only_integer => true
13
-
14
- def service_name
15
- raise NotImplementedError
16
- end
17
- end
18
- end
@@ -1,20 +0,0 @@
1
- module Rpush
2
- module Apns
3
- class CertificateExpiredError < StandardError
4
- attr_reader :app, :time
5
-
6
- def initialize(app, time)
7
- @app = app
8
- @time = time
9
- end
10
-
11
- def to_s
12
- message
13
- end
14
-
15
- def message
16
- "#{app.name} certificate expired at #{time}."
17
- end
18
- end
19
- end
20
- end
@@ -1,20 +0,0 @@
1
- module Rpush
2
- module Apns
3
- class DisconnectionError < StandardError
4
- attr_reader :code, :description
5
-
6
- def initialize
7
- @code = nil
8
- @description = "APNs disconnected without returning an error."
9
- end
10
-
11
- def to_s
12
- message
13
- end
14
-
15
- def message
16
- "The APNs disconnected without returning an error. This may indicate you are using an invalid certificate for the host."
17
- end
18
- end
19
- end
20
- end
@@ -1,11 +0,0 @@
1
- module Rpush
2
- module Gcm
3
- class App < Rpush::App
4
- validates :auth_key, :presence => true
5
-
6
- def service_name
7
- 'gcm'
8
- end
9
- end
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- module Rpush
2
- module Gcm
3
- class ExpiryCollapseKeyMutualInclusionValidator < ActiveModel::Validator
4
- def validate(record)
5
- if record.collapse_key && !record.expiry
6
- record.errors[:expiry] << "must be set when using a collapse_key"
7
- end
8
- end
9
- end
10
- end
11
- end
@@ -1,30 +0,0 @@
1
- module Rpush
2
- module Gcm
3
- class Notification < Rpush::Notification
4
- validates :registration_ids, :presence => true
5
-
6
- validates_with Rpush::PayloadDataSizeValidator, limit: 4096
7
- validates_with Rpush::RegistrationIdsCountValidator, limit: 1000
8
-
9
- validates_with Rpush::Gcm::ExpiryCollapseKeyMutualInclusionValidator
10
-
11
- def as_json
12
- json = {
13
- 'registration_ids' => registration_ids,
14
- 'delay_while_idle' => delay_while_idle,
15
- 'data' => data
16
- }
17
-
18
- if collapse_key
19
- json['collapse_key'] = collapse_key
20
- end
21
-
22
- if expiry
23
- json['time_to_live'] = expiry
24
- end
25
-
26
- json
27
- end
28
- end
29
- end
30
- end
@@ -1,69 +0,0 @@
1
- module Rpush
2
- class Notification < ActiveRecord::Base
3
- include Rpush::MultiJsonHelper
4
-
5
- self.table_name = 'rpush_notifications'
6
-
7
- # TODO: Dump using multi json.
8
- serialize :registration_ids
9
-
10
- belongs_to :app, :class_name => 'Rpush::App'
11
-
12
- if Rpush.attr_accessible_available?
13
- attr_accessible :badge, :device_token, :sound, :alert, :data, :expiry,:delivered,
14
- :delivered_at, :failed, :failed_at, :error_code, :error_description, :deliver_after,
15
- :alert_is_json, :app, :app_id, :collapse_key, :delay_while_idle, :registration_ids, :uri
16
- end
17
-
18
- validates :expiry, :numericality => true, :allow_nil => true
19
- validates :app, :presence => true
20
-
21
- scope :ready_for_delivery, lambda {
22
- where('delivered = ? AND failed = ? AND (deliver_after IS NULL OR deliver_after < ?)',
23
- false, false, Time.now)
24
- }
25
-
26
- scope :for_apps, lambda { |apps|
27
- where('app_id IN (?)', apps.map(&:id))
28
- }
29
-
30
- scope :completed, lambda { where("delivered = ? OR failed = ?", true, true) }
31
-
32
- def data=(attrs)
33
- return unless attrs
34
- raise ArgumentError, "must be a Hash" if !attrs.is_a?(Hash)
35
- write_attribute(:data, multi_json_dump(attrs.merge(data || {})))
36
- end
37
-
38
- def registration_ids=(ids)
39
- ids = [ids] if ids && !ids.is_a?(Array)
40
- super
41
- end
42
-
43
- def data
44
- multi_json_load(read_attribute(:data)) if read_attribute(:data)
45
- end
46
-
47
- def payload
48
- multi_json_dump(as_json)
49
- end
50
-
51
- def payload_size
52
- payload.bytesize
53
- end
54
-
55
- def payload_data_size
56
- multi_json_dump(as_json['data']).bytesize
57
- end
58
-
59
- class << self
60
- def created_before(dt)
61
- where("created_at < ?", dt)
62
- end
63
-
64
- def completed_and_older_than(dt)
65
- completed.created_before(dt)
66
- end
67
- end
68
- end
69
- end
@@ -1,52 +0,0 @@
1
- require 'socket'
2
-
3
- module Rpush
4
- # This class notifies the sleeping Rpush Daemon that there are new Notifications to send,
5
- # and to interrupt its sleep to send them immediately. The purpose of this is to allow
6
- # much higher sleep times to reduce database polling activity.
7
- class Notifier
8
- def initialize(host, port)
9
- @host, @port = host, port
10
- end
11
-
12
- # notify the daemon that there is a Notification to send.
13
- def notify
14
- socket.write('x')
15
- end
16
-
17
- # @return [UDPSocket]
18
- def socket
19
- if @socket.nil?
20
- @socket = UDPSocket.new
21
- @socket.connect(@host, @port)
22
- end
23
- @socket
24
- end
25
-
26
- # close the udp socket
27
- def close
28
- if @socket
29
- @socket.close
30
- @socket = nil
31
- end
32
- end
33
-
34
- end
35
-
36
- # Call this from a client application after saving a Notification to the database to wakeup the Rpush
37
- # Daemon to deliver the notification immediately.
38
- def self.wakeup
39
- notifier.notify
40
- end
41
-
42
- # Default notifier instance. This uses the :connect, :port values in Rpush.config.wakeup to connect to the
43
- # wakeup socket in the Rpush Daemon. It will fall back to :host, :port if :connect is not specified.
44
- def self.notifier
45
- unless @notifier
46
- if Rpush.config.wakeup
47
- @notifier = Notifier.new(Rpush.config.wakeup[:connect] || Rpush.config.wakeup[:host], Rpush.config.wakeup[:port])
48
- end
49
- end
50
- @notifier
51
- end
52
- end