Class: Reel::WebSocket

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

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, socket) ⇒ WebSocket

Returns a new instance of WebSocket.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/reel/websocket.rb', line 13

def initialize(info, socket)
  @request_info = info
  @socket = socket

  handshake = ::WebSocket::ClientHandshake.new(:get, url, headers)

  if handshake.valid?
    response = handshake.accept_response
    response.render(socket)
  else
    error = handshake.errors.first

    response = Response.new(400)
    response.reason = handshake.errors.first
    response.render(@socket)

    raise HandshakeError, "error during handshake: #{error}"
  end

  @parser = ::WebSocket::Parser.new

  @parser.on_close do |status, reason|
    # According to the spec the server must respond with another
    # close message before closing the connection
    @socket << ::WebSocket::Message.close.to_data
    close
  end

  @parser.on_ping do |payload|
    @socket << ::WebSocket::Message.pong(payload).to_data
  end
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

#bodyObject



75
76
77
# File 'lib/reel/websocket.rb', line 75

def body
  nil
end

#cancel_timer!Object



100
101
102
# File 'lib/reel/websocket.rb', line 100

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

#closeObject



95
96
97
98
# File 'lib/reel/websocket.rb', line 95

def close
  cancel_timer!
  @socket.close unless closed?
end

#closed?Boolean

Returns:

  • (Boolean)


91
92
93
# File 'lib/reel/websocket.rb', line 91

def closed?
  @socket.closed?
end

#readObject



67
68
69
70
71
72
73
# File 'lib/reel/websocket.rb', line 67

def read
  @parser.append @socket.readpartial(Connection::BUFFER_SIZE) until msg = @parser.next_message
  msg
rescue
  cancel_timer!
  raise
end

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



52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/reel/websocket.rb', line 52

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: <<



79
80
81
82
83
84
85
86
87
88
# File 'lib/reel/websocket.rb', line 79

def write(msg)
  @socket << ::WebSocket::Message.new(msg).to_data
  msg
rescue IOError, Errno::ECONNRESET, Errno::EPIPE
  cancel_timer!
  raise SocketError, "error writing to socket"
rescue
  cancel_timer!
  raise
end