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