fix: progress callback should be asynchronous