Class: AMQ::Protocol::Frame
- Inherits:
-
Object
- Object
- AMQ::Protocol::Frame
- Defined in:
- lib/amq/protocol/frame.rb
Direct Known Subclasses
Constant Summary collapse
- TYPES =
{:method => 1, :headers => 2, :body => 3, :heartbeat => 8}.freeze
- TYPES_REVERSE =
TYPES.invert.freeze
- TYPES_OPTIONS =
TYPES.keys.freeze
- CHANNEL_RANGE =
(0..65535).freeze
- FINAL_OCTET =
206
"\xCE".freeze
- PACK_UINT64_BE =
Pack format for 64-bit unsigned big-endian
'Q>'.freeze
- CLASSES =
{ Frame::TYPES[:method] => MethodFrame, Frame::TYPES[:headers] => HeaderFrame, Frame::TYPES[:body] => BodyFrame, Frame::TYPES[:heartbeat] => HeartbeatFrame }
Class Method Summary collapse
- .decode ⇒ Object
-
.decode_header(header) ⇒ Object
Optimized header decode using unpack1 for single values where appropriate.
- .encode(type, payload, channel) ⇒ Object
-
.encode_to_array(type, payload, channel) ⇒ Object
The channel number is 0 for all frames which are global to the connection and 1-65535 for frames that refer to specific channels.
- .encoded_payload(payload) ⇒ Object
- .find_type(type) ⇒ Object
- .new(original_type, *args) ⇒ Object
Instance Method Summary collapse
-
#__new__ ⇒ Object
because of reloading.
- #final? ⇒ Boolean
Class Method Details
.decode ⇒ Object
55 56 57 58 59 60 61 |
# File 'lib/amq/protocol/frame.rb', line 55 def self.decode(*) raise NotImplementedError.new "You are supposed to redefine this method, because it's dependent on used IO adapter.\n\nThis functionality is part of the https://github.com/ruby-amqp/amq-client library.\n EOF\nend\n" |
.decode_header(header) ⇒ Object
Optimized header decode using unpack1 for single values where appropriate
64 65 66 67 68 69 70 71 72 |
# File 'lib/amq/protocol/frame.rb', line 64 def self.decode_header(header) raise EmptyResponseError if header == nil || header.empty? # Use unpack for multiple values - this is the optimal approach type_id, channel, size = header.unpack(PACK_CHAR_UINT16_UINT32) type = TYPES_REVERSE[type_id] raise FrameTypeError.new(TYPES_OPTIONS) unless type [type, channel, size] end |
.encode(type, payload, channel) ⇒ Object
35 36 37 |
# File 'lib/amq/protocol/frame.rb', line 35 def self.encode(type, payload, channel) encode_to_array(type, payload, channel).join end |
.encode_to_array(type, payload, channel) ⇒ Object
The channel number is 0 for all frames which are global to the connection and 1-65535 for frames that refer to specific channels.
25 26 27 28 29 30 31 32 33 |
# File 'lib/amq/protocol/frame.rb', line 25 def self.encode_to_array(type, payload, channel) raise RuntimeError.new("Channel has to be 0 or an integer in range 1..65535 but was #{channel.inspect}") unless CHANNEL_RANGE.include?(channel) raise RuntimeError.new("Payload can't be nil") if payload.nil? components = [] components << [find_type(type), channel, payload.bytesize].pack(PACK_CHAR_UINT16_UINT32) components << encoded_payload(payload) components << FINAL_OCTET components end |
.encoded_payload(payload) ⇒ Object
16 17 18 19 20 21 22 |
# File 'lib/amq/protocol/frame.rb', line 16 def self.encoded_payload(payload) if payload.respond_to?(:force_encoding) && payload.encoding.name != 'BINARY' # Only copy if we have to. payload = payload.dup.force_encoding('BINARY') end payload end |
.find_type(type) ⇒ Object
49 50 51 52 53 |
# File 'lib/amq/protocol/frame.rb', line 49 def self.find_type(type) type_id = if Symbol === type then TYPES[type] else type end raise FrameTypeError.new(TYPES_OPTIONS) if type == nil || !TYPES_REVERSE.has_key?(type_id) type_id end |
.new(original_type, *args) ⇒ Object
43 44 45 46 47 |
# File 'lib/amq/protocol/frame.rb', line 43 def self.new(original_type, *args) type_id = find_type(original_type) klass = CLASSES[type_id] klass.new(*args) end |
Instance Method Details
#__new__ ⇒ Object
because of reloading
40 |
# File 'lib/amq/protocol/frame.rb', line 40 alias_method :__new__, :new |
#final? ⇒ Boolean
74 75 76 |
# File 'lib/amq/protocol/frame.rb', line 74 def final? true end |