Kafe & işletme senaryosu — sabah 8'den gece 12'ye kesintisiz çalma
Teknik bilgi gerekmez
Bir kafede müzik sistemi sabah 8'de açılıyor, gece 12'ye kadar çalıyor. Hiç kimse bilgisayarın başında oturmuyor — müzik kendi kendine devam etmeli.
Kodu inceledik. İyi haber: Temel yapı sağlam — bellek temizliği var, hata sonrası otomatik devam var, şarkı geçişleri düzgün çalışıyor.
Düzeltilmesi gereken 3 şey var: İnternet kesilince müziğin duraklaması, saatler sonra bilgisayarın yavaşlaması ve oturumun kapanma ihtimali. Bunları düzeltirsek 16+ saat sorunsuz çalır.
| Bileşen | Durum | Not |
|---|---|---|
| Blob URL temizliği | ✅ İyi | Merkezi takip, 5 noktada revoke |
| HLS instance havuzu | ✅ İyi | Max 2 havuz + 4 aktif, overflow koruması var |
| Şarkı geçiş temizliği | ✅ İyi | Agresif temizlik, MediaSource reset |
| URL cache limiti | ✅ İyi | 30 kayıt limiti + 5 dk TTL + LRU |
| Hata sonrası retry | ✅ İyi | Çok katmanlı: fragment retry → yeni URL → MP3 fallback |
| Sonsuz döngü koruması | ✅ İyi | Başarısız şarkı 5 dk boyunca atlanıyor |
| Buffer Monitor listener'ları | ⚠️ Risk | Her şarkıda 4 listener ekleniyor, hiç silinmiyor |
| İnternet kesilmesi recovery | ❌ Eksik | online/offline event dinlenmiyor |
| Session yenileme | ⚠️ Risk | Sadece hata gelince anlıyor, proaktif yenileme yok |
Kafe Wi-Fi'si 5 dakika kesintiye uğrarsa queue boşalır, kimse farkında olmaz
player-core.js içinde enableBackgroundPlayback() veya init() fonksiyonuna eklenecek.
// player-core.js — init() veya enableBackgroundPlayback() içine ekle // İnternet kesilince window.addEventListener('offline', () => { console.warn('📶 Bağlantı kesildi — queue korunuyor'); this._networkOffline = true; // Queue refill'i durdur (boşuna API çağrısı yapmasın) }); // İnternet gelince window.addEventListener('online', () => { console.log('✅ Bağlantı geldi — queue yenileniyor'); this._networkOffline = false; // Hemen queue doldur setTimeout(() => this.checkAndRefillQueue(), 1000); }); // Queue refill fonksiyonuna guard ekle (mevcut kod ~satır 7540) async checkAndRefillQueue() { if (this._networkOffline) return; // ← Bu satırı ekle // ... mevcut kod }
💡 Not: navigator.onLine her zaman %100 güvenilir değil (Wi-Fi bağlı ama internet yok durumu olabilir).
Bu yüzden API hatası alınca da _networkOffline = true yapılabilir.
Buffer Monitor her şarkıda 4 event listener ekliyor ama hiç silmiyor — 16 saatte 2300+ listener birikir
buffer-monitor.js dosyasında listener'lar anonim fonksiyon yerine isimli fonksiyon olacak, şarkı bitince removeEventListener çağrılacak.
// buffer-monitor.js — mevcut kod (SORUNLU) function monitor(mediaElement) { mediaElement.addEventListener('waiting', function() { ... }); // ❌ anonim mediaElement.addEventListener('playing', function() { ... }); // ❌ anonim mediaElement.addEventListener('stalled', function() { ... }); // ❌ anonim mediaElement.addEventListener('error', function() { ... }); // ❌ anonim // removeEventListener YOK! } // DÜZELTME: İsimli fonksiyon + cleanup function monitor(mediaElement) { function onWaiting() { ... } function onPlaying() { ... } function onStalled() { ... } function onError(e) { ... } mediaElement.addEventListener('waiting', onWaiting); mediaElement.addEventListener('playing', onPlaying); mediaElement.addEventListener('stalled', onStalled); mediaElement.addEventListener('error', onError); // Temizleme fonksiyonu döndür return function unmonitor() { mediaElement.removeEventListener('waiting', onWaiting); mediaElement.removeEventListener('playing', onPlaying); mediaElement.removeEventListener('stalled', onStalled); mediaElement.removeEventListener('error', onError); }; } // player-core.js — şarkı geçişinde çağır const unmonitor = monitor(audioElement); // ... şarkı bitti ... unmonitor(); // ← temizle
16 saatte login süresi dolabilir. Şu an sadece API 402 dönünce anlıyor — proaktif yenileme yok
player-core.js init() fonksiyonuna eklenecek. Backend'de session TTL'i kontrol et — her refresh isteği session'ı uzatmalı.
// player-core.js — init() içine ekle // Her 30 dakikada session'ı taze tut this._sessionRefreshInterval = setInterval(async () => { try { const res = await fetch('/api/session/ping', { method: 'POST', credentials: 'same-origin', headers: { 'X-Requested-With': 'XMLHttpRequest' } }); if (res.status === 401) { // Session gerçekten dolmuş → login sayfasına yönlendir window.location.reload(); } } catch(e) { /* offline olabilir, ignore */ } }, 30 * 60 * 1000); // 30 dakika
💡 Backend notu: /api/session/ping endpoint'i oluşturulmalı.
Sadece 200 veya 401 döndürmesi yeterli. İsteği işlemek session cookie'sini otomatik uzatır.
player-core.js — window.addEventListener('online'/'offline') ekle,
checkAndRefillQueue() başına guard koy
buffer-monitor.js — anonim fonksiyonları isimli yap,
unmonitor() fonksiyonu ekle, şarkı geçişinde çağır
/api/session/ping endpoint. Frontend: 30 dk setInterval
player-core.js
online/offline event, queue guard, session refresh
buffer-monitor.js
listener cleanup sistemi
SongStreamController.php
session/ping endpoint (opsiyonel)
player-core.js:7540 — checkAndRefillQueue() (guard eklenecek)player-core.js:7451 — queueMonitorInterval (online check)buffer-monitor.js:38-75 — 4 adet anonim listenerbuffer-monitor.js:22 — monitoredElements WeakSet