
Bir not uygulaması tarayıcı sekmesinde çalışıyorsa yazdıkların bir yere gidiyor. Sunucuya gitmiyorsa nereye gittiği sorusunun cevabı dosya sisteminde bir klasör olmuyor; tarayıcının o site için ayırdığı, origin adı verilen bir alana gidiyor ve o alan senin diskinde durmasına rağmen kuralları senin değil tarayıcının. Kotası cihaza göre değişiyor. Belirli koşullarda da tarayıcı orayı haber vermeden boşaltıyor.
Üç ayrı depo, üç ayrı iş
Bir web uygulamasının yazabileceği yer tek bir havuz değil.
localStorage en eski ve en dar olanı: toplam sınırı 10 MiB, yarısını sessionStorage ile paylaşıyor ve senkron çalıştığı için büyük veri yazmak arayüzü olduğu yerde bekletiyor. Oraya küçük şeyler yazılır. Bir tema seçimi, son açılan sekme, bir tercih.
IndexedDB asıl iş yapan katman. Kayıtları, indeksleri ve sorguları olduğu için notlar, görevler, etiketler ve arama indeksi burada duruyor.
Origin Private File System üçüncüsü ve en yenisi. Dosya benzeri, parça parça yazılabilen bir alan olduğu için PDF ve görsel gibi büyük ekler bu katmana yazılıyor, üstelik tamamı belleğe alınmadan. Üçü de aynı kotadan yiyor. Yani ekleri başka bir yüzeye taşıyıp yerden kazanmak diye bir şey yok.
Kotayı sen değil disk belirliyor
Sabit bir megabayt rakamı yok, çünkü kota cihazdaki diskin bir yüzdesi olarak hesaplanıyor ve her tarayıcı kendi yüzdesini kullanıyor. Chrome ve Chromium tabanlı tarayıcılarda origin başına sınır diskin yaklaşık yüzde altmışı. Firefox varsayılan modda diskin yüzde onuyla 10 GiB’ın küçüğünü veriyor, kalıcı modda yüzde elliye çıkıyor. Safari tarayıcı uygulamasında yüzde altmış civarında; uygulama içi web görünümünde yaklaşık yüzde on beş.
Pratik karşılığı şu: aynı çalışma alanı 512 GB’lık bir dizüstünde rahat rahat sığarken 64 GB’lık bir tablette sınıra dayanabiliyor. navigator.storage.estimate() o cihazdaki gerçek sayıyı söyler. Söylediği rakam bir tahmindir.
Silinme iki ayrı kapıdan geliyor
Birincisi disk baskısı: cihazda yer daralınca tarayıcı en son kullanılan origin’den başlayıp geriye doğru siliyor ve silme işlemi kısmi olmuyor, çünkü yarısı boşaltılmış bir veritabanı tutarsız bir uygulamadan daha kötü sonuç veriyor. Bir origin temizlendiğinde hepsi gidiyor. IndexedDB, OPFS ve localStorage birlikte.
İkincisi Safari’ye özgü ve çok daha sık karşılaşılıyor. Çapraz site izleme koruması açıkken, JavaScript’in yazdığı depo yedi günlük tarayıcı kullanımı boyunca hiç etkileşim görmediyse siliniyor; etkileşim derken kastedilen tıklama ya da dokunma, yani sekmeyi arka planda açık bırakmak bu sayacı sıfırlamıyor.
Kuralların ayrıntısı ve tarayıcı farkları MDN, “Storage quotas and eviction criteria” sayfasında duruyor.
persist() ne kazandırıyor
navigator.storage.persist() origin’i kalıcı işaretlemek için izin ister ve kabul edilirse veri yalnızca kullanıcı tarayıcı ayarlarından temizlediğinde gidiyor, disk baskısı artık dokunmuyor. Kararı tarayıcı veriyor. Firefox soruyor; Chrome kullanım geçmişine bakıp sessizce karar veriyor; Safari de sessizce.
Yani elindeki bir garanti değil, bir talep. Cevabı öğrenmenin tek yolu çağrının döndürdüğü değere bakmak.
Bunu bilmek neyi değiştiriyor
Context’in web sürümü tam olarak bu zeminde çalışıyor ve sync kapalı geldiği için ilk gün çalışma alanının tamamı burada duruyor. Kalıcılık talebi gönderilse bile üçüncü tarafın verdiği bir söze dayanıyorsun.
Dışa aktarmanın bir özellik maddesi olmaktan çıkıp alışkanlığa dönmesinin sebebi bu. Markdown olarak dışa aktar, dosyayı başka bir diske koy, işi bitir. Beş dakika. Yedi günlük bir kuralın ne zaman işlediğini takip etmek zorunda kalmazsın.
