[refactor] async and simpler api