callback should always be async even in error cases / early return.