Storage event — Web Storage’dagi localStorage qiymati bir hujjatda o‘zgarganda shu originning boshqa browsing contextlariga yuboriladigan brauzer hodisasi. U bir nechta tab yoki oynada oddiy holat sinxronlash uchun ishlatiladi. Hodisa o‘zgarishni amalga oshirgan hujjatning o‘zida emas, o‘zgarishni ko‘rishi kerak bo‘lgan boshqa hujjatlarda yuz beradi.
Hodisa tarkibi
storage hodisasi window obyektida tinglanadi. key o‘zgargan kalitni, oldValue oldingi matnni, newValue yangi matnni beradi. url o‘zgarishni qilgan document manzilini, storageArea esa tegishli storage obyektini ko‘rsatadi. clear() chaqirilganda key va qiymatlar null bo‘lishi mumkin.
window.addEventListener('storage', (event) => {
if (event.key === 'theme' && event.newValue) {
applyTheme(event.newValue)
}
})
localStorage qiymatlari string bo‘lgani uchun structured holat JSON bilan serialize qilinadi. Parser xatosi va schema version tekshiriladi. Katta obyektni har o‘zgarishda serialize qilish main threadni band qilishi mumkin.
Tarqalish sohasi
Local storage origin bo‘yicha ajratiladi: sxema, host va port mos bo‘lishi kerak. Boshqa origin hodisani olmaydi. sessionStorage esa top-level browsing context bo‘yicha cheklangan; unga tegishli storage event faqat shu tab ichidagi bir xil session storage’ni ulashuvchi iframe’larda tarqalishi mumkin.
Hodisa browser profile, incognito kontekst va container chegarasidan o‘tmaydi. Mobil brauzer fon tabini muzlatishi, kechiktirishi yoki yopishi mumkin. Shuning uchun storage event kuchli real-time yetkazish kafolati emas. Muhim server holati qayta fokusda API’dan tekshiriladi.
Sinxronlash modeli
Theme, logout signali yoki boshqa tabda yangilangan preference storage event uchun mos. Har update’da version yoki timestamp bo‘lsa tab eski hodisani inkor qilishi mumkin. Faqat local clockka tayanish clock skew va bir xil vaqt muammosini beradi; monotonic revision yoki server versiyasi ishonchliroq.
Event handler o‘zi yana shu keyni yozsa tablar o‘rtasida ping-pong sikli yuz berishi mumkin. Message’da originator ID va event ID saqlanib, allaqachon ko‘rilgan update qayta tarqatilmaydi. Yozuvlarni birlashtirish kerak bo‘lsa conflict policy aniq bo‘ladi; storage oxirgi yozuv yutishi semanticsidan kuchli transaction bermaydi.
Muqobil vositalar
BroadcastChannel bir origin tablari orasida to‘g‘ridan-to‘g‘ri structured message yuboradi va storage’ni signal sifatida suiiste’mol qilmaydi. SharedWorker bir nechta client uchun umumiy worker holatini saqlashi mumkin. Service Worker clientlarga message tarqatadi. Serverdagi o‘zgarishlar uchun WebSocket yoki Server-Sent Events kerak bo‘lishi mumkin.
Tanlov browser qo‘llab-quvvatlashi, delivery talabi va message hajmiga bog‘liq. Storage event oddiy fallback bo‘la oladi, ammo queue emas: offline tab barcha oraliq qiymatlarni olishi kafolatlanmaydi. Yakuniy holat storage’dan qayta o‘qiladi.
Xavfsizlik
Bir origindagi har qanday script localStorage va hodisa qiymatini o‘qishi mumkin. XSS token, shaxsiy ma’lumot va cross-tab signalni egallaydi. Yuqori qiymatli credential saqlanmaydi. Handler newValueni ishonchli deb bilmaydi; DOM’ga chiqarishda xavfsiz API va schema validation ishlatiladi.
Logout signalini olish boshqa tabdagi server sessiyasini o‘zi bekor qilmaydi. Server token yoki cookie’ni haqiqatan bekor qiladi, tablar esa UI va cache’ni tozalaydi. Hodisa kelmasa ham keyingi API so‘rovi ruxsatsiz javobni to‘g‘ri boshqarishi kerak.
Sinov xususiyatlari
Storage eventni bitta window unit testida to‘liq baholash qiyin, chunki hodisa writer hujjatning o‘ziga kelmaydi. Browser integration testi ikki tab ochib, update va clear holatini tekshiradi. Private mode, storage bloklangan muhit va quota xatosi ham fallback xulqiga ega bo‘ladi.
Bog‘liq tushunchalar
Web Storage, localStorage, sessionStorage, BroadcastChannel, Same-origin policy, Browser event, Cross-tab communication