private static byte[] getMimeType(final DirectBuffer directBuffer, final int fieldOffset) {
    final int length = directBuffer.getByte(fieldOffset);
    final byte[] bytes = new byte[length];

    directBuffer.getBytes(fieldOffset + 1, bytes);
    return bytes;
  }
  @Test
  public void shouldEncodeCorrectly() {
    final ByteBuffer encodedMsgBuffer = ByteBuffer.allocateDirect(MSG_BUFFER_CAPACITY);
    encodeTestMessage(encodedMsgBuffer);

    final DirectBuffer decodeBuffer = new UnsafeBuffer(encodedMsgBuffer);

    int offset = 0;
    assertThat(decodeBuffer.getShort(offset), is((short) 22));
    offset += BitUtil.SIZE_OF_SHORT;

    assertThat(decodeBuffer.getShort(offset), is((short) 1));
    offset += BitUtil.SIZE_OF_SHORT;

    assertThat(decodeBuffer.getShort(offset), is((short) 3));
    offset += BitUtil.SIZE_OF_SHORT;

    assertThat(decodeBuffer.getShort(offset), is((short) 0));
    offset += BitUtil.SIZE_OF_SHORT;

    assertThat(decodeBuffer.getByte(offset), is((byte) 10));
    offset += BitUtil.SIZE_OF_BYTE;

    assertThat(decodeBuffer.getByte(offset), is((byte) 42));
    offset += BitUtil.SIZE_OF_BYTE;

    assertThat(decodeBuffer.getInt(offset), is(0x00_01_00_00));
    offset += BitUtil.SIZE_OF_INT;

    assertThat(decodeBuffer.getLong(offset), is(101L));
    offset += BitUtil.SIZE_OF_LONG;

    assertThat(decodeBuffer.getLong(offset), is(202L));
  }
  public static int payloadOffset(final DirectBuffer directBuffer, final int offset) {
    int fieldOffset = offset + METADATA_MIME_TYPE_LENGTH_OFFSET;

    final int metadataMimeTypeLength = directBuffer.getByte(fieldOffset);
    fieldOffset += 1 + metadataMimeTypeLength;

    final int dataMimeTypeLength = directBuffer.getByte(fieldOffset);
    fieldOffset += 1 + dataMimeTypeLength;

    return fieldOffset;
  }
  private static void pongHandler(
      final DirectBuffer buffer, final int offset, final int length, final Header header) {
    final long pingTimestamp = buffer.getLong(offset);
    final long rttNs = System.nanoTime() - pingTimestamp;

    HISTOGRAM.recordValue(rttNs);
  }
  public static String dataMimeType(final DirectBuffer directBuffer, final int offset) {
    int fieldOffset = offset + METADATA_MIME_TYPE_LENGTH_OFFSET;

    fieldOffset += 1 + directBuffer.getByte(fieldOffset);

    final byte[] bytes = getMimeType(directBuffer, fieldOffset);
    return new String(bytes, StandardCharsets.UTF_8);
  }
 public static int keepaliveInterval(final DirectBuffer directBuffer, final int offset) {
   return directBuffer.getInt(offset + KEEPALIVE_INTERVAL_FIELD_OFFSET, ByteOrder.BIG_ENDIAN);
 }
 public static int version(final DirectBuffer directBuffer, final int offset) {
   return directBuffer.getInt(offset + VERSION_FIELD_OFFSET, ByteOrder.BIG_ENDIAN);
 }
 public static int maxLifetime(final DirectBuffer directBuffer, final int offset) {
   return directBuffer.getInt(offset + MAX_LIFETIME_FIELD_OFFSET, ByteOrder.BIG_ENDIAN);
 }
 public void wrap(final DirectBuffer buffer, final int offset) {
   if (buffer.getInt(offset) != type().ordinal()) {
     throw new IllegalArgumentException("Buffer must contain message type " + type());
   }
   super.wrap(buffer, offset);
 }