I think I shared about event-driven IO. In this scenario:

1. (user code) receive 1 byte from a socket
2. (user code) write it into buffer
3. (user code) call `Unpacker.unpackShort`
4. (MessageBuffer or Unpacker) throws `EOFException` or (`MessageDataInsufficientException`)
5. (user code) wait for extra data from socket using IO multiplexing
6. (user code) receive some more data and add it to buffer
7. `Unpacker.unpackShort` should successfully return a value.

an implementation is to advance the position here while storing the head byte in `head` field ( (as last old code does: https://github.com/msgpack/msgpack-java/blob/688a04d31fa803270e6b39067fdd4dc59ec13422/msgpack-core/src/main/java/org/msgpack/core/MessageUnpacker.java#L79) so that `unpackShort` can call `lookAhead` multiple times *after step 4* (=step 7). (note: `readByte` or `readInt` causes EOFException (or MessageFormatException) after `consume()`).