OPWS Developers

진행 구독 (Streaming)

TTS 방송은 즉시 끝나지 않습니다 — 음성 합성 → 디바이스 전달 → 결과 회수의 단계를 거칩니다. broadcast.subscribe()로 이 진행을 SSE로 실시간 추적합니다.

방송 → 구독 흐름

가장 흔한 패턴은 TTS 전송 후 반환된 sessionId로 바로 구독하는 것입니다.

ts
const receipt = await oe.broadcast.tts.send({ /* ... */ });
if (!receipt.sessionId) return;   // DENIED_BUSINESS

const sub = oe.broadcast.subscribe(receipt.sessionId, {
  onPhase: (snap) => {
    updateUI(snap.phase, snap.terminal, snap.receipt);
    if (snap.terminal) sub.close();   // 완료/실패 — 종료
  },
  onError: (err) => handleError(err),
});

phase 값

phaseterminal의미
SYNTHESIZINGfalseTTS 음성 합성 진행 중
BROADCASTINGfalse디바이스로 방송 명령 전달 중
DONEtrue방송 완료(receipt.skipped 확인)
FAILEDtrue방송 실패
PARTIALtrue일부 디바이스 성공

terminal: true가 오면 구독을 종료합니다. 최종 결과는 snapshot.receipt(resolvedDeviceCount·skipped 등)에 담깁니다.

자동 재연결 · 세션 만료

일시적 네트워크 단절 시 SDK가 lastEventIdLast-Event-ID 헤더에 실어 자동 재연결합니다 — 앱 코드에서 별도 처리가 필요 없습니다.

단, SessionExpired(STREAM_GONE, 410)가 onError로 오면 서버가 이벤트를 더 이상 보존하지 않는 것이라 재연결 대상이 아닙니다. 이 경우 동일 세션을 복구할 수 없습니다.

SSE 에러는 throw되지 않고 항상 onError 콜백으로 전달됩니다. 에러 클래스는 에러 문서 참조.