this repo has no description

fix mobile browser compatibility for SSE streaming

for await...of on res.body isn't supported in Safari/mobile browsers.
reverted to getReader() approach which has broader support.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

+13 -5
+13 -5
src/alt_text/templates/index.html
··· 56 56 e.preventDefault();r.style.display='none';a.style.display='none';a.textContent='';reasoning.style.display='none';reasoning.textContent='';s.className='';s.textContent='';mod.style.display='none';mod.className='';modVal.textContent='';cpbtn.style.display='none';f.querySelector('button').disabled=true; 57 57 try{ 58 58 const res=await fetch('/generate',{method:'POST',body:new FormData(f)}); 59 - for await(const chunk of res.body){ 60 - const text=new TextDecoder().decode(chunk); 61 - for(const line of text.split('\n\n')){ 62 - if(!line.startsWith('data: '))continue; 59 + const reader=res.body.getReader(); 60 + const decoder=new TextDecoder(); 61 + let buffer=''; 62 + while(true){ 63 + const{done,value}=await reader.read(); 64 + if(done)break; 65 + buffer+=decoder.decode(value,{stream:true}); 66 + let idx; 67 + while((idx=buffer.indexOf('\n\n'))!==-1){ 68 + const line=buffer.slice(0,idx); 69 + buffer=buffer.slice(idx+2); 70 + if(line.startsWith('data: ')){ 63 71 const d=JSON.parse(line.slice(6)); 64 72 if(d.status==='moderation_start'){s.textContent='› checking content...';mod.style.display='block';modVal.textContent='checking...'} 65 73 else if(d.status==='moderation_result'){ ··· 72 80 else if(d.status==='result'){a.textContent=d.alt_text;a.style.display='block';cpbtn.style.display='inline-block'} 73 81 else if(d.status==='complete'){s.className='ok';s.textContent='done'} 74 82 else if(d.status==='error'){s.className='e';s.textContent='error: '+d.message;r.style.display='none';reasoning.style.display='none';a.style.display='none'} 75 - }}} 83 + }}}} 76 84 catch(err){s.className='e';s.textContent='error: '+err.message} 77 85 f.querySelector('button').disabled=false}; 78 86 </script></body></html>