Deduplikasi Request
Gabungkan request identik yang bersamaan menjadi satu loader in-flight untuk memangkas pemanggilan DB dan API berlebih — sadar identitas, sehingga route per-user aman di-dedup.
Ketika N request bersamaan mengakses URL yang sama dari identitas yang sama, Bosia menjalankan loader sekali dan membagikan hasilnya ke semua waiter. Response yang sudah selesai tidak di-cache — begitu promise resolve, request berikutnya menjalankan load() segar.
3 request bersamaan ke /blog/post-1 (identitas sama)
┌─────────────┐
│ request 1 ──┐
│ request 2 ──┼──► load() jalan sekali ──► hasil dibagi ke semua 3
│ request 3 ──┘
└─────────────┘Ini aktif secara default untuk setiap route. Kunci dedup adalah URL (pathname + query string yang diurutkan) ditambah hash identitas yang sama dengan yang dipakai response cache: hash dari setiap cookie dan header yang namanya ada di CACHE_KEYS. Dua pengguna dengan session cookie berbeda tidak pernah berbagi hasil loader; dua pengguna anonim (tanpa nilai CACHE_KEYS) berbagi.
:::warning[Breaking change di 0.8.4]
Grup route (private) tidak lagi mematikan deduplikasi — dedup kini sadar identitas di mana pun, dan konsep scope route sudah dihapus. (private) berperilaku seperti folder (group) lainnya: tidak muncul di URL, berguna untuk berbagi layout auth.
Jika aplikasi Anda autentikasi dengan nama cookie atau header kustom, tambahkan ke CACHE_KEYS (lihat di bawah) — itu kini satu-satunya kontrak yang menjaga isolasi route per-user, untuk response cache maupun dedup.
:::
Isolasi per-user via `CACHE_KEYS`
Hash identitas dibangun dari setiap cookie DAN header yang namanya ada di CACHE_KEYS. Default-nya mencakup nama-nama sesi umum:
CACHE_KEYS=session,sid,auth,token,jwt,Authorization- Pengguna dengan nilai yang berbeda untuk salah satunya mendapat kunci dedup berbeda — loader mereka jalan independen dan tidak mungkin saling melihat data.
- Request tanpa nilai
CACHE_KEYS(trafik anonim) berbagi satu bucket identitas — persis yang diinginkan untuk halaman publik saat beban tinggi.
Jika session cookie Anda bernama kustom (mis. my_app_sess), daftarkan:
CACHE_KEYS=session,sid,auth,token,jwt,Authorization,my_app_sessBosia memberi peringatan saat runtime — di dev dan prod — setiap kali loader dari response yang di-dedup atau di-cache membaca cookie yang tidak ada di CACHE_KEYS (🚨 SECURITY WARNING yang menyebut nama cookie-nya, sekali per nama). Jika muncul, tambahkan cookie itu ke CACHE_KEYS atau opt-out route dari cache.
Contoh
✅ Di-dedup per pengguna
routes/dashboard/+page.server.ts
load() baca cookies.get("session") — tiap nilai session dapat loader run
sendiri; request bersamaan dari session yang SAMA berbagi satu run✅ Di-dedup global
routes/blog/[slug]/+page.server.ts
load() baca dari CMS — request anonim berbagi satu loader run❌ Tidak aman — cookie sesi kustom belum didaftarkan
CACHE_KEYS masih default, aplikasi autentikasi dengan "my_app_sess"
Semua pengguna ter-hash ke identitas sama — tambahkan my_app_sess ke CACHE_KEYSBatasan
- Dedup hanya untuk concurrent. Setelah promise selesai, entri dihapus dari in-flight map. Request berikutnya menjalankan loader lagi. Ini bukan TTL cache.
- Loader sebaiknya deterministik berdasarkan URL + identitas. Jika output loader bergantung pada
Date.now(), randomness, atau state eksternal yang berubah di tengah jendela, setiap waiter melihat snapshot yang sama dari siapa pun yang memicu pemanggilan. - Cookie yang di-set di dalam loader yang di-dedup hanya mengalir ke request yang memicunya. Waiter lain menerima body response tapi tidak header
Set-Cookie. - Heuristik auto
Cache-Control(private, no-cachesaat cookie diakses) tetap berlaku di dalam blok dedup — jika loader yang mendasari membaca cookies, response setiap waiter ditandai private.