refactor the upstreamAsync impl