class Faye::Transport

Constants

DEFAULT_PORTS

Attributes

connection_type[RW]
endpoint[R]

Public Class Methods

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

  @proxy[:origin] ||= @endpoint.respond_to?(:find_proxy) ?
                      @endpoint.find_proxy :
                      nil
end

Private Class Methods

connection_types() click to toggle source
# File lib/faye/transport/transport.rb, line 167
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 133
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 162
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 24
def batching?
  true
end
close() click to toggle source
# File lib/faye/transport/transport.rb, line 28
def close
end
connection_type() click to toggle source
# File lib/faye/transport/transport.rb, line 35
def connection_type
  self.class.connection_type
end
encode(messages) click to toggle source
# File lib/faye/transport/transport.rb, line 31
def encode(messages)
  ''
end
send_message(message) click to toggle source
# File lib/faye/transport/transport.rb, line 39
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
  flush_large_batch

  if message['channel'] == Channel::HANDSHAKE
    return publish(0.01)
  end

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

  publish(Engine::MAX_DELAY)
end

Private Instance Methods

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

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

  @promise.succeed(request(@outbox))

  @connection_message = nil
  @outbox = []
end
flush_large_batch() click to toggle source
# File lib/faye/transport/transport.rb, line 88
def flush_large_batch
  string = encode(@outbox)
  return if string.size < @dispatcher.max_request_size
  last = @outbox.pop

  @promise ||= EventMachine::DefaultDeferrable.new
  flush

  @outbox.push(last) if last
end
get_cookies() click to toggle source
# File lib/faye/transport/transport.rb, line 118
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 110
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
publish(delay) click to toggle source
# File lib/faye/transport/transport.rb, line 64
def publish(delay)
  @promise ||= EventMachine::DefaultDeferrable.new

  add_timeout(:publish, delay) do
    flush
    @promise = nil
  end

  @promise
end
receive(replies) click to toggle source
# File lib/faye/transport/transport.rb, line 99
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 122
def store_cookies(set_cookie)
  [*set_cookie].compact.each do |cookie|
    @dispatcher.cookies.set_cookie(@endpoint.to_s, cookie)
  end
end