본문 바로가기
C.W.K.
Stream
Lesson 04 of 08 · published

연결 상태 다루기

~9 min · browser, readystate

Level 0Poller
0 XP0/60 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

readyState 가 전송을 지키는 문이야

OPEN 상태가 아닌 연결에서 ws.send() 를 호출하면 InvalidStateError 가 발생해. try/catch 로 감싸는 게 답은 아니야. 먼저 readyState 를 확인하거나 연결이 열릴 때까지 메시지를 대기열에 넣어야 해. ‘지금 보낼 수 있는가?’를 판단하는 단일 기준으로 readyState 를 사용해.

네 가지 상태 값

0 CONNECTING 은 핸드셰이크 중, 1 OPEN 은 프레임을 보낼 수 있는 상태, 2 CLOSING 은 종료 핸드셰이크가 시작된 상태, 3 CLOSED 는 완전히 종료된 상태야. WebSocket.OPEN 같은 정적 상수를 쓰면 의미를 알기 어려운 숫자 대신 ws.readyState === WebSocket.OPEN 처럼 읽기 좋은 조건을 만들 수 있어.

Code

안전한 전송 래퍼·javascript
function safeSend(ws, payload) {
  if (ws.readyState === WebSocket.OPEN) {
    ws.send(payload);
    return true;
  }
  console.warn('send dropped, state =',
    ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'][ws.readyState]);
  return false;
}
CONNECTING 상태의 대기열·javascript
const pending = [];

function send(ws, payload) {
  if (ws.readyState === WebSocket.OPEN) {
    ws.send(payload);
  } else if (ws.readyState === WebSocket.CONNECTING) {
    pending.push(payload);
  } else {
    throw new Error('socket is closing/closed');
  }
}

ws.addEventListener('open', () => {
  while (pending.length) ws.send(pending.shift());
});

External links

Exercise

위 대기열 패턴을 connect(), send(), close() 메서드가 있는 SafeSocket 래퍼 클래스로 만들어. CONNECTING 중 넣은 메시지가 연결이 열릴 때 순서대로 전송되는지, CLOSED 뒤에 send 를 호출하면 분명한 오류가 발생하는지 시험해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.