Class: Reel::WebSocket

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
ConnectionMixin, RequestMixin
Defined in:
lib/reel/websocket.rb

Defined Under Namespace

Classes: DriverEnvironment, MessageStream

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from RequestMixin

#[], #fragment, #headers, #method, #path, #query_string, #uri, #url, #version

Methods included from ConnectionMixin

#remote_host, #remote_ip

Constructor Details

#initialize(info, connection) ⇒ WebSocket

Returns a new instance of WebSocket.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/reel/websocket.rb', line 14

def initialize(info, connection)
  driver_env = DriverEnvironment.new(info, connection.socket)

  @socket = connection.hijack_socket
  @request_info = info

  @driver = ::WebSocket::Driver.rack(driver_env)
  @driver.on(:close) do
    @socket.close
  end

  @message_stream = MessageStream.new(@socket, @driver)
  @driver.start
rescue EOFError
  close
end

Instance Attribute Details

#socketObject (readonly)

Returns the value of attribute socket.



10
11
12
# File 'lib/reel/websocket.rb', line 10

def socket
  @socket
end

Instance Method Details

#cancel_timer!Object



88
89
90
# File 'lib/reel/websocket.rb', line 88

def cancel_timer!
  @timer && @timer.cancel
end

#closeObject



83
84
85
86
# File 'lib/reel/websocket.rb', line 83

def close
  @driver.close
  @socket.close
end

#closed?Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/reel/websocket.rb', line 62

def closed?
  @socket.closed?
end

#on_message(&block) ⇒ Object



31
32
33
34
35
# File 'lib/reel/websocket.rb', line 31

def on_message(&block)
  @driver.on :message do |message|
    block.(message.data)
  end
end

#readObject



58
59
60
# File 'lib/reel/websocket.rb', line 58

def read
  @message_stream.read
end

#read_every(n, unit = :s) ⇒ Object Also known as: read_interval, read_frequency



43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/reel/websocket.rb', line 43

def read_every(n, unit = :s)
  cancel_timer! # only one timer allowed per stream
  seconds = case unit.to_s
  when /\Am/
    n * 60
  when /\Ah/
    n * 3600
  else
    n
  end
  @timer = Celluloid.every(seconds) { read }
end

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



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/reel/websocket.rb', line 66

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
  cancel_timer!
  raise SocketError, "error writing to socket"
rescue
  cancel_timer!
  raise
end