Module: Rexpro::Message::Base

Included in:
Error, ScriptRequest, ScriptResponse, SessionRequest, SessionResponse
Defined in:
lib/rexpro/message.rb

Defined Under Namespace

Modules: ClassMethods

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#serializer_typeObject (readonly)

Returns the value of attribute serializer_type.



115
116
117
# File 'lib/rexpro/message.rb', line 115

def serializer_type
  @serializer_type
end

Class Method Details

.included(klass) ⇒ Object



72
73
74
75
76
# File 'lib/rexpro/message.rb', line 72

def self.included(klass)
  klass.extend ClassMethods
  klass.define_fields session_uuid: :to_s, request_uuid: :to_s,
                      meta: :to_hash
end

Instance Method Details

#initialize(attrs = {}) ⇒ Object



117
118
119
120
121
122
123
# File 'lib/rexpro/message.rb', line 117

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

#serialize_body(*args) ⇒ Object



125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/rexpro/message.rb', line 125

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) ⇒ Object



138
139
140
141
142
143
144
# File 'lib/rexpro/message.rb', line 138

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