banjo-apn_sender 2.1.5 → 2.2.0
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 +4 -4
- data/apn_sender.gemspec +1 -1
- data/lib/apn/connection.rb +29 -10
- data/lib/apn/notification.rb +24 -4
- metadata +1 -1
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 067eaa2184fdd9171fcbe18c5bde69809e449a2b
         | 
| 4 | 
            +
              data.tar.gz: 99746b0d5bb810c3358737e140d62c40fe2a64c4
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 95bd7c3aed59c3b8fe66a558a053f27b4b46c1f76f1f871d6c66157664d688edd1dba7c222bd6e7003b174e635ba015f09a6815b0cf1ba3f379dd71a7e450e9b
         | 
| 7 | 
            +
              data.tar.gz: 12b2ecaba23309970959fb7d7e376fd4a84fe4fd1042918e261c866db697bc2ce7f36f02c429d3f84ed069d96d177ede50c808d97fb4de62047c9743acfcd3fa
         | 
    
        data/apn_sender.gemspec
    CHANGED
    
    | @@ -5,7 +5,7 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = %q{banjo-apn_sender}
         | 
| 8 | 
            -
              s.version = "2. | 
| 8 | 
            +
              s.version = "2.2.0"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = [%q{Kali Donovan}, %q{KW Justin Leung}]
         | 
    
        data/lib/apn/connection.rb
    CHANGED
    
    | @@ -12,12 +12,24 @@ class APN::Connection | |
| 12 12 | 
             
                @fifos[env].shift if @fifos[env][FIFO_SIZE]
         | 
| 13 13 | 
             
              end
         | 
| 14 14 |  | 
| 15 | 
            -
              def  | 
| 15 | 
            +
              def error_response
         | 
| 16 | 
            +
                if socket.flush && IO.select([socket], nil, nil, 1) && (error = socket.read(6))
         | 
| 17 | 
            +
                  error = error.unpack("ccA*")
         | 
| 18 | 
            +
                  log(:error, "Error response: #{error}")
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                error
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              def send_to_apple(notification, token, env, tag, debug = false)
         | 
| 16 25 | 
             
                retries = 0
         | 
| 17 26 | 
             
                push_fifo(env, token)
         | 
| 18 27 |  | 
| 19 28 | 
             
                begin
         | 
| 20 | 
            -
                   | 
| 29 | 
            +
                  socket.write(notification.to_s)
         | 
| 30 | 
            +
                  return false if debug && error_response
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  true
         | 
| 21 33 | 
             
                rescue => e
         | 
| 22 34 | 
             
                  log(:error, "Try #{retries}: #{e.class} to #{apn_host}: #{e.message}, recent_tokens: #{@fifos[env]}")
         | 
| 23 35 |  | 
| @@ -34,14 +46,11 @@ class APN::Connection | |
| 34 46 | 
             
                end
         | 
| 35 47 | 
             
              end
         | 
| 36 48 |  | 
| 37 | 
            -
              def self. | 
| 38 | 
            -
                msg = APN::Notification.new(token, options)
         | 
| 39 | 
            -
                raise "Invalid notification options (did you provide :alert, :badge, :sound, or :'content-available'?): #{options.inspect}" unless msg.valid?
         | 
| 40 | 
            -
             | 
| 49 | 
            +
              def self.current(sandbox = false, enterprise = false)
         | 
| 41 50 | 
             
                thread_id = Thread.current.object_id
         | 
| 42 51 |  | 
| 43 52 | 
             
                # Use only 1 single thread for internal enterprise cert
         | 
| 44 | 
            -
                 | 
| 53 | 
            +
                if enterprise
         | 
| 45 54 | 
             
                  if sandbox
         | 
| 46 55 | 
             
                    @sandbox_enterprise_sender ||= new(worker_count: 1, sandbox: 1, verbose: 1, enterprise: 1)
         | 
| 47 56 | 
             
                  else
         | 
| @@ -54,18 +63,28 @@ class APN::Connection | |
| 54 63 | 
             
                    @production_senders[thread_id] ||= new(worker_count: 1, verbose: 1)
         | 
| 55 64 | 
             
                  end
         | 
| 56 65 | 
             
                end
         | 
| 57 | 
            -
             | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
              def self.send_apn(token, message, sandbox = false, enterprise = false, style = { format: :frame })
         | 
| 69 | 
            +
                msg = APN::Notification.new(token, message, style.reverse_merge(identifier: token.byteslice(0, 4)))
         | 
| 70 | 
            +
                raise "Invalid notification message (did you provide :alert, :badge, :sound, or :'content-available'?): #{message.inspect}" unless msg.valid?
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                sender = current(sandbox, enterprise)
         | 
| 58 73 | 
             
                env = sandbox ? 'sandbox' : enterprise ? 'enterprise' : 'production'
         | 
| 59 74 | 
             
                tag = "#{sandbox ? 'sandbox' : 'production'}#{enterprise ? ' enterprise' : ''}"
         | 
| 60 | 
            -
                sender.log(:info, "token: #{token} message: #{ | 
| 75 | 
            +
                sender.log(:info, "token: #{token} message: #{message}, style: #{style}")
         | 
| 61 76 |  | 
| 62 77 | 
             
                if enterprise
         | 
| 63 | 
            -
                  @enterprise_semaphore.synchronize { sender.send_to_apple(msg, token, env, tag) }
         | 
| 78 | 
            +
                  @enterprise_semaphore.synchronize { sender.send_to_apple(msg, token, env, tag, !!style[:debug]) }
         | 
| 64 79 | 
             
                else
         | 
| 65 80 | 
             
                  sender.send_to_apple(msg, token, env, tag)
         | 
| 66 81 | 
             
                end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                sender
         | 
| 67 84 | 
             
              end
         | 
| 68 85 |  | 
| 86 | 
            +
              self.singleton_class.send(:alias_method, :send, :send_apn)
         | 
| 87 | 
            +
             | 
| 69 88 | 
             
              protected
         | 
| 70 89 | 
             
              def apn_host
         | 
| 71 90 | 
             
                @apn_host ||= apn_sandbox? ? "gateway.sandbox.push.apple.com" : "gateway.push.apple.com"
         | 
    
        data/lib/apn/notification.rb
    CHANGED
    
    | @@ -23,10 +23,15 @@ module APN | |
| 23 23 | 
             
                # character overhead, so there are 199 characters available for the alert string.
         | 
| 24 24 | 
             
                MAX_ALERT_LENGTH = 199
         | 
| 25 25 |  | 
| 26 | 
            -
                attr_accessor :options, :token
         | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 26 | 
            +
                attr_accessor :options, :token, :format, :identifier, :expiry_epoch, :priority
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                def initialize(token, opts, style = {})
         | 
| 29 29 | 
             
                  @token = token
         | 
| 30 | 
            +
                  @options = hash_as_symbols(opts.is_a?(Hash) ? opts : {:alert => opts})
         | 
| 31 | 
            +
                  @format = style[:format] || :frame
         | 
| 32 | 
            +
                  @identifier = style[:identifier] || OpenSSL::Random.random_bytes(4)
         | 
| 33 | 
            +
                  @expiry_epoch = (style[:expiry_epoch] || Time.now + 1.hour).to_i
         | 
| 34 | 
            +
                  @priority = (style[:priority] || 10).to_i
         | 
| 30 35 | 
             
                  payload_size = packaged_message.bytesize.to_i
         | 
| 31 36 |  | 
| 32 37 | 
             
                  raise "Payload bytesize of #{payload_size} is > the maximum allowed size of 255." if payload_size > 255
         | 
| @@ -71,7 +76,22 @@ module APN | |
| 71 76 | 
             
                def packaged_notification
         | 
| 72 77 | 
             
                  pt = packaged_token
         | 
| 73 78 | 
             
                  pm = packaged_message
         | 
| 74 | 
            -
             | 
| 79 | 
            +
             | 
| 80 | 
            +
                  case format
         | 
| 81 | 
            +
                  when :simple
         | 
| 82 | 
            +
                    [0, 0, pt.bytesize, pt, 0, pm.bytesize, pm].pack("ccca*cca*") 
         | 
| 83 | 
            +
                  when :frame
         | 
| 84 | 
            +
                    data = ''
         | 
| 85 | 
            +
                    data << [1, pt.bytesize, pt].pack("CnA*")
         | 
| 86 | 
            +
                    data << [2, pm.bytesize, pm].pack("CnA*")
         | 
| 87 | 
            +
                    data << [3, identifier.bytesize, identifier].pack("CnA*")
         | 
| 88 | 
            +
                    data << [4, 4, expiry_epoch].pack("CnN")
         | 
| 89 | 
            +
                    data << [5, 1, priority].pack("CnC")
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                    [2, data.bytesize].pack('CN') + data
         | 
| 92 | 
            +
                  else
         | 
| 93 | 
            +
                    raise "Unsupported apn format #{format} with token: #{pt} message: #{options}"
         | 
| 94 | 
            +
                  end
         | 
| 75 95 | 
             
                end
         | 
| 76 96 |  | 
| 77 97 | 
             
                # Device token, compressed and hex-ified
         |