()
| 2058 | } |
| 2059 | |
| 2060 | const handleTTSEnd = () => { |
| 2061 | setTtsStreamingState((prevState) => { |
| 2062 | if (prevState.mediaSource && prevState.mediaSource.readyState === 'open') { |
| 2063 | try { |
| 2064 | if (prevState.sourceBuffer && prevState.chunkQueue.length > 0 && !prevState.sourceBuffer.updating) { |
| 2065 | const remainingChunks = [...prevState.chunkQueue] |
| 2066 | remainingChunks.forEach((chunk, index) => { |
| 2067 | setTimeout(() => { |
| 2068 | if (prevState.sourceBuffer && !prevState.sourceBuffer.updating) { |
| 2069 | try { |
| 2070 | prevState.sourceBuffer.appendBuffer(chunk) |
| 2071 | if (index === remainingChunks.length - 1) { |
| 2072 | setTimeout(() => { |
| 2073 | if (prevState.mediaSource && prevState.mediaSource.readyState === 'open') { |
| 2074 | prevState.mediaSource.endOfStream() |
| 2075 | } |
| 2076 | }, 100) |
| 2077 | } |
| 2078 | } catch (error) { |
| 2079 | console.error('Error appending remaining chunk:', error) |
| 2080 | } |
| 2081 | } |
| 2082 | }, index * 50) |
| 2083 | }) |
| 2084 | return { |
| 2085 | ...prevState, |
| 2086 | chunkQueue: [] |
| 2087 | } |
| 2088 | } |
| 2089 | |
| 2090 | if (prevState.sourceBuffer && !prevState.sourceBuffer.updating) { |
| 2091 | prevState.mediaSource.endOfStream() |
| 2092 | } else if (prevState.sourceBuffer) { |
| 2093 | prevState.sourceBuffer.addEventListener( |
| 2094 | 'updateend', |
| 2095 | () => { |
| 2096 | if (prevState.mediaSource && prevState.mediaSource.readyState === 'open') { |
| 2097 | prevState.mediaSource.endOfStream() |
| 2098 | } |
| 2099 | }, |
| 2100 | { once: true } |
| 2101 | ) |
| 2102 | } |
| 2103 | } catch (error) { |
| 2104 | console.error('Error ending TTS stream:', error) |
| 2105 | } |
| 2106 | } |
| 2107 | return prevState |
| 2108 | }) |
| 2109 | } |
| 2110 | |
| 2111 | const handleTTSAbort = (data) => { |
| 2112 | const messageId = data.chatMessageId |
no outgoing calls
no test coverage detected