Broadcast
Broadcast follows the publish-subscribe pattern where a client publishes messages to a channel with a unique identifier. For example, a user could send a message to a channel with id room-1
.
Other clients can elect to receive the message in real-time by subscribing to the channel with id room-1
. If these clients are online and subscribed then they will receive the message.
Broadcast works by connecting your client to the nearest Realtime server, which will communicate with other servers to relay messages to other clients.
A common use-case is sharing a user's cursor position with other clients in an online game.
Listen to Messages#
You can get started with Broadcast by creating a client and listening to a channel's messages:
_10const { createClient } = require('@supabase/supabase-js')_10_10const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY)_10_10const channel = supabase.channel('test')_10_10channel.on('broadcast', { event: 'supa' }, (payload) => console.log(payload)).subscribe()
Send Messages#
You can create another client and send messages to other clients:
_15const { createClient } = require('@supabase/supabase-js')_15_15const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY)_15_15const channel = supabase.channel('test')_15_15channel.subscribe((status) => {_15 if (status === 'SUBSCRIBED') {_15 channel.send({_15 type: 'broadcast',_15 event: 'supa',_15 payload: { org: 'supabase' },_15 })_15 }_15})
In order for clients to successfully send and receive mesages to one another, they must both specify the same event
.
We recommend that the client has successfully subscribed to the channel prior to sending messages.
Self-Send Messages#
You can also choose for a client to receive messages that it sent:
_20// Supabase client setup_20const channel = supabase.channel('test', {_20 config: {_20 broadcast: {_20 self: true,_20 },_20 },_20})_20_20channel_20 .on('broadcast', { event: 'supa' }, (payload) => console.log(payload))_20 .subscribe((status) => {_20 if (status === 'SUBSCRIBED') {_20 channel.send({_20 type: 'broadcast',_20 event: 'supa',_20 payload: { org: 'supabase' },_20 })_20 }_20 })
Acknowledge Messages#
You can ensure that Realtime's servers received your message by:
_18// Supabase client setup_18_18const channel = supabase.channel('receipt', {_18 config: {_18 broadcast: { ack: true },_18 },_18})_18_18channel.subscribe(async (status) => {_18 if (status === 'SUBSCRIBED') {_18 const resp = await channel.send({_18 type: 'broadcast',_18 event: 'latency',_18 payload: {},_18 })_18 console.log(resp)_18 }_18})
If ack
is not set to true
, Realtime servers will not acknowledge that it received the sent message and send
promise resolves immediately.
Client-Side Rate Limit#
There is a default client-side rate limit that enables you to send 10 messages per second, or one message every 100 milliseconds. You can customize this when creating the client:
_12const { createClient } = require('@supabase/supabase-js')_12_12const supabase = createClient(_12 process.env.SUPABASE_URL,_12 process.env.SUPABASE_KEY,_12 {_12 realtime: {_12 params: {_12 eventsPerSecond: 20_12 }_12 }_12 }
By setting eventsPerSecond
to 20, you can send one message every 50 milliseconds on a per client basis.
Learn more by visiting the Quotas section.