class Pushr::Daemon::ApnsSupport::FeedbackReceiver

Constants

FEEDBACK_TUPLE_BYTES

Public Class Methods

new(configuration, _) click to toggle source
# File lib/pushr/daemon/apns_support/feedback_receiver.rb, line 7
def initialize(configuration, _)
  @configuration = configuration
  @interruptible_sleep = InterruptibleSleep.new
end

Public Instance Methods

check_every_configuration() click to toggle source
# File lib/pushr/daemon/apns_support/feedback_receiver.rb, line 28
def check_every_configuration
  Pushr::Configuration.all.each do |config|
    if config.enabled == true && config.class == Pushr::ConfigurationApns
      Pushr::Daemon.logger.info("[#{config.app}: Checking for feedback")
      check_for_feedback(config)
    end
  end
end
check_for_feedback(config) click to toggle source
# File lib/pushr/daemon/apns_support/feedback_receiver.rb, line 37
def check_for_feedback(config)
  connection = nil
  begin
    connection = ConnectionApns.new(config)
    connection.connect

    while tuple = connection.read(FEEDBACK_TUPLE_BYTES)
      timestamp, device = parse_tuple(tuple)
      create_feedback(config, connection, timestamp, device)
    end
  rescue StandardError => e
    Pushr::Daemon.logger.error(e)
  ensure
    connection.close if connection
  end
end
start() click to toggle source
# File lib/pushr/daemon/apns_support/feedback_receiver.rb, line 12
def start
  @thread = Thread.new do
    loop do
      break if @stop
      check_every_configuration
      @interruptible_sleep.sleep @configuration.feedback_poll
    end
  end
end
stop() click to toggle source
# File lib/pushr/daemon/apns_support/feedback_receiver.rb, line 22
def stop
  @stop = true
  @interruptible_sleep.interrupt
  @thread.join if @thread
end

Protected Instance Methods

create_feedback(config, connection, failed_at, device) click to toggle source
# File lib/pushr/daemon/apns_support/feedback_receiver.rb, line 61
def create_feedback(config, connection, failed_at, device)
  formatted_failed_at = failed_at.strftime('%Y-%m-%d %H:%M:%S UTC')
  Pushr::Daemon.logger.info("[#{connection.name}: Delivery failed at #{formatted_failed_at} for #{device}")
  Pushr::FeedbackApns.create(app: config.app, failed_at: failed_at, device: device, follow_up: 'delete')
end
parse_tuple(tuple) click to toggle source
# File lib/pushr/daemon/apns_support/feedback_receiver.rb, line 56
def parse_tuple(tuple)
  failed_at, _, device = tuple.unpack('N1n1H*')
  [Time.at(failed_at).utc, device]
end