src: DRY out classes

Rather than duplicating work in sync/async methods, just use a single
method to do work and call it accordingly.