Class: Telegraph::Message

Inherits:
Object
  • Object
show all
Extended by:
Logging
Includes:
Logging
Defined in:
lib/telegraph/message.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Logging

debug, logger

Constructor Details

#initialize(body, sequence_number, sequence_ack) ⇒ Message

Returns a new instance of Message.



7
8
9
10
11
# File 'lib/telegraph/message.rb', line 7

def initialize(body, sequence_number, sequence_ack)
  @body = body
  @sequence_number = sequence_number
  @sequence_ack = sequence_ack
end

Instance Attribute Details

#bodyObject (readonly)

Returns the value of attribute body.



5
6
7
# File 'lib/telegraph/message.rb', line 5

def body
  @body
end

#sequence_ackObject (readonly)

Returns the value of attribute sequence_ack.



5
6
7
# File 'lib/telegraph/message.rb', line 5

def sequence_ack
  @sequence_ack
end

#sequence_numberObject (readonly)

Returns the value of attribute sequence_number.



5
6
7
# File 'lib/telegraph/message.rb', line 5

def sequence_number
  @sequence_number
end

Class Method Details

.read(stream) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/telegraph/message.rb', line 22

def read(stream)
  header_data = read_data(stream, 12, "header")
  size, sequence_number, sequence_ack = header_data.unpack("NNN")

  message_data = read_data(stream, size, "message")
  debug { "read #{message_data[4..20]}... (#{message_data.length} bytes)" }
  Message.new Marshal.load(message_data), sequence_number, (sequence_ack == 0 ? nil : sequence_ack)
end

.read_data(stream, length, label) ⇒ Object

Raises:

  • (IOError)


31
32
33
34
35
36
# File 'lib/telegraph/message.rb', line 31

def read_data(stream, length, label)
  data = stream.read(length)
  raise IOError, "connection closed" unless data
  raise IOError, "incomplete #{label} data" unless data.length == length
  data
end

Instance Method Details

#write(stream) ⇒ Object



13
14
15
16
17
# File 'lib/telegraph/message.rb', line 13

def write(stream)
  message_data = Marshal.dump(body)
  debug { "send #{message_data[4..20]}... (#{message_data.length} bytes)" }
  stream.write [message_data.size, @sequence_number, @sequence_ack || 0].pack("NNN") + message_data
end