Class: Houston::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/houston/client.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeClient

Returns a new instance of Client.



27
28
29
30
31
32
33
# File 'lib/houston/client.rb', line 27

def initialize
  @gateway_uri = ENV['APN_GATEWAY_URI']
  @feedback_uri = ENV['APN_FEEDBACK_URI']
  @certificate = certificate_data
  @passphrase = ENV['APN_CERTIFICATE_PASSPHRASE']
  @timeout = Float(ENV['APN_TIMEOUT'] || 0.5)
end

Instance Attribute Details

#certificateObject

Returns the value of attribute certificate.



9
10
11
# File 'lib/houston/client.rb', line 9

def certificate
  @certificate
end

#feedback_uriObject

Returns the value of attribute feedback_uri.



9
10
11
# File 'lib/houston/client.rb', line 9

def feedback_uri
  @feedback_uri
end

#gateway_uriObject

Returns the value of attribute gateway_uri.



9
10
11
# File 'lib/houston/client.rb', line 9

def gateway_uri
  @gateway_uri
end

#passphraseObject

Returns the value of attribute passphrase.



9
10
11
# File 'lib/houston/client.rb', line 9

def passphrase
  @passphrase
end

#timeoutObject

Returns the value of attribute timeout.



9
10
11
# File 'lib/houston/client.rb', line 9

def timeout
  @timeout
end

Class Method Details

.developmentObject



12
13
14
15
16
17
# File 'lib/houston/client.rb', line 12

def development
  client = self.new
  client.gateway_uri = APPLE_DEVELOPMENT_GATEWAY_URI
  client.feedback_uri = APPLE_DEVELOPMENT_FEEDBACK_URI
  client
end

.productionObject



19
20
21
22
23
24
# File 'lib/houston/client.rb', line 19

def production
  client = self.new
  client.gateway_uri = APPLE_PRODUCTION_GATEWAY_URI
  client.feedback_uri = APPLE_PRODUCTION_FEEDBACK_URI
  client
end

Instance Method Details

#certificate_dataObject



84
85
86
87
88
89
90
# File 'lib/houston/client.rb', line 84

def certificate_data
  if ENV['APN_CERTIFICATE']
    File.read(ENV['APN_CERTIFICATE'])
  elsif ENV['APN_CERTIFICATE_DATA']
    ENV['APN_CERTIFICATE_DATA']
  end
end

#devicesObject



80
81
82
# File 'lib/houston/client.rb', line 80

def devices
  unregistered_devices.collect { |device| device[:token] }
end

#push(*notifications) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/houston/client.rb', line 35

def push(*notifications)
  return if notifications.empty?

  notifications.flatten!

  Connection.open(@gateway_uri, @certificate, @passphrase) do |connection|
    ssl = connection.ssl

    notifications.each_with_index do |notification, index|
      next unless notification.kind_of?(Notification)
      next if notification.sent?
      next unless notification.valid?

      notification.id = index

      connection.write(notification.message)
      notification.mark_as_sent!

      read_socket, _write_socket = IO.select([ssl], [ssl], [ssl], nil)
      if (read_socket && read_socket[0])
        if error = connection.read(6)
          _command, status, index = error.unpack('ccN')
          notification.apns_error_code = status
          notification.mark_as_unsent!
        end
      end
    end
  end
end

#unregistered_devicesObject



65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/houston/client.rb', line 65

def unregistered_devices
  devices = []

  Connection.open(@feedback_uri, @certificate, @passphrase) do |connection|
    while line = connection.read(38)
      feedback = line.unpack('N1n1H140')
      timestamp = feedback[0]
      token = feedback[2].scan(/.{0,8}/).join(' ').strip
      devices << { token: token, timestamp: timestamp } if token && timestamp
    end
  end

  devices
end