Commit 5ceb1bd
authored
Fix hx-sse reader-cancel race that produces an unhandled rejection (#3935)
Fix reader-cancel race in hx-sse.js
parseSSE's `finally` released the reader's lock, but `connection.reader`
was only nulled one microtask later (via the for-await-of loop's
async-generator close protocol). Any concurrent `connection.reader.cancel()`
call (pauseOnBackground's visibilitychange handler, or cleanup()) landing in
that one-microtask window canceled an already-released reader, which per the
Streams spec rejects instead of throwing synchronously -- surfacing as an
unhandled promise rejection.
Fix: pass `connection` into parseSSE and null `connection.reader` in the
same synchronous finally block as releaseLock(), closing the window instead
of guarding each call site.
Includes a regression test that deterministically lands in the race window
by chaining the concurrent cancel trigger off the same promise the internal
`await reader.read()` is waiting on.1 parent 243d4b1 commit 5ceb1bd
2 files changed
Lines changed: 53 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | | - | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
36 | 38 | | |
37 | 39 | | |
38 | 40 | | |
| |||
100 | 102 | | |
101 | 103 | | |
102 | 104 | | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
103 | 108 | | |
104 | 109 | | |
105 | 110 | | |
| |||
241 | 246 | | |
242 | 247 | | |
243 | 248 | | |
244 | | - | |
| 249 | + | |
245 | 250 | | |
246 | 251 | | |
247 | 252 | | |
| |||
285 | 290 | | |
286 | 291 | | |
287 | 292 | | |
288 | | - | |
289 | 293 | | |
290 | 294 | | |
291 | 295 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
591 | 591 | | |
592 | 592 | | |
593 | 593 | | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
594 | 640 | | |
595 | 641 | | |
596 | 642 | | |
| |||
0 commit comments