try to better handle timeouts via cancellation token