Bug report
Describe the bug
We've been encountering a lot of inconsistent race condition-like behavior around Realtime Postgres changes, and after digging through the websockets messages for a while I think I've found out the reason: When multiple subscriptions with different channel names should both receive a message for the same table row, only the most recently created subscription does.
This seems to only be an issue in the hosted environments. In local dev, every channel gets the message, as expected.
To Reproduce
- Set up multiple Realtime Postgres changes subscriptions to the same table, with different channel names and different but overlapping filters (i.e.
column_a=in.(A,B,C), column_a=in.(B,C,D), column_a=in.(D,E,F)).
- Make a change in that table that should trigger multiple subscriptions (i.e., update a row that has
column_a set to D).
- See that on the hosted environments, only one channel gets the websocket update message.
Expected behavior
All channels with subscriptions get the message.
Screenshots
Local dev:
Hosted Supabase environment:
This is with identical table changes in the same version of the web app running both places.
System information
- OS: n/a
- Browser (if applies): Chrome 140.0.7339.80
- Version of supabase-js: 2.56.0
- Version of Node.js: 22.x (Vercel)