RTMP Handshake 과정 이후 오는 데이터들이 RTMP Chunk Stream Format의 형태를 가지고 있었기 때문에 데이터들을 형식에 맞게 분리하는 함수들을 작성하고, 이 함수들을 활용하여 하나의 chunk를 생성하였다.
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;
chunkStreamId 의 값에 따라 Basic 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;
chunk.basicHeader.chunkType으로 Message Header의 길이를 판단한다.parseMessageHeader 함수에 전달해 값을 반환하여 저장한다.