convert to a promise-based interface