class Faye::WebSocket::HybiParser

def emit_frame

def emit_frame
  payload = @masked ? Mask.mask(@payload, @mask) : @payload
  case @opcode
    when OPCODES[:continuation] then
      return @socket.close(ERRORS[:protocol_error], nil, false) unless @mode
      @buffer.concat(payload)
      if @final
        message = @buffer
        message = WebSocket.encode(message, true) if @mode == :text
        reset
        if message
          @socket.receive(message)
        else
          @socket.close(ERRORS[:encoding_error], nil, false)
        end
      end
    when OPCODES[:text] then
      if @final
        message = WebSocket.encode(payload, true)
        if message
          @socket.receive(message)
        else
          @socket.close(ERRORS[:encoding_error], nil, false)
        end
      else
        @mode = :text
        @buffer.concat(payload)
      end
    when OPCODES[:binary] then
      if @final
        @socket.receive(payload)
      else
        @mode = :binary
        @buffer.concat(payload)
      end
    when OPCODES[:close] then
      code = (payload.size >= 2) ? 256 * payload[0] + payload[1] : nil
      unless (payload.size == 0) or
             (code && code >= 3000 && code < 5000) or
             ERROR_CODES.include?(code)
        code = ERRORS[:protocol_error]
      end
      if payload.size > 125 or not WebSocket.valid_utf8?(payload[2..-1] || [])
        code = ERRORS[:protocol_error]
      end
      reason = (payload.size > 2) ? WebSocket.encode(payload[2..-1], true) : nil
      @socket.close(code, reason, false)
      @closing_callback.call if @closing_callback
    when OPCODES[:ping] then
      return @socket.close(ERRORS[:protocol_error], nil, false) if payload.size > 125
      @socket.send(payload, :pong)
    when OPCODES[:pong] then
      message = WebSocket.encode(payload, true)
      callback = @ping_callbacks[message]
      @ping_callbacks.delete(message)
      callback.call if callback
  end
end