Skip to content

Instantly share code, notes, and snippets.

@kenichi
Last active August 29, 2015 14:13
Show Gist options
  • Save kenichi/c582e4c085b0f2655d10 to your computer and use it in GitHub Desktop.
Save kenichi/c582e4c085b0f2655d10 to your computer and use it in GitHub Desktop.
reel websocket with websocket-driver test
source 'https://rubygems.org'
gem 'pry'
gem 'pry-nav'
gem 'reel', github: 'mwean/reel', branch: 'master'
gem 'websocket-driver'
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