진행 구독 (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 값
| phase | terminal | 의미 |
|---|---|---|
SYNTHESIZING | false | TTS 음성 합성 진행 중 |
BROADCASTING | false | 디바이스로 방송 명령 전달 중 |
DONE | true | 방송 완료(receipt.skipped 확인) |
FAILED | true | 방송 실패 |
PARTIAL | true | 일부 디바이스 성공 |
terminal: true가 오면 구독을 종료합니다. 최종 결과는 snapshot.receipt(resolvedDeviceCount·skipped 등)에 담깁니다.
자동 재연결 · 세션 만료
일시적 네트워크 단절 시 SDK가 lastEventId를 Last-Event-ID 헤더에 실어 자동 재연결합니다 — 앱 코드에서 별도 처리가 필요 없습니다.
단, SessionExpired(STREAM_GONE, 410)가 onError로 오면 서버가 이벤트를 더 이상 보존하지 않는 것이라 재연결 대상이 아닙니다. 이 경우 동일 세션을 복구할 수 없습니다.
SSE 에러는 throw되지 않고 항상 onError 콜백으로 전달됩니다. 에러 클래스는 에러 문서 참조.

