rework: lazy message reading