WebSocket Server for Ruby

WebSocket-EventMachine-Server is Ruby WebSocket server based on EventMachine.

Why another WebSocket server?

There are multiple Ruby WebSocket servers, each with different quirks and errors. Most commonly used em-websocket is unfortunately slow and have multiple bugs(see Autobahn tests above). This library was created to fix most of them.

Installation

gem install websocket-eventmachine-server

or in Gemfile

gem 'websocket-eventmachine-server'

Simple server example

EM.run do

  WebSocket::EventMachine::Server.start(:host => "0.0.0.0", :port => 8080) do |ws|
    ws.onopen do
      puts "Client connected"
    end

    ws.onmessage do |msg, type|
      puts "Received message: #{msg}"
      ws.send msg, :type => type
    end

    ws.onclose do
      puts "Client disconnected"
    end
  end

end

Options

Following options can be passed to WebSocket::EventMachine::Server initializer:

  • [String] :host - IP on which server should accept connections. '0.0.0.0' means all.
  • [Integer] :port - Port on which server should accept connections.
  • [Boolean] :secure - Enable secure WSS protocol. This will enable both SSL encryption and using WSS url and require tls_options key.
  • [Boolean] :secure_proxy - Enable secure WSS protocol over proxy. This will enable only using WSS url and assume that SSL encryption is handled by some kind proxy(like Stunnel)
  • [Hash] :tls_options - Options for SSL(according to EventMachine start_tls method)
    • [String] :private_key_file - URL to private key file
    • [String] :cert_chain_file - URL to cert chain file

Methods

Following methods are available for WebSocket::EventMachine::Server object:

onopen

Called after client is connected.

Example:

ws.onopen do
  puts "Client connected"
end

onclose

Called after client closed connection.

Example:

ws.onclose do
  puts "Client disconnected"
end

onmessage

Called when server receive message.

Parameters:

  • [String] message - content of message
  • [Symbol] type - type is type of message(:text or :binary)

Example:

ws.onmessage do |msg, type|
  puts "Received message: #{msg} or type: #{type}"
end

onerror

Called when server discovers error.

Parameters:

  • [String] error - error reason.

Example:

ws.onerror do |error|
  puts "Error occured: #{error}"
end

onping

Called when server receive ping request. Pong request is sent automatically.

Parameters:

  • [String] message - message for ping request.

Example:

ws.onping do |message|
  puts "Ping received: #{message}"
end

onpong

Called when server receive pong response.

Parameters:

  • [String] message - message for pong response.

Example:

ws.onpong do |message|
  puts "Pong received: #{message}"
end

send

Sends message to client.

Parameters:

  • [String] message - message that should be sent to client
  • [Hash] params - params for message(optional)
    • [Symbol] :type - type of message. Valid values are :text, :binary(default is :text)

Example:

ws.send "Hello Client!"
ws.send "binary data", :type => :binary

close

Closes connection and optionally send close frame to client.

Parameters:

  • [Integer] code - code of closing, according to WebSocket specification(optional)
  • [String] data - data to send in closing frame(optional)

Example:

ws.close

ping

Sends ping request.

Parameters:

  • [String] data - data to send in ping request(optional)

Example:

ws.ping 'Hi'

pong

Sends pong request. Usually there should be no need to send this request, as pong responses are sent automatically by server.

Parameters:

  • [String] data - data to send in pong request(optional)

Example:

ws.pong 'Hello'

Migrating from EM-WebSocket

This library is compatible with EM-WebSocket, so only thing you need to change is running server - you need to change from EM-WebSocket to WebSocket::EventMachine::Server in your application and everything will be working.

License

The MIT License - Copyright (c) 2012 Bernard Potocki