Class: Celluloid::WebSocket

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
IO
Defined in:
lib/celluloid/websocket.rb,
lib/celluloid/websocket/rack.rb,
lib/celluloid/websocket/version.rb

Defined Under Namespace

Classes: DriverEnvironment, MessageStream

Constant Summary collapse

VERSION =
"0.0.9"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#envObject

Returns the value of attribute env.



13
14
15
# File 'lib/celluloid/websocket.rb', line 13

def env
  @env
end

#socketObject

Returns the value of attribute socket.



13
14
15
# File 'lib/celluloid/websocket.rb', line 13

def socket
  @socket
end

Class Method Details

.rack(config = {}) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/celluloid/websocket/rack.rb', line 10

def self.rack(config={})
  if defined?(PhusionPassenger)
    PhusionPassenger.advertised_concurrency_level = 0
  end

  lambda do |env|
    if env['HTTP_UPGRADE'].nil? || env['HTTP_UPGRADE'].downcase != 'websocket'
      return [400, {}, "No Upgrade header or Upgrade not for websocket."]
    end

    env['rack.hijack'].call
    socket = Celluloid::IO::RackSocket.new(env['rack.hijack_io'].to_io)
    
    new(*config[:args]).async.initialize_websocket(env, socket)
    [200,{},""]
  end
end

Instance Method Details

#closeObject



59
60
61
62
# File 'lib/celluloid/websocket.rb', line 59

def close
  @driver.close unless @driver.nil? rescue nil
  @socket.close unless @socket.nil? || @socket.closed?
end

#closed?Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/celluloid/websocket.rb', line 42

def closed?
  @socket.closed?
end

#initialize_websocket(env, socket) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/celluloid/websocket.rb', line 15

def initialize_websocket(env, socket)
  @env = env
  @socket = socket

  driver_env = DriverEnvironment.new(env, socket) 

  @driver = ::WebSocket::Driver.rack(driver_env)

  @driver.on(:close) do
    @socket.close
  end

  @message_stream = MessageStream.new(socket, @driver)

  @driver.start

  on_open if respond_to? :on_open
rescue EOFError
  close
rescue => e
  on_error(e) if respond_to? :on_error
end

#readObject



38
39
40
# File 'lib/celluloid/websocket.rb', line 38

def read
  @message_stream.read
end

#shutdownObject



64
65
66
# File 'lib/celluloid/websocket.rb', line 64

def shutdown
  close
end

#write(msg) ⇒ Object Also known as: <<



46
47
48
49
50
51
52
53
54
55
56
# File 'lib/celluloid/websocket.rb', line 46

def write(msg)
  if msg.is_a? String
    @driver.text(msg)
  elsif msg.is_a? Array
    @driver.binary(msg)
  else
    raise "Can only send byte array or string over driver."
  end
rescue IOError, Errno::ECONNRESET, Errno::EPIPE
  raise SocketError, "error writing to socket"
end