break out utilities
use core.async timeout