handle timeouts ourselves because Phantom doesn't do it