return errors instead of throwing them
emit asynchronously