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

supabase / supabase-swift / 41058365166
96%

Build:
DEFAULT BRANCH: main
Ran 30 Oct 2026 12:57PM UTC
Jobs 1
Files 193
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

30 Oct 2026 12:50PM UTC coverage: 94.05% (+0.05%) from 94.003%
41058365166

push

github

web-flow
feat(supabase): live query stream(_:where:) and LiveQuery observable (#1671)

* feat(supabase): live query stream(_:where:) and LiveQuery observable

Add SupabaseClient.stream(_:where:), an AsyncThrowingStream of the full
current rows of a keyed relation, and LiveQuery, a main-actor
@Observable wrapper for iOS 17+. Both are @_spi(Experimental).

Each query opens a dedicated channel, subscribes, then fetches; changes
that arrive during the fetch apply on top of it by primary key, and a
change older than the last one applied to its row is skipped. The query
fetches again after .resubscribed. A filtered query also binds every
DELETE, because Realtime cannot filter deletes.

Realtime gains a package postgresChangesSignals(bindings:) stream that
delivers changes, channel events and status changes in the order the
channel received them, so a change from before a rejoin cannot land on
top of the data fetched after it.

Fixes SDK-2113

* test(supabase): use a hand-written keyed relation fixture in LiveQueryTests

SupabaseTests no longer depends on PostgrestMacros, so the @Table
fixture did not build. Write the relation out like RealtimeTodo does.

* fix(supabase): reject a live query row without its primary key

A relation whose selectString leaves out a key column gave every fetched
row the key [null], so no change could match it: updates were appended
as new rows and deletes did nothing. The fetch now throws a decoding
error that names the column.

Also cover the rows mapping of stream(_:where:), changes of another
kind, and the LiveQuery convenience init.

* fix(supabase): apply a primary key change to the row under the old key

An update that changed the primary key was keyed only by its new record,
so the row under the old key stayed and a later stale change to the old
key could pass the commit_timestamp check. The update now replaces the
old-key row in place and records its timestamp for both keys, and is
skipped when it is older than the last change to... (continued)

343 of 355 new or added lines in 6 files covered. (96.62%)

4 existing lines in 2 files now uncovered.

13656 of 14520 relevant lines covered (94.05%)

580816.85 hits per line

Uncovered Changes

Lines Coverage ∆ File
10
89.9
Sources/Supabase/SupabaseClient+Stream.swift
2
98.86
Sources/Supabase/LiveQueryEngine.swift

Coverage Regressions

Lines Coverage ∆ File
3
97.35
-2.65% Sources/Helpers/JSONValue/JSONValue.swift
1
98.56
-0.29% Sources/Auth/Internal/SessionStore.swift
Jobs
ID Job ID Ran Files Coverage
1 41058365166.1 30 Oct 2026 12:57PM UTC 193
94.05
GitHub Action Run
Source Files on build 41058365166
  • Tree
  • List 193
  • Changed 7
  • Source Changed 4
  • Coverage Changed 6
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #41058365166
  • fc193605 on github
  • Prev Build on main (#41051547105)
  • Next Build on main (#41059963376)
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