Sha256: 136052279561bbd7fa147b308215dfcb1ed13273267b803e4513d86a9db37083

Contents?: true

Size: 1.31 KB

Versions: 4

Compression:

Stored size: 1.31 KB

Contents

# frozen_string_literal: true

module ActionCable
  module Server
    class Socket
      # Allows us to buffer messages received from the WebSocket before the Connection has been fully initialized, and is ready to receive them.
      class MessageBuffer # :nodoc:
        def initialize(connection)
          @connection = connection
          @buffered_messages = []
        end

        def append(message)
          if valid? message
            if processing?
              receive message
            else
              buffer message
            end
          else
            connection.logger.error "Couldn't handle non-string message: #{message.class}"
          end
        end

        def processing?
          @processing
        end

        def process!
          @processing = true
          receive_buffered_messages
        end

        private
          attr_reader :connection
          attr_reader :buffered_messages

          def valid?(message)
            message.is_a?(String)
          end

          def receive(message)
            connection.receive message
          end

          def buffer(message)
            buffered_messages << message
          end

          def receive_buffered_messages
            receive buffered_messages.shift until buffered_messages.empty?
          end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
actioncable-next-0.2.0 lib/action_cable/server/socket/message_buffer.rb
actioncable-next-0.1.2 lib/action_cable/server/socket/message_buffer.rb
actioncable-next-0.1.1 lib/action_cable/server/socket/message_buffer.rb
actioncable-next-0.1.0 lib/action_cable/server/socket/message_buffer.rb