Sha256: 43eeed10e0debed37c5600431b23a80049b45b553d1814d148eb7b4e9f0a9cee

Contents?: true

Size: 1.69 KB

Versions: 1

Compression:

Stored size: 1.69 KB

Contents

# encoding: binary

module WebSocket
  module Frame
    module Handler
      class Handler07 < Handler05

        # Hash of frame names and it's opcodes
        FRAME_TYPES = {
          :continuation => 0,
          :text => 1,
          :binary => 2,
          :close => 8,
          :ping => 9,
          :pong => 10,
        }

        # Hash of frame opcodes and it's names
        FRAME_TYPES_INVERSE = FRAME_TYPES.invert

        def encode_frame
          if @frame.type == :close
            code = @frame.code || 1000
            @frame.data = Data.new([code].pack('n') + @frame.data.to_s)
            @frame.code = nil
          end
          super
        end

        def decode_frame
          result = super
          if has_close_code?(result)
            code = result.data.slice!(0..1)
            result.code = code.unpack('n').first
          end
          result
        end

        private

        def has_close_code?(frame)
          frame && frame.type == :close && !frame.data.empty?
        end

        # Convert frame type name to opcode
        # @param [Symbol] frame_type Frame type name
        # @return [Integer] opcode or nil
        # @raise [WebSocket::Error] if frame opcode is not known
        def type_to_opcode(frame_type)
          FRAME_TYPES[frame_type] || raise(WebSocket::Error::Frame::UnknownFrameType)
        end

        # Convert frame opcode to type name
        # @param [Integer] opcode Opcode
        # @return [Symbol] Frame type name or nil
        # @raise [WebSocket::Error] if frame type name is not known
        def opcode_to_type(opcode)
          FRAME_TYPES_INVERSE[opcode] || raise(WebSocket::Error::Frame::UnknownOpcode)
        end

      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
websocket-1.1.3 lib/websocket/frame/handler/handler07.rb