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

supabase / supabase-flutter / 39417868719
92%

Build:
DEFAULT BRANCH: main
Ran 20 Oct 2026 11:51AM UTC
Jobs 11
Files 163
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

20 Oct 2026 11:50AM UTC coverage: 92.041% (+0.04%) from 92.0%
39417868719

push

github

web-flow
fix(realtime): do not flush a join that its channel has since resent (#1986)

Resolves SDK-2280. This checks the two Realtime races fixed in
supabase/supabase-swift#1578 and supabase/supabase-swift#1585 against
the Dart client. The tests reproduced one bug, which this PR fixes.

## Fix

**A timed out join is no longer sent after the rejoin.** Calling
`subscribe()` while the socket is down puts the join into the client's
send buffer. If the outage outlasts the join timeout, the channel
errors. Once the socket reconnects, the channel is rejoined with a new
ref, and then the buffer was flushed, so the old join went out after the
new one. Phoenix answers a second join on a topic by shutting down the
first, so the server would close the channel that just rejoined and keep
a join ref the client ignores.

The send buffer now holds the messages instead of closures. When it is
flushed, a join that no channel on its topic is waiting for is dropped.
That covers a channel that resent its join or was removed. The path that
resolves a `customAccessToken` already cleared the buffer, so only
clients without one were affected.

## Already handled

These cases from the swift PRs needed no change. Each now has a
regression test:

- After a socket drop and rejoin, an error reply, a `phx_error` or the
timeout of the original join does not affect the rejoined channel and
adds no status. Resending the join removes the old reply binding and
cancels its timer, and channel events with an old join ref are dropped.
- `connect()` returns after one failed attempt during an outage, while
the reconnect timer keeps retrying. A `subscribe()` made during the
outage reports `timedOut` after its timeout instead of hanging, and
joins once the server is back.

## Tests

- New `test/stale_join_test.dart` with the five cases above. The outage
test fails without the fix.
- The buffered push test in `socket_test.dart` now buffers a
`phx_leave`, because a bare `phx_join` with no channel behind ... (continued)

11 of 11 new or added lines in 1 file covered. (100.0%)

10177 of 11057 relevant lines covered (92.04%)

5.49 hits per line

Jobs
ID Job ID Ran Files Coverage
3 iceberg - 39417868719.3 20 Oct 2026 11:52AM UTC 6
71.32
GitHub Action Run
4 supabase_flutter - 39417868719.4 20 Oct 2026 11:52AM UTC 16
80.85
GitHub Action Run
5 supabase_auth - 39417868719.5 20 Oct 2026 11:56AM UTC 34
93.38
GitHub Action Run
6 supabase_functions - 39417868719.6 20 Oct 2026 11:51AM UTC 4
93.28
GitHub Action Run
7 postgrest - 39417868719.7 20 Oct 2026 11:54AM UTC 32
93.92
GitHub Action Run
8 supabase_storage - 39417868719.8 20 Oct 2026 11:54AM UTC 10
96.24
GitHub Action Run
9 supabase_realtime - 39417868719.9 20 Oct 2026 11:54AM UTC 14
91.17
GitHub Action Run
10 supabase_typegen - 39417868719.10 20 Oct 2026 11:52AM UTC 6
96.32
GitHub Action Run
11 supabase - 39417868719.11 20 Oct 2026 11:55AM UTC 17
94.28
GitHub Action Run
4 supabase_common - 39266875227.4 19 Oct 2026 02:14PM UTC 23
87.98
GitHub Action Run
7 yet_another_json_isolate - 39234881764.7 19 Oct 2026 10:06AM UTC 1
98.44
GitHub Action Run
Source Files on build 39417868719
  • Tree
  • List 163
  • Changed 5
  • Source Changed 2
  • Coverage Changed 5
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #39417868719
  • 4024fdb6 on github
  • Prev Build on main (#39269728642)
  • Next Build on main (#39426197275)
  • Delete
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