# File lib/faye/websocket/api.rb, line 67
      def close(code = nil, reason = nil, ack = true)
        return if @ready_state == CLOSED
        return if @ready_state == CLOSING && ack

        finalize = lambda do
          @ready_state = CLOSED
          EventMachine.cancel_timer(@ping_timer) if @ping_timer
          @stream.close_connection_after_writing
          event = Event.new('close', :code => code || 1000, :reason => reason || '')
          event.init_event('close', false, false)
          dispatch_event(event)
        end

        return finalize.call if @ready_state == CONNECTING

        @ready_state = CLOSING

        if ack
          if @parser.respond_to?(:close)
            @parser.close(code, reason, &finalize)
          else
            finalize.call
          end
        else
          @parser.close(code, reason) if @parser.respond_to?(:close)
          finalize.call
        end
      end