if (isC0(data)) {
state.C0 = data;
} else if (isC0C1(data)) {
state.C0 = data.subarray(0, 1);
state.C1 = data.subarray(1);
} else if (isBufferSize1536(data)) {
if (isC1(state.C0, state.C1)) {
state.C1 = data;
} else if (isC2(state.C1, state.C2)) {
state.C2 = data;
}
}
Client로부터 C0 패킷만 왔을 경우(1 바이트)와 C0 패킷과 C1 패킷이 함께 오는 경우(1537 바이트), C0 패킷이 도착하고 난 다음 요청에 C2 패킷이 오는 경우(1536 바이트)에 따라서 C0, C1, C2 패킷에 데이터를 각각 할당해줍니다.
const IS_C1_ALREADY_ARRIVED = isC2(state.C1, state.C2);
if ((isBufferSize1536(state.C1) || isC0C1(data)) && IS_C1_ALREADY_ARRIVED) {
state.C1_TIMESTAMP = state.C1.subarray(0, 4);
state.C1_RANDOM_BYTES = state.C1.subarray(8);
}
Client로부터 전달받게 되는 C1 패킷의 Timestamp와 RandomBytes는 이후 S2 패킷을 생성해 보내주는 경우에 사용되어야 합니다.
그렇기 때문에 C1 패킷이 도착했을 경우 C1 패킷의 Timestamp와 RandomBytes를 별도로 저장해놓는 로직을 작성하였습니다.
if (isC0(data) || isC0C1(data)) {
const S0 = Buffer.alloc(1);
S0.writeUIntLE(3, 0, 1);
socket.write(S0);
const S1_0 = Buffer.alloc(4);
const S1 = Buffer.concat([state.S1_TIMESTAMP, S1_0, state.S1_RANDOM_BYTES]);
socket.write(S1);
} else if (isBufferSize1536(state.C2)) {
const C2_RANDOM_ECHO = state.C2.subarray(8);
if (!isValidC2RandomEcho(state.S1_RANDOM_BYTES, C2_RANDOM_ECHO)) return false;
const S2 = Buffer.concat([state.C1_TIMESTAMP, state.S1_TIMESTAMP, state.C1_RANDOM_BYTES]);
socket.write(S2);
return true;
}