def connect
@state ||= UNCONNECTED
return unless @state == UNCONNECTED
@state = CONNECTING
url = @endpoint.dup
headers = @dispatcher.headers.dup
extensions = @dispatcher.ws_extensions
cookie = get_cookies
url.scheme = PROTOCOLS[url.scheme]
headers['Cookie'] = cookie unless cookie == ''
options = {
:extensions => extensions,
:headers => headers,
:proxy => @proxy,
:tls => @dispatcher.tls
}
socket = Faye::WebSocket::Client.new(url.to_s, [], options)
socket.onopen = lambda do |*args|
store_cookies(socket.headers['Set-Cookie'])
@socket = socket
@state = CONNECTED
@ever_connected = true
set_deferred_status(:succeeded, socket)
end
closed = false
socket.onclose = socket.onerror = lambda do |*args|
next if closed
closed = true
was_connected = (@state == CONNECTED)
socket.onopen = socket.onclose = socket.onerror = socket.onmessage = nil
@socket = nil
@state = UNCONNECTED
pending = @pending ? @pending.to_a : []
@pending = nil
if was_connected or @ever_connected
set_deferred_status(:unknown)
handle_error(pending, was_connected)
else
set_deferred_status(:failed)
end
end
socket.onmessage = lambda do |event|
replies = MultiJson.load(event.data) rescue nil
next if replies.nil?
replies = [replies].flatten
replies.each do |reply|
next unless reply.has_key?('successful')
next unless message = @pending.find { |m| m['id'] == reply['id'] }
@pending.delete(message)
end
receive(replies)
end
end