add done callback to run only if it didn't timed out