class Faye::Transport

Public Class Methods

new(dispatcher, endpoint) click to toggle source
Calls superclass method
# File lib/faye/transport/transport.rb, line 13
def initialize(dispatcher, endpoint)
  super()
  @dispatcher = dispatcher
  @endpoint   = endpoint
  @outbox     = []
  @proxy      = @dispatcher.proxy.dup

  scheme = @endpoint.respond_to?(:scheme) ? @endpoint.scheme : nil

  @proxy[:origin] ||= SECURE_PROTOCOLS.include?(scheme) ?
                      (ENV['HTTPS_PROXY'] || ENV['https_proxy']) :
                      (ENV['HTTP_PROXY']  || ENV['http_proxy'])
end

Private Class Methods

connection_types() click to toggle source
# File lib/faye/transport/transport.rb, line 160
def connection_types
  @transports.map { |t| t[0] }
end
get(dispatcher, allowed, disabled, &callback) click to toggle source
# File lib/faye/transport/transport.rb, line 126
def get(dispatcher, allowed, disabled, &callback)
  endpoint = dispatcher.endpoint

  select = lambda do |(conn_type, klass), resume|
    conn_endpoint = dispatcher.endpoint_for(conn_type)

    if disabled.include?(conn_type)
      next resume.call
    end

    unless allowed.include?(conn_type)
      klass.usable?(dispatcher, conn_endpoint) { |u| }
      next resume.call
    end

    klass.usable?(dispatcher, conn_endpoint) do |is_usable|
      next resume.call unless is_usable
      transport = klass.respond_to?(:create) ? klass.create(dispatcher, conn_endpoint) : klass.new(dispatcher, conn_endpoint)
      callback.call(transport)
    end
  end

  error = lambda do
    raise "Could not find a usable connection type for #{ endpoint }"
  end

  Faye.async_each(@transports, select, error)
end
register(type, klass) click to toggle source
# File lib/faye/transport/transport.rb, line 155
def register(type, klass)
  @transports << [type, klass]
  klass.connection_type = type
end

Public Instance Methods

batching?() click to toggle source
# File lib/faye/transport/transport.rb, line 27
def batching?
  true
end
close() click to toggle source
# File lib/faye/transport/transport.rb, line 31
def close
end
connection_type() click to toggle source
# File lib/faye/transport/transport.rb, line 38
def connection_type
  self.class.connection_type
end
encode(messages) click to toggle source
# File lib/faye/transport/transport.rb, line 34
def encode(messages)
  ''
end
send_message(message) click to toggle source
# File lib/faye/transport/transport.rb, line 42
def send_message(message)
  debug('Client ? sending message to ? via ?: ?', @dispatcher.client_id, @endpoint, connection_type, message)

  unless batching?
    promise = EventMachine::DefaultDeferrable.new
    promise.succeed(request([message]))
    return promise
  end

  @outbox << message
  @promise ||= EventMachine::DefaultDeferrable.new
  flush_large_batch

  if message['channel'] == Channel::HANDSHAKE
    add_timeout(:publish, 0.01) { flush }
    return @promise
  end

  if message['channel'] == Channel::CONNECT
    @connection_message = message
  end

  add_timeout(:publish, Engine::MAX_DELAY) { flush }
  @promise
end

Private Instance Methods

flush() click to toggle source
# File lib/faye/transport/transport.rb, line 70
def flush
  remove_timeout(:publish)

  if @outbox.size > 1 and @connection_message
    @connection_message['advice'] = {'timeout' => 0}
  end

  @promise.succeed(request(@outbox))
  @promise = nil

  @connection_message = nil
  @outbox = []
end
flush_large_batch() click to toggle source
# File lib/faye/transport/transport.rb, line 84
def flush_large_batch
  string = encode(@outbox)
  return if string.size < @dispatcher.max_request_size
  last = @outbox.pop
  flush
  @outbox.push(last) if last
end
get_cookies() click to toggle source
# File lib/faye/transport/transport.rb, line 111
def get_cookies
  @dispatcher.cookies.get_cookies(@endpoint.to_s) * ';'
end
handle_error(messages, immediate = false) click to toggle source
# File lib/faye/transport/transport.rb, line 103
def handle_error(messages, immediate = false)
  debug('Client ? failed to send to ? via ?: ?', @dispatcher.client_id, @endpoint, connection_type, messages)

  messages.each do |message|
    @dispatcher.handle_error(message, immediate)
  end
end
receive(replies) click to toggle source
# File lib/faye/transport/transport.rb, line 92
def receive(replies)
  return unless replies
  replies = [replies].flatten

  debug('Client ? received from ? via ?: ?', @dispatcher.client_id, @endpoint, connection_type, replies)

  replies.each do |reply|
    @dispatcher.handle_response(reply)
  end
end
store_cookies(set_cookie) click to toggle source
# File lib/faye/transport/transport.rb, line 115
def store_cookies(set_cookie)
  [*set_cookie].compact.each do |cookie|
    @dispatcher.cookies.set_cookie(@endpoint.to_s, cookie)
  end
end