Class: WebSocket::Message

Inherits:
Object
  • Object
show all
Defined in:
lib/websocket/message.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(message = '', type = :text, status_code = nil) ⇒ Message

Returns a new instance of Message.



29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/websocket/message.rb', line 29

def initialize(message = '', type = :text, status_code = nil)
  @type = type

  @payload = if status_code
    @status_code    = status_code
    @status_message = message

    [status_code, message].pack('S<a*')
  else
    message.force_encoding("ASCII-8BIT") if message
  end
end

Instance Attribute Details

#mask_keyObject (readonly)

Returns the value of attribute mask_key.



3
4
5
# File 'lib/websocket/message.rb', line 3

def mask_key
  @mask_key
end

#payloadObject (readonly)

Returns the value of attribute payload.



3
4
5
# File 'lib/websocket/message.rb', line 3

def payload
  @payload
end

#status_codeObject (readonly)

Returns the value of attribute status_code.



3
4
5
# File 'lib/websocket/message.rb', line 3

def status_code
  @status_code
end

#status_messageObject (readonly)

Returns the value of attribute status_message.



3
4
5
# File 'lib/websocket/message.rb', line 3

def status_message
  @status_message
end

#typeObject (readonly)

Returns the value of attribute type.



3
4
5
# File 'lib/websocket/message.rb', line 3

def type
  @type
end

Class Method Details

.close(status_code = nil, reason = nil) ⇒ Object

Return a new close message



17
18
19
20
21
22
23
24
25
26
27
# File 'lib/websocket/message.rb', line 17

def self.close(status_code = nil, reason = nil)
  if status_code && STATUS_CODES[status_code] == nil
    raise ArgumentError.new('Invalid status')
  end

  if reason && status_code == nil
    raise ArgumentError.new("Can't set a status message without status code")
  end

  new(reason, :close, status_code)
end

.ping(payload = '') ⇒ Object

Return a new ping message



6
7
8
# File 'lib/websocket/message.rb', line 6

def self.ping(payload = '')
  new(payload, :ping)
end

.pong(ping = nil) ⇒ Object

Return a new pong message



11
12
13
14
# File 'lib/websocket/message.rb', line 11

def self.pong(ping = nil)
  payload = ping ? ping.payload : ''
  new(payload, :pong)
end

Instance Method Details

#control_frame?Boolean

Returns:

  • (Boolean)


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

def control_frame?
  [:close, :ping, :pong].include?(type)
end

#mask!Object



42
43
44
45
46
# File 'lib/websocket/message.rb', line 42

def mask!
  @second_byte = second_byte | 0b10000000 # Set masked bit
  @mask_key = Random.new.bytes(4)
  @payload = WebSocket.mask(@payload, @mask_key)
end

#masked?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/websocket/message.rb', line 52

def masked?
  second_byte & 0b10000000 != 0
end

#payload_lengthObject



48
49
50
# File 'lib/websocket/message.rb', line 48

def payload_length
  @payload ? @payload.length : 0
end

#statusObject



68
69
70
# File 'lib/websocket/message.rb', line 68

def status
  STATUS_CODES[status_code]
end

#to_dataObject



56
57
58
# File 'lib/websocket/message.rb', line 56

def to_data
  to_a.pack(pack_format)
end

#write(io) ⇒ Object



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

def write(io)
  io << to_data
end