Sha256: 8f7c6c4961f86e6b123b3773be258befc3c819e067f6514059ebbf508fb8b256

Contents?: true

Size: 1.47 KB

Versions: 3

Compression:

Stored size: 1.47 KB

Contents

module NetworkExecutive
  class Viewer

    attr_accessor :id, :heartbeat

    def initialize( env )
      @env = env
    end

    def ip
      @ip ||= begin
        if addr = @env['HTTP_X_FORWARDED_FOR']
          (addr.split(',').grep(/\d\./).first || @env['REMOTE_ADDR']).to_s.strip
        else
          @env['REMOTE_ADDR']
        end
      end
    end

    def channel
      Channel.find_by_name( channel_name ).tap do |ch|
        raise ChannelNotFoundError unless ch
      end
    end

    def stream
      @stream ||= Faye::EventSource.new @env
    end

    def tune_in
      Rails.logger.debug "Tuning in to the #{channel} channel for #{ip} at #{Time.now}"

      self.id = channel.subscribe { |msg| stream.send msg }

      stream.onclose = method(:tune_out).to_proc
    end

    def tune_out( event )
      Rails.logger.debug "Tuning out of the #{channel} channel for #{ip} at #{Time.now}"

      channel.unsubscribe id

      heartbeat.cancel

      @stream = nil
    end

    def response
      stream.rack_response
    end

    def channel_name
      @env['PATH_INFO'].split('/').last
    end

    def keep_alive!
      self.heartbeat = EM.add_periodic_timer( 30 ) do
        stream.ping

        Rails.logger.debug "Completed PING for #{ip} on the #{channel} channel at #{Time.now}"
      end
    end

    class << self
      def change_channel( env )
        viewer = Viewer.new( env )

        viewer.tune_in
        viewer.keep_alive!

        viewer.response
      end
    end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
network_executive-0.0.4 app/models/network_executive/viewer.rb
network_executive-0.0.3 app/models/network_executive/viewer.rb
network_executive-0.0.2 app/models/network_executive/viewer.rb