class PubNub

Attributes

events[RW]

Public Class Methods

new(ringcentral, events, message_callback, status_callback = nil, presence_callback = nil) click to toggle source
# File lib/subscription.rb, line 9
def initialize(ringcentral, events, message_callback, status_callback = nil, presence_callback = nil)
  @rc = ringcentral
  @events = events
  @callback = Pubnub::SubscribeCallback.new(
    message: lambda { |envelope|
      message = envelope.result[:data][:message]
      cipher = OpenSSL::Cipher::AES.new(128, :ECB)
      cipher.decrypt
      cipher.key = Base64.decode64(@subscription['deliveryMode']['encryptionKey'])
      ciphertext = Base64.decode64(message)
      plaintext = cipher.update(ciphertext) + cipher.final
      message_callback.call(JSON.parse(plaintext))
    },
    presence: lambda { |envelope|
      presence_callback != nil && presence_callback.call(envelope)
    },
    status: lambda { |envelope|
      status_callback != nil && status_callback.call(envelope)
    }
  )
  @subscription = nil
  @timer = nil
  @pubnub = nil
end

Public Instance Methods

refresh() click to toggle source
# File lib/subscription.rb, line 56
def refresh
  return if @subscription == nil
  r = @rc.put("/restapi/v1.0/subscription/#{@subscription['id']}", payload: request_body)
  self.subscription = r.body
end
revoke() click to toggle source
# File lib/subscription.rb, line 62
def revoke
  return if @subscription == nil
  @pubnub.unsubscribe(channel: @subscription['deliveryMode']['address'])
  @pubnub.remove_listener(name: 'default')
  @pubnub = nil
  @rc.delete("/restapi/v1.0/subscription/#{@subscription['id']}")
  self.subscription = nil
end
subscribe() click to toggle source
# File lib/subscription.rb, line 48
def subscribe
  r = @rc.post('/restapi/v1.0/subscription', payload: request_body)
  self.subscription = r.body
  @pubnub = Pubnub.new(subscribe_key: @subscription['deliveryMode']['subscriberKey'])
  @pubnub.add_listener(name: 'default', callback: @callback)
  @pubnub.subscribe(channels: @subscription['deliveryMode']['address'])
end
subscription=(value) click to toggle source
# File lib/subscription.rb, line 34
def subscription=(value)
  @subscription = value
  if @timer != nil
    @timer.shutdown
    @timer = nil
  end
  if value != nil
    @timer = Concurrent::TimerTask.new(execution_interval: value['expiresIn'] - 120, timeout_interval: 60) do
      self.refresh
    end
    @timer.execute
  end
end

Private Instance Methods

request_body() click to toggle source
# File lib/subscription.rb, line 73
def request_body
  {
    'deliveryMode': { 'transportType': 'PubNub', 'encryption': true },
    'eventFilters': @events
  }
end