Sha256: 94c8e8a93d4ccefa0487ae61e24a0c9335556629fb7e10ea8538fdc2ccfaabe7

Contents?: true

Size: 1.28 KB

Versions: 21

Compression:

Stored size: 1.28 KB

Contents

require 'json'

module Listen
  module TCP
    class Message
      attr_reader :body, :object, :payload, :size

      HEADER_SIZE    = 4
      HEADER_FORMAT  = 'N'
      PAYLOAD_FORMAT = "#{HEADER_FORMAT}a*"

      # Initializes a new message
      #
      # @param [Object] object to initialize message with
      #
      def initialize(*args)
        self.object = args
      end

      # Generates message size and payload for given object
      def object=(obj)
        @object = obj
        @body = JSON.generate(@object)
        @size = @body.bytesize
        @payload = [@size, @body].pack(PAYLOAD_FORMAT)
      end

      # Extracts message size and loads object from given payload
      def payload=(payload)
        @payload = payload
        @size, @body = @payload.unpack(PAYLOAD_FORMAT)
        @object = JSON.parse(@body)
      end

      # Extracts a message from given buffer
      def self.from_buffer(buffer)
        if buffer.bytesize > HEADER_SIZE
          size = buffer.unpack(HEADER_FORMAT).first
          payload_size = HEADER_SIZE + size
          if buffer.bytesize >= payload_size
            payload = buffer.slice!(0...payload_size)
            new.tap do |message|
              message.payload = payload
            end
          end
        end
      end
    end
  end
end

Version data entries

21 entries across 19 versions & 4 rubygems

Version Path
honeybadger-2.4.0 vendor/gems/ruby/1.9.1/gems/listen-2.7.9/lib/listen/tcp/message.rb
honeybadger-2.4.0 vendor/gems/ruby/2.2.0/gems/listen-2.7.9/lib/listen/tcp/message.rb
honeybadger-2.4.0 vendor/gems/ruby/2.1.0/gems/listen-2.7.9/lib/listen/tcp/message.rb
listen-2.10.1 lib/listen/tcp/message.rb
vagrant-cloudstack-1.1.0 vendor/bundle/gems/listen-2.8.6/lib/listen/tcp/message.rb
listen-2.10.0 lib/listen/tcp/message.rb
listen-2.9.0 lib/listen/tcp/message.rb
listen-2.8.6 lib/listen/tcp/message.rb
listen-2.8.5 lib/listen/tcp/message.rb
listen-2.8.4 lib/listen/tcp/message.rb
listen-2.8.3 lib/listen/tcp/message.rb
listen-2.8.2 lib/listen/tcp/message.rb
listen-2.8.1 lib/listen/tcp/message.rb
listen-2.8.0 lib/listen/tcp/message.rb
listen-2.7.12 lib/listen/tcp/message.rb
listen-2.7.11 lib/listen/tcp/message.rb
vagrant-tiktalik-0.0.3 vendor/bundle/ruby/2.0.0/gems/listen-2.7.9/lib/listen/tcp/message.rb
listen-2.7.9 lib/listen/tcp/message.rb
listen-2.7.8 lib/listen/tcp/message.rb
listen-2.7.7 lib/listen/tcp/message.rb