module Rexpro::Message::Base

Attributes

serializer_type[R]

Public Class Methods

included(klass) click to toggle source
# File lib/rexpro/message.rb, line 70
def self.included(klass)
  klass.extend ClassMethods
  klass.define_fields session_uuid: :to_s, request_uuid: :to_s,
                      meta: :to_hash
end
new(attrs = {}) click to toggle source
# File lib/rexpro/message.rb, line 115
def initialize(attrs = {})
  @serializer_type = attrs.delete(:serializer_type) || SERIALIZER_MSGPACK
  self.meta ||= {}
  attrs.each { |k, v| send("#{k}=", v) }
  self.session_uuid ||= ZERO_UUID
  self.request_uuid ||= Message.generate_uuid
end

Public Instance Methods

serialize_body(*args) click to toggle source
# File lib/rexpro/message.rb, line 123
def serialize_body(*args)
  if serializer_type != SERIALIZER_MSGPACK
    raise NotImplementedError, 'only MsgPack serialization is supported'
  end

  self.class.fields.map do |field|
    value = send(field)
    field_method = self.class.field_methods[field]
    value = value.send(field_method) if field_method
    value
  end.to_msgpack(*args)
end
write_to(io) click to toggle source
# File lib/rexpro/message.rb, line 136
def write_to(io)
  body = serialize_body
  header = [
    PROTOCOL_VERSION, serializer_type, 0, self.class.type, body.size
    ].pack('CCNCN')
  io.write(header + body)
end