• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

supabase / supabase-swift / 41199448491
95%

Build:
DEFAULT BRANCH: main
Ran 31 Oct 2026 12:11PM UTC
Jobs 1
Files 194
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

31 Oct 2026 12:03PM UTC coverage: 94.13% (+0.07%) from 94.059%
41199448491

push

github

web-flow
fix(realtime): don't rejoin a channel the caller unsubscribed across a reconnect (#1601)

* fix(realtime): don't rejoin a channel the caller unsubscribed across a reconnect

A channel whose unsubscribe() waited for the server's phx_close when the
socket was lost was reset and subscribed again by rejoinChannels(). The
removal then unmapped it while its new phx_join was on the new socket, so
the stray join never saw its reply and retried, and the server's
duplicate-join close took down the topic's next channel. On 2.55.3 that
stray join also went out without a join_ref.

resetForReconnect() now reports whether the channel should rejoin: not
once the caller's latest request was unsubscribe(). A pending unsubscribe
still ends at the reset. unsubscribe() sets the flag again after its
socket probe, so a subscribe() during the probe cannot leave it stale.
runUnsubscribe clears joinRef and fails pending pushes only while it
still owns the state, so it cannot strand a newer subscribe's join.

removeChannel(_:) and removeAllChannels() now unsubscribe every channel
that is not already unsubscribed, not only a subscribed one, so removing
a channel whose join is in flight stops that join instead of leaving it
retrying while unmapped.

Behavior change: a channel that was unsubscribe()d but not removed is no
longer resubscribed by a reconnect.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(realtime): reset and start the rejoin in one channel turn

rejoinChannels() reset each channel and then subscribed it in a second
hop onto the channel. An unsubscribe() or removeChannel(_:) that ran
between the two found an .unsubscribed channel and did nothing, so the
removal unmapped it; the rejoin's subscribe then cleared the flag and
joined the unmapped channel anyway.

rejoinChannels() now calls rejoinAfterReconnect(), which resets the
channel and, if it should rejoin, moves it into .subscribing before any
suspension point. A later unsubscribe or removal find... (continued)

63 of 63 new or added lines in 4 files covered. (100.0%)

13711 of 14566 relevant lines covered (94.13%)

591706.09 hits per line

Jobs
ID Job ID Ran Files Coverage
1 41199448491.1 31 Oct 2026 12:11PM UTC 194
94.13
GitHub Action Run
Source Files on build 41199448491
  • Tree
  • List 194
  • Changed 4
  • Source Changed 4
  • Coverage Changed 4
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #41199448491
  • 7567bd1b on github
  • Prev Build on main (#41112873512)
  • Next Build on main (#41200637803)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc