Thanks for the clarification of the problem. Discussing on this recovery model is good to share this idea.  

So the basic idea is to make the unpacker non-blocking. If the unpacker uses blocking I/O, unpackXXX methods simply can wait until sufficient amount of data is stored in the buffer. 

Message pack formats start with the length information, so we can distinguish EOFException and InsufficientDataException if we store the length information. 

Simply saying unpackXXX can be called multiple times is a little bit confusing, so let's define the behavior of unpackXXX:
 1. It returns the unpacked value and proceeds the cursor on success.
 2. If it fails due to the lack of incoming data, it throws InsufficientException. The cursor does not move in this case. 
 3. If it reaches the end of stream (buffer) before receiving sufficient amount of data for unpacking, it throws EOFException.

To implement this, we might need peakXXX methods that do not proceed the cursor.