hmm, asynchronous api is nontrivial