Zadejte hledaný výraz...

Ako once-nut shared web worker?

Smazaný účet 3TgPGyKVFd
verified
rating uzivatele
5. 6. 2024 21:56:16
Mam na webe notifikacie ktore sa tahaju cez websocket. Prerabal som to teraz kvoli tabom na shared web worker aby kazdy tab nemal samostatne spojenie ale bolo zdielane len jedno spojenie medzi zalozky/okna prave cez tento zdielany worker. Na webe je vue a pinia, pinia ma zdielany stejt(synchronizuje medzi zalozkami). Na pocuvanie notifikacii pouzivam BroadcastChannel.
Vsetko funguje ako ma, ale teraz je problem ze ked pride notifikacia, tak na nu reaguju vsetky aktivne zalozky, prave kvoli tomu broadcast channelu. Ja potrebujem aby spravu spracovala iba jedna zalozka/okno pretoze tie notifikacie sa "dekoruju" dodatocnou logikou pred tym nez sa pustia do pinie ktora sa sama synchronize medzi vsetky zalozky.
Je to nejak mozne docielit?
Jasne ze to mozem urobit ako "kto prvy pocuva, ten spracuva" ale problem je potom ak tato zalozka je uzivatelom zatvorena, tak ostatne zalozky neprevezmu zodpovednost za spracovanie. A nie je mozne reagovat na zavretie tabu cez onload a podobne lebo to nie je nijako zarucene.
Editováno 5. 6. 2024 22:09:19 uživatelem Smazaný účet 3TgPGyKVFd
5. 6. 2024 21:56:16
https://webtrh.cz/diskuse/ako-once-nut-shared-web-worker/#reply1528889
skorozacatecnik
verified
rating uzivatele
5. 6. 2024 23:27:37
Možná ti pomůže Clients.matchAll()
https://developer.mozilla.org/en-US/docs/Web/API/Clients/matchAll
Získáš všechny WindowClient objekty, poté si z nich zjisti, zda je nějaký "focusnutý" a do něj pošli pomocí postMessage notifikaci. Pokud už bude daný tab zavřený, zkus poslat notifikaci pomocí postMessage do dalšího tabu z listu.
Řeším to u sebe obráceně. Každý tab má svůj websocket. Když přijde přes websocket notifikace, některý tab se zeptá service workeru, zda tu notifikaci může zobrazit a zda už ji nezobrazil jiný tab. Pokud service worker nemá danou zprávu uloženu, pošle zpět tabu pomocí postMessage zprávu "displayNotification" a tab notifikaci zobrazí. Pokud se další tab zeptá service workeru, zda může stejnou zprávu zobrazit, service worker mu to zakáže. 
Tím se zajistí, že systémovou notifikaci zobrazí vždy jedno živé okno (tab), ale zároveň se notifikace zobrazí ve všech tabech ve stránce (jen tu v operačním systému vždy vyvolá pouze jeden tab).
5. 6. 2024 23:27:37
https://webtrh.cz/diskuse/ako-once-nut-shared-web-worker/#reply1528891
Smazaný účet 3TgPGyKVFd
verified
rating uzivatele
5. 6. 2024 23:38:58
Zajtra vyskusam. Diky.
--
Tak som to vyriesil s localStorage premennou. Proste ked pride sprava, pozriem ci je vlajka nastavena, ak ano, ignorujem ak nie, nastavim, spracujem a znovu ju zmazem. LocalStorage je zdielane takze funguje vo vsetkych taboch a prakticky ide len o to by reakcia na spravu bola dorucena cca rovnako rychlo do vsetkych tabov tak aby logika zabrala dlhsie nez dorucenie do ostatnych tabov. Nedostatok moze byt ak pride viac notifikacii po sebe a proste sa odignoruju niektore lebo sam sebe zablokujem spracovanie kedze som este neskoncil so spracovanim predoslej notifikacie.
Editováno 6. 6. 2024 02:18:36 uživatelem Smazaný účet 3TgPGyKVFd
5. 6. 2024 23:38:58
https://webtrh.cz/diskuse/ako-once-nut-shared-web-worker/#reply1528892
Smazaný účet 3TgPGyKVFd
verified
rating uzivatele
6. 6. 2024 08:49:16
Chcel som skusit tych klientov aby som ziskal pocet aktivnych okien, len tak pre info, ale Clients su dostupne len pre service workers, nie web workers. A ja service workeri nepouzivam. 
6. 6. 2024 08:49:16
https://webtrh.cz/diskuse/ako-once-nut-shared-web-worker/#reply1528896
Smazaný účet 3TgPGyKVFd
verified
rating uzivatele
6. 6. 2024 09:16:41
https://phuoc.ng/collection/html-dom/detect-if-users-open-another-tab-of-the-current-page/
Trochu off topic ale toto moze byt uzitocne na nieco podobne. Pre moj pripad to nefunguje lebo ak by som spracuval notifikacie len aktivnym oknom tak ak uzivatel deaktivuje vsetky okna(tzn je na okne inej domeny), notifikacie by sa vobec nespracuvali.
6. 6. 2024 09:16:41
https://webtrh.cz/diskuse/ako-once-nut-shared-web-worker/#reply1528900
skorozacatecnik
verified
rating uzivatele
6. 6. 2024 10:35:57
Chcel som skusit tych klientov aby som ziskal pocet aktivnych okien, len tak pre info, ale Clients su dostupne len pre service workers, nie web workers. A ja service workeri nepouzivam. 
Aha, přehlédnul jsem, ty nepoužíváš service, ale web workers.
Nevím, jak přesně to máš udělané, ale ta localStorage není nejrychlejší.. nedělá ti to problém, když máš otevřených hodně oken/tabů? Když jsem tohle před lety řešil, tak ta localStorage byla pomalá. Pokuk se do ní zapsala informace o notifikaci, tak to chvilku trvalo, než se to projevilo v ostatních tabech a občas mi to pak vyvolalo systémovou notifikaci vícekrát.
6. 6. 2024 10:35:57
https://webtrh.cz/diskuse/ako-once-nut-shared-web-worker/#reply1528903
Smazaný účet 3TgPGyKVFd
verified
rating uzivatele
6. 6. 2024 10:37:30
PS co je nesmierne blbe je ze BroadcastChannel emituje eventy a teda samotne spravy su eventy ktore len maju data pole ktore obsahuje odoslanu spravu. Lenze tieto eventy nemozno zastavit so stopPropagation(), inak by bol problem vyrieseny. Ani nie je mozne ich mutovat lebo su to duplicitne objekty. Ach jaj... javascript proste.
6. 6. 2024 10:37:30
https://webtrh.cz/diskuse/ako-once-nut-shared-web-worker/#reply1528904
Smazaný účet 3TgPGyKVFd
verified
rating uzivatele
6. 6. 2024 13:38:21
Chcel som skusit tych klientov aby som ziskal pocet aktivnych okien, len tak pre info, ale Clients su dostupne len pre service workers, nie web workers. A ja service workeri nepouzivam. 
Aha, přehlédnul jsem, ty nepoužíváš service, ale web workers.
Nevím, jak přesně to máš udělané, ale ta localStorage není nejrychlejší.. nedělá ti to problém, když máš otevřených hodně oken/tabů? Když jsem tohle před lety řešil, tak ta localStorage byla pomalá. Pokuk se do ní zapsala informace o notifikaci, tak to chvilku trvalo, než se to projevilo v ostatních tabech a občas mi to pak vyvolalo systémovou notifikaci vícekrát.
Netestoval som to nejak moc zatial. Len dva aktivne taby a sledoval som ci zareaguju oba alebo len jeden a reagoval iba jeden takze ten localstorage bol instantny - aspon taky dojem som mal. Nie som s tymto riesneim spokojny, urcite budem hladat dalsie. Napada ma presunut tu deokarcnu logiku do toho workeru, takze by sa propagovali uz plnohodnotne notifikacie a v piniii vypnut synchornizaciu notifikacii samotnych. Uvidim este ci to bude schodne riesenie.
Editováno 6. 6. 2024 13:39:41 uživatelem Smazaný účet 3TgPGyKVFd
6. 6. 2024 13:38:21
https://webtrh.cz/diskuse/ako-once-nut-shared-web-worker/#reply1528913
Smazaný účet 3TgPGyKVFd
verified
rating uzivatele
6. 6. 2024 14:37:21
Tak aktualne riesenie je nasledovne(ak by niekto riesil nieco podobne):
1. shared web worker spravi websocket spojenie
2. ked pride notifikacia, dekoruje ju
3. propaguje notifikaciu cez broadcast channel
4. klient vezme notifikaciu a pushne ju do pinia store
5. pinia je syncnuta broadcast channelom medzi zalozkami tiez, takze kontroluje ci notifikacia uz nahodou lokalne v piniii nie je a pripadne ju ignoruje. Cize ak zaloka1 dostane notifikaciu a ulozi ju do pinie, tak ked zalozka2 dostane tiez tu istu notifikaciu tak ju ignoruje ak uz ju pinia stihla duplikovat/synchronizovat skorej. Ak naopak pinia synchronizuje neskor, tak jej interny diff by mal detekovat ze stav uz je totozny.
Takze vsetko je centralizovane a potom ide len o to aby pinia sama dookola nesynchronizovala rovnaku notifikaciu medzi zalozkami, takze tam treba  zabranit duplicitam ktore tak mozu vnziknut. A to je cele. Snad to bude v produkcii fungovat podla potrieb.
Skusal som vypnut synchronizaciu notifikacii pre piniu takze klient pocuva na broadcast channeli a sam ju pushne do svojho pinia store, co je blbuvzdorne. Problem ale je ze ked sa otvori nove okno/zalozka, tak nebude mat ziadne notifikacie lebo nema synchornizovanu piniu a nenasiel som moznost ako manualne zavolat sync na konkretne pole v pinia store, ktore je ignorovane zo syncu.
Editováno 6. 6. 2024 14:40:50 uživatelem Smazaný účet 3TgPGyKVFd
6. 6. 2024 14:37:21
https://webtrh.cz/diskuse/ako-once-nut-shared-web-worker/#reply1528919
Pro odpověď se přihlašte.
Přihlásit