Simplifying the unpacker sounds good (your idea 2). If it fails to read the next data (while waiting), the user should create a new MessageUnpacker instance to restart the reading.