과정

RTMP Handshake 과정 이후 오는 데이터들이 RTMP Chunk Stream Format의 형태를 가지고 있었기 때문에 데이터들을 형식에 맞게 분리하는 함수들을 작성하고, 이 함수들을 활용하여 하나의 chunk를 생성하였다.

Basic Header 저장

case BASIC_HEADER_STATE:
  let basicHeaderBytes = 1;
  chunk = createRtmpChunk();
  const basicHeaderBuf = data.subarray(offset, offset + 1)[0];
  const chunkStreamId = basicHeaderBuf & 0x3f;
  if (chunkStreamId === 0) {
    basicHeaderBytes = 2;
  } else if (chunkStreamId === 1) {
    basicHeaderBytes = 3;
  }
  chunk.basicHeader = parseBasicHeader(data.subarray(offset, offset + basicHeaderBytes));
  offset += basicHeaderBytes;
  currentChunkState += 1;
  break;

Message Header 저장

case MESSAGE_HEADER_STATE:
	let messageHeaderBytes = 0;
	if (chunk.basicHeader.chunkType === 0) {
	  messageHeaderBytes = 11;
	} else if (chunk.basicHeader.chunkType === 1) {
	  messageHeaderBytes = 7;
	} else if (chunk.basicHeader.chunkType === 2) {
	  messageHeaderBytes = 3;
	} else if (chunk.basicHeader.chunkType === 3) {
	  continue;
	}
	chunk.messageHeader = parseMessageHeader(
	  chunk.basicHeader.chunkType,
	  data.subarray(offset, offset + messageHeaderBytes),
	);
	offset += messageHeaderBytes;
	currentChunkState += 1;
	break;

Extended Timestamp 저장