Skip to content
No results
  • A JSBlogról
JSBlog
  • Winben blogja
  • CSS
  • Git
  • HTTP
  • Node.js
  • Teljesítmény
  • Web API-k
  • Webbiztonság
JSBlog
  • Webbiztonság

A regex, ami megfektette a fél internetet – a V8-ban ott a gyógyszer, csak ki van kapcsolva

Diagram: balra a regex backtracking exponenciálisan szétágazó piros fája, jobbra a lineáris motor egyenes, zöld pontokból álló útja

2019-ben 27 percre megállt a fél internet egy .*.*=.* miatt. Megmértem, mit művel a katasztrofális backtracking Node alatt, és kipróbáltam a V8 kísérleti lineáris regexmotorját, ami 6,2 másodpercből 0,01 ms-ot csinál – csak épp ki van kapcsolva.

  • Szabó Benjámin
  • 2026.08.24.
  • TypeScript

Négy tagot írsz, nyolc kulcsot kapsz: a TypeScript enum boncolása

Diagram: egy négytagú TypeScript enum a fordítás után nyolc kulcsos JavaScript objektummá válik – minden taghoz egy tükörkulcs is készül a reverse mapping miatt

Az enum az egyetlen konstrukció a TypeScript magjában, ami fordítás után is ott marad a kódban. Megnéztük, mit generál pontosan, miért veszélyes a const enum publikált csomagban, és miért ad a fordító külön kapcsolót a saját feature-ének kitiltásához.

  • Szabó Benjámin
  • 2026.08.13.
  • Web API-k

A WebSocket send() sosem mond nemet – csak a memóriád fogy el

Diagram: a küldő alkalmazásból sűrűn érkező üzenetek egy túltöltött, vörösen izzó pufferben tornyosulnak, miközben a lassú fogadó felé csak vékony csepegés jut ki a hálózatra.

A send() akkor is sikeres, ha egyetlen bájt sem megy ki a hálózatra: az üzenetek esemény nélkül gyűlnek a memóriában. Megmértem, hogyan lesz ebből 566 MiB RSS, mit mondana a spec, és mit lehet tenni ma – küszöb, dobás vagy WebSocketStream.

  • Szabó Benjámin
  • 2026.08.11.
  • Adatbázis

Egyetlen NOTIFY a tranzakcióban, és 25 ezer TPS-ből lesz 1700

Diagram: felül négy párhuzamos zöld nyíl fut egyszerre az adatbázis-hengerbe, alul a négy narancssárga tranzakció közül csak egy halad át a lakattal zárt kapun, a többi szaggatott vonallal várakozik előtte

A LISTEN/NOTIFY a Postgres beépített pub/subja, és tényleg jó. Csakhogy a NOTIFY commitkor egy globális zárat fog, ami libasorba állítja a notifikáló tranzakciókat: 32 kliensnél 24 759 helyett 1708 TPS-t mértem. Megnéztem, kinek van igaza a Recall.ai és a DBOS vitájában, és mit javít a PostgreSQL 19 – és mit nem.

  • Szabó Benjámin
  • 2026.08.07.
  • Docker

Mit csinál a Docker, ha unhealthy lesz a konténered? Semmit.

Kétsávos diagram: felül egy unhealthy jelvényű Docker-konténer az idő múlásával is változatlanul fut tovább, az újraindítás áthúzva; alul egy orchestrator ütemezője az unhealthy konténert friss, egészséges példányra cseréli.

A HEALTHCHECK-től sokan önjavító konténert várnak, pedig a sima Docker az unhealthy állapotra nem reagál: nem indít újra, nem állít le, csak átszínezi a docker ps kimenetét. Kipróbáltam, ki olvassa valójában ezt a státuszt, ki cselekszik belőle, és ki az, aki soha le sem futtatja.

  • Szabó Benjámin
  • 2026.08.04.
  • Web API-k

A service workered gyorsítótáraz – és közben késlelteti a HTML-t

Folyamatábra: service worker nélkül egymás után indul a worker és a HTML-kérés, navigation preloaddal pedig a két művelet párhuzamosan fut

A service worker indulása a hálózati kérés elé állhat. A navigation preload párhuzamosítja a kettőt – de cache-first stratégiánál felesleges forgalmat is okozhat.

  • Szabó Benjámin
  • 2026.08.02.
  • Node.js

A fetch() nem a hálózatra várt: a DNS a Node négy munkaszálán áll sorban

Diagram: a libuv threadpool négy szlotja crypto-, fs- és zlib-feladatokkal foglalt, a dns.lookup a bejáratnál várakozik, míg a dns.resolve4 a c-ares könyvtárral a threadpoolt megkerülve, közvetlenül a hálózat felé megy

Négy crypto.pbkdf2() hívás, és ugyanaz a fetch() 524 ms helyett 2217 ms. A dns.lookup() ugyanis nem hálózati I/O, hanem blokkoló getaddrinfo a libuv négyszálas threadpoolján – ugyanott, ahol az fs, a crypto és a zlib dolgozik. Megmértem, mi történik, és megnéztem, mit lehet tenni ellene.

  • Szabó Benjámin
  • 2026.08.01.
  • CSS

Heti 80 millió letöltés egy tooltip miatt: megérkezett a CSS anchor positioning

Diagram a CSS anchor positioningról: bal oldalon egy gombhoz rögzített tooltip a 3×3-as position-area rács felső cellájában, jobb oldalon a viewport szélénél a fallback az áthúzott, kilógó pozíció helyett a gomb alá fordítja a buborékot

A @floating-ui/dom-ot hetente 80 milliószor töltjük le, hogy tooltipeket és dropdownokat pozicionáljunk JavaScriptből. A Firefox 147 óta mindhárom nagy böngésző tudja ugyanezt natív CSS-ből: anchor positioning, automatikus átfordulással a viewport szélén, görgetéskövetéssel, top layerrel. Megnéztem, mit tud, és hol vannak a csapdái.

  • Szabó Benjámin
  • 2026.07.31.
  • HTTP, Teljesítmény

A tömörítési defaultok ellened dolgoznak: gzip, brotli és zstd, megmérve

Illusztráció három tömörítési sávval: a gzip, a brotli és a zstd különböző méretűre tömöríti ugyanazt az adatblokkot, eltérő hosszúságú sebességjelző csíkokkal

A böngésződ 2024 óta minden kéréssel felajánlja a zstd tömörítést, idén februártól már a Safari is érti. Közben az nginx 1-es szinten gzipel, a Node brotlija alapból maximumon ég, a Cloudflare-nél pedig az Enterprise csomaghoz jár a gzip. Megmértem, mit tudnak a tömörítők – a defaultok nem a barátaid.

  • Szabó Benjámin
  • 2026.07.29.
  • JavaScript

A Set.intersection() sorrendjét a kisebb halmaz dönti el

Két halmaz átfedése, a metszet elemeit sárga pontok jelölik

A Set új halmazműveletei végre kiváltják a kézzel írt filtereket, de az intersection() sorrendjét a kisebb bemenet dönti el. Megnézzük, miért, és hogyan fér bele egy Map, miközben egy Array nem.

  • Szabó Benjámin
  • 2026.07.24.
  • Webbiztonság

A req.ip, amit a támadó tölt ki: az Express trust proxy csapdája

Diagram: az X-Forwarded-For fejléc két IP-vel; a trust proxy: true a bal szélső, kliens által írt címet választja, a trust proxy: 1 a jobb szélső, proxy által hozzáfűzött címet – ez lesz a req.ip

Bekapcsolod a trust proxy-t, mert proxy mögött vagy — és ezzel a req.ip-t a kliens X-Forwarded-For fejlécére bízod. Miért a true a legrosszabb beállítás, mit válassz helyette, és hogyan kerülhető meg vele az egész rate limited.

  • Szabó Benjámin
  • 2026.07.22.
  • Git

git bisect run: a 125-ös exit kód megment egy rossz vádlottól

Git commitgráf feleződő keresési tartományokkal, egy kihagyott és egy hibás committal

A git bisect run automatizálja a regressziókeresést, de egy buildhiba könnyen hamis bűnöst gyárt. Így használd helyesen a 125-ös kilépési kódot.

  • Szabó Benjámin
  • 2026.07.21.
  • JavaScript

A substring() nem másol: húsz karakter, ami 200 megabájtot tart életben

Diagram: fent összefűzött stringdarabokból épülő cons-fa, lent hosszú memóriasáv, amelynek kiemelt kis szeletére egy különálló slice-objektum mutat

A V8 háromféle adatszerkezetet rejt egy JavaScript-string mögé: flat, cons és sliced. Ettől a += olcsóbb, mint a régi tanácsok állítják, a substring() viszont képes 200 megabájtot életben tartani húsz karakterért. Lemértem.

  • Szabó Benjámin
  • 2026.07.16.
  • Web API-k

A true nem azt jelenti, hogy megérkezett: a sendBeacon() 64 KiB-os csapdája

Diagram a böngésző közös 64 KiB-os keepalive soráról: a sorba állítás sikeres lehet, miközben a szerveres kézbesítés még bizonytalan

A sendBeacon() true értéke csak sikeres sorba állítást jelent. A 64 KiB ráadásul közös keepalive keret – és ettől még a szerver semmit sem kapott meg biztosan.

  • Szabó Benjámin
  • 2026.07.14.
  • Node.js

Egy csomag, két példány: amikor az instanceof jogosan mond nemet

Diagram: egy npm csomag import és require ágon két külön példányként töltődik be, alul a module-sync feltétellel mindkét út ugyanabba az egy példányba fut

Ha egy npm csomag ESM-ként és CommonJS-ként is megjelenik, a Node mindkét buildet betölti: két osztály, két singleton, bukó instanceof. A dual package hazard anatómiája – és ahogy a require(esm) meg a module-sync feltétel pontot tesz a végére.

  • Szabó Benjámin
  • 2026.07.13.
  • Web API-k

A Ctrl+F kinyithatja az accordionodat: hidden=”until-found” a gyakorlatban

A böngésző keresője egy összecsukott tartalmi panelt nyit ki

A hidden="until-found" kereshetővé teszi a becsukott tartalmat, a beforematch pedig szinkronban tartja a komponenst. A dobozmodell és egy régi CSS-reset viszont könnyen elrontja.

  • Szabó Benjámin
  • 2026.07.11.
  • HTTP

A 206 nem félkész 200: Range kérések Node.js-ben

HTTP Range kérés útja a kliens, a szerver és egy nagy fájl között

A videók, PDF-ek és folytatható letöltések mögött álló HTTP Range kérés nem csak egy slice: a 206, 416, suffix range és If-Range apró részletei számítanak.

  • Szabó Benjámin
  • 2026.07.07.
  • Adatbázis

Három szám, amit félreolvasol az EXPLAIN ANALYZE kimenetéből

Diagram egy Postgres EXPLAIN ANALYZE plan fáról: a Nested Loop szülő csomópont Buffers értéke a két gyermek csomópont (Seq Scan és Index Scan) összegzett buffer- és időadataiból áll össze, az Index Scan 1639 futásának átlagideje pedig a lekérdezés futásidejének több mint felét teszi ki

Az actual time egy átlag, nem összeg, a Buffers érték felfelé gyűlik a plan fában, és a sima EXPLAIN ANALYZE nem méri a szerializációt – három valós Postgres 17-es példával.

  • Szabó Benjámin
  • 2026.07.05.
  • JavaScript

A regexed több emojit is egy karakternek nézheti: a Unicode v flag

Unicode-karakterhalmazok metszetét és több kódpontból álló emoji-sorozatot ábrázoló technikai diagram

A JavaScript Unicode v flagje halmazműveleteket és több kódpontból álló emoji-sorozatokat hoz a regexekbe. A negált property escape-eknél azonban a jelentés is változhat.

  • Szabó Benjámin
  • 2026.07.04.
  • Node.js

A process.nextTick() nem mikrotask: a Node event loop külön VIP-sora

A Node.js eseményhurkának három várakozási sora, ahol a nextTick sor megelőzi a mikro- és a normál feladatokat.

A process.nextTick() nem ugyanaz, mint egy mikrofeladat: külön Node-sora van, és egy rossz rekurzióval elnémíthatja az I/O-t.

  • Szabó Benjámin
  • 2026.07.03.
1 2 3 4
Next
Copyright © 2026 - WordPress Theme by CreativeThemes