fix(socket): kalıcı pes etme yerine sınırsız yeniden bağlanma + backoff#685
Merged
lilyshen0722 merged 1 commit intoJul 19, 2026
Merged
Conversation
reconnectionAttempts: 5 idi. socket.io gecikmeyi üstel artırdığı için bu ~17 saniyelik bir pencere demek (1s→2s→4s→5s→5s, delayMax 5000 varsayılanı). Bu pencereyi aşan HER kesintide — laptop uykusu, backend deploy'u, uzun ağ blip'i — socket KALICI olarak pes ediyor ve bir daha denemiyordu. Sayfa açık kalıyor, REST ile yüklenmiş eski mesajlar duruyor, yeni hiçbir şey gelmiyor: kullanıcı sessizce bayat veriye bakıp 'mesajım gitmedi mi?' diyor. Pod'u açık bırakıp agentları izlemek bu üründe beklenen kullanım (canlı gözlendi 2026-07-16: sekme ~1 saat sonra ölü, F5 ile düzeliyor). A/B ölçümü (aynı backend, iki istemci yan yana, 45sn kesinti): ESKİ(5): deneme Team-Commonly#5 -> *** PES ETTİ — bir daha denemeyecek *** YENİ(∞): deneme Team-Commonly#6 -> *** YENİDEN BAĞLANDI *** -> CONNECT 12sn'lik kısa kesintide ikisi de toparlıyor — sorun yalnız uzun kesintide. Değişiklik: - reconnectionAttempts: Infinity + reconnectionDelayMax 30sn + jitter 0.5 (sunucu dönene kadar dener; backoff ile sunucuyu dövmez) - visibilitychange/online/focus -> hemen connect(): backoff 30sn'ye çıkabildiği için kullanıcı sekmeye döndüğünde bir sonraki denemeyi beklemesin. Sunucu taraflı kapatmada (io.disconnect) otomatik reconnect devreye girmez — bu olaylar o durumun da tek kurtarma yolu. - Listener'lar cleanup'ta kaldırılıyor. Doğrulama: tsc SocketContext.tsx için temiz (repodaki diğer tip hataları mevcut ve ilgisiz); vite HMR derledi, hata yok. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
lilyshen0722
approved these changes
Jul 19, 2026
lilyshen0722
left a comment
Contributor
There was a problem hiding this comment.
This explains a class of 'the app silently stopped updating' reports we've been chasing. 5 attempts ≈ 17s meant every laptop sleep or deploy window permanently killed realtime while the tab showed stale data. Infinity + 30s max backoff + reconnect-on-visible/online/focus (with proper listener cleanup) is the right shape, and leaving a pod open to watch agents is exactly the intended use pattern you named. Merging all three — thanks for a genuinely great set of contributions.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Sorun
SocketContext.tsx→reconnectionAttempts: 5. socket.io gecikmeyi üstel artırdığı için bu ~17 saniyelik bir pencere demek (1s→2s→4s→5s→5s;reconnectionDelayMaxvarsayılanı 5000).Bu pencereyi aşan her kesintide — laptop uykusu, backend deploy'u, uzun ağ blip'i — socket kalıcı olarak pes ediyor ve bir daha denemiyor. Sayfa açık kalır, REST ile yüklenmiş eski mesajlar durur, yeni hiçbir şey gelmez. Kullanıcı sessizce bayat veriye bakar ve "mesajım gitmedi mi?" diye sorar; F5 "düzeltir".
Pod'u açık bırakıp agentları izlemek bu üründe beklenen kullanım — kalıcı pes etmek kabul edilemez. Canlıda gözlendi (2026-07-16): sekme ~1 saat açık kaldıktan sonra ölü.
Ölçüm (A/B, aynı backend, iki istemci yan yana)
Kısa kesintide ikisi de toparlıyor; fark uzun kesintide ortaya çıkıyor.
Backend suçsuz: socket.io client bağlanıp CLI'dan mesaj atıldığında
newMessageanında geliyor (emit yolumessageController.ts:311,agentMessageService.ts:1426,server.ts:734sağlam).Değişiklik
reconnectionAttempts: Infinity+reconnectionDelayMax: 30000+ jitter — sunucu dönene kadar dener, backoff ile sunucuyu dövmezvisibilitychange/online/focus→ hemenconnect(): backoff 30sn'ye çıkabildiği için kullanıcı sekmeye döndüğünde bir sonraki denemeyi beklemesin. Sunucu taraflı kapatmada (io.disconnect) otomatik reconnect zaten devreye girmez — bu olaylar o durumun da tek kurtarma yoluDoğrulama
tsc --noEmit:SocketContext.tsxtemiz (repodaki diğer tip hataları mevcut ve bu değişiklikle ilgisiz). Vite HMR derledi, hata yok.Kalan (bu PR'da değil)
connectedstate'i UI'da gösterilmiyor — yalnız pod'a katılma mantığında kullanılıyor. Bağlantı koptuğunda kullanıcı hâlâ bir şey görmüyor; artık kalıcı değil ama backoff penceresinde sessiz. Bir gösterge tasarım kararı gerektiriyor.🤖 Generated with Claude Code