67 lines
1.6 KiB
Ruby
67 lines
1.6 KiB
Ruby
require 'eventmachine'
|
|
require 'uri'
|
|
require 'websocket'
|
|
|
|
module EventMachine
|
|
class WebSocketClient < Connection
|
|
include Deferrable
|
|
|
|
attr_accessor :url
|
|
attr_accessor :protocol_version
|
|
attr_accessor :origin
|
|
|
|
def self.connect(uri, opts={})
|
|
p_uri = URI.parse(uri)
|
|
conn = EM.connect(p_uri.host, p_uri.port || 80, self) do |c|
|
|
c.url = uri
|
|
c.protocol_version = opts[:version]
|
|
c.origin = opts[:origin]
|
|
end
|
|
end
|
|
|
|
def post_init
|
|
@handshaked = false
|
|
@frame = ::WebSocket::Frame::Incoming::Client.new
|
|
end
|
|
|
|
def connection_completed
|
|
@connect.yield if @connect
|
|
@hs = ::WebSocket::Handshake::Client.new(:url => @url,
|
|
:origin => @origin,
|
|
:version => @protocol_version)
|
|
send_data @hs.to_s
|
|
end
|
|
|
|
def stream &cb; @stream = cb; end
|
|
def connected &cb; @connect = cb; end
|
|
def disconnect &cb; @disconnect = cb; end
|
|
|
|
def receive_data data
|
|
if !@handshaked
|
|
@hs << data
|
|
if @hs.finished?
|
|
@handshaked = true
|
|
succeed
|
|
end
|
|
|
|
receive_data(@hs.leftovers) if @hs.leftovers
|
|
else
|
|
@frame << data
|
|
while msg = @frame.next
|
|
@stream.call(msg) if @stream
|
|
end
|
|
end
|
|
end
|
|
|
|
def send_msg(s, args={})
|
|
type = args[:type] || :text
|
|
frame = ::WebSocket::Frame::Outgoing::Client.new(:data => s, :type => type, :version => @hs.version)
|
|
send_data frame.to_s
|
|
end
|
|
|
|
def unbind
|
|
super
|
|
@disconnect.call if @disconnect
|
|
end
|
|
end
|
|
end
|