class Bitcourier::Protocol::Message::Base

Constants

HEADER_SIZE
MAGIC_BYTES

Public Class Methods

message_size(bytes) click to toggle source
# File lib/bitcourier/protocol/message/base.rb, line 36
def self.message_size bytes
  return 0 if bytes.size < HEADER_SIZE

  _, _, length = unpack_header(bytes)

  return 0 if bytes.size < (length + HEADER_SIZE)

  return length + HEADER_SIZE
end
unpack(bytes) click to toggle source
# File lib/bitcourier/protocol/message/base.rb, line 23
def self.unpack bytes
  magic, id, length = unpack_header(bytes)

  return nil if magic != MAGIC_BYTES # wrong magic
  return nil if length + HEADER_SIZE > bytes.size # partial package
  return nil unless klass = find_message_class(id)

  msg = klass.new
  msg.extract bytes[HEADER_SIZE..-1]

  msg
end

Private Class Methods

find_message_class(id) click to toggle source
# File lib/bitcourier/protocol/message/base.rb, line 52
def self.find_message_class id
  [Hello, GetPeerList, PeerInfo].each do |message_class|
    return message_class if message_class::ID == id
  end

  nil
end
unpack_header(bytes) click to toggle source
# File lib/bitcourier/protocol/message/base.rb, line 48
def self.unpack_header bytes
  bytes[0...HEADER_SIZE].unpack('SSS')
end

Public Instance Methods

extract(bytes) click to toggle source
# File lib/bitcourier/protocol/message/base.rb, line 20
def extract bytes
end
header() click to toggle source
# File lib/bitcourier/protocol/message/base.rb, line 8
def header
  [MAGIC_BYTES, self.class::ID, payload.size].pack('SSS')
end
pack() click to toggle source
# File lib/bitcourier/protocol/message/base.rb, line 16
def pack
  header + payload
end
payload() click to toggle source
# File lib/bitcourier/protocol/message/base.rb, line 12
def payload
  ''
end