Last active
August 29, 2015 14:13
-
-
Save kenichi/c582e4c085b0f2655d10 to your computer and use it in GitHub Desktop.
reel websocket with websocket-driver test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
source 'https://rubygems.org' | |
gem 'pry' | |
gem 'pry-nav' | |
gem 'reel', github: 'mwean/reel', branch: 'master' | |
gem 'websocket-driver' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'pry' | |
require 'reel' | |
require 'websocket/driver' | |
Celluloid.logger.level = ::Logger::INFO | |
class Real < Reel::Server::HTTP | |
include Celluloid::Logger | |
def initialize options = {} | |
super '0.0.0.0', 9292, options, &method(:on_connection) | |
end | |
def on_connection connection | |
connection.each_request do |request| | |
if request.websocket? | |
async.handle_websocket request.websocket | |
else | |
request.respond :ok, 'hi' | |
end | |
end | |
end | |
def handle_websocket ws | |
5.times do |n| | |
ws.write n.to_s | |
sleep 0.25 | |
end | |
end | |
end | |
class WebsocketHelper | |
include Celluloid::Logger | |
extend Forwardable | |
def_delegator :@socket, :write | |
def_delegators :@driver, :binary, :close, :text | |
WS_URL = 'ws://%s:%d' | |
attr_reader :driver, :socket | |
attr_writer :addr, :port, :path, :on_close, :on_message, :on_open | |
def initialize addr, port, path | |
@addr, @port, @path = addr, port, path | |
end | |
def init | |
init_socket | |
init_driver | |
end | |
def init_socket | |
ip = @addr | |
ip = Socket.getaddrinfo(@addr, 'http')[0][3] unless @addr =~ /\d+\.\d+\.\d+\.\d+/ | |
@socket = Celluloid::IO::TCPSocket.new ip, @port | |
end | |
def init_driver | |
@driver = WebSocket::Driver.client self | |
@driver.on :open do |e| | |
@on_open.call(e) if Proc === @on_open | |
end | |
@driver.on :message do |e| | |
@on_message.call(e) if Proc === @on_message | |
end | |
@driver.on :close do |e| | |
@on_close.call(e) if Proc === @on_close | |
end | |
end | |
def url | |
WS_URL % [@addr, @port] + @path | |
end | |
def go | |
@driver.start | |
while msg = @socket.readpartial(4096) | |
@driver.parse msg | |
end | |
end | |
end | |
class Client | |
include Celluloid::IO | |
include Celluloid::Logger | |
def test_ws | |
wsh = WebsocketHelper.new '127.0.0.1', 9292, '/' | |
wsh.on_message = ->(e) { | |
info "on_message: '#{e.data}'" | |
wsh.close if e.data == '4' | |
} | |
wsh.init | |
wsh.go | |
end | |
end | |
print "starting Real..." | |
r = Real.new spy: ARGV[0] == '--spy' | |
puts "started" | |
# c = Client.new | |
# c.async.test_ws | |
c = Client.pool | |
c.size.times { c.async.test_ws } | |
trap "INT" do | |
r.terminate | |
c.terminate | |
end | |
sleep |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment