add promise based async API