Broadcast
Get up and running with Realtime's Broadcast feature
Realtime Broadcast follows the publish-subscribe pattern where a client publishes messages to a channel based on a unique topic. For example, a user could send a message to a channel with topic room-1
.
Other clients can receive the message in real-time by subscribing to the channel with topic room-1
. These clients can continue to receive messages as long as they continue to be online and subscribed to the same channel topic.
An example use-case is sharing a user's cursor position with other clients in an online tool or game.
Quick start#
Let's explore how to implement Realtime Broadcast so you can integrate it into your use case.
Install the client
Install the Supabase JavaScript client.
_10 npm install @supabase/supabase-js
Create the first client
This client will be used to listen for messages.
Go to your Supabase project's API Settings and grab the URL
and anon
public API key.
_10 import {_10 createClient_10 } from '@supabase/supabase-js'_10_10 const clientA = createClient(_10 'https://<project>.supabase.co',_10 '<your-anon-key>'_10 )
Create a channel
A channel's topic can be anything except for 'realtime'
.
_10 const channelA = clientA.channel('room-1')
Listen for messages
Specify the Broadcast event you want the on
handler to listen for. This event name can be anything you want. We'll send a broadcast message with this event name later on.
_10 channelA_10 .on(_10 'broadcast',_10 { event: 'test' },_10 (payload) => console.log(payload)_10 )_10 .subscribe()
Create the second client
This client will be used to send a message.
_10 const clientB = createClient(_10 'https://<project>.supabase.co',_10 '<your-anon-key>'_10 )
Create another channel
This channel's topic must match channelA
's.
_10 const channelB = clientB.channel('room-1')
Send message
Subscribe to channel and send a message.
The payload's event
must match channelA's event
in the on
handler.
_11 channelB.subscribe((status) => {_11 if (status === 'SUBSCRIBED') {_11 channelB.send({_11 type: 'broadcast',_11 event: 'test',_11 payload: {_11 message: 'hello, world'_11 },_11 })_11 }_11 })
First client receives message
clientA
receives the message clientB
sent.
Broadcast options#
There are additional Broadcast functionality that you can enable when creating a channel.
Self-send messages#
You can have a client broadcast a message and then receive the same message by setting Broadcast's self
config to true
. Without this, broadcast messages are only sent to other clients.
_19const channelC = clientC.channel('room-2', {_19 config: {_19 broadcast: {_19 self: true,_19 },_19 },_19})_19_19channelC.on('broadcast', { event: 'test-my-messages' }, (payload) => console.log(payload))_19_19channelC.subscribe((status) => {_19 if (status === 'SUBSCRIBED') {_19 channelC.send({_19 type: 'broadcast',_19 event: 'test-my-messages',_19 payload: { message: 'talking to myself' },_19 })_19 }_19})
Acknowledge messages#
You can confirm that Realtime received your message by setting Broadcast's ack
config to true
.
_19const channelD = clientD.channel('room-3', {_19 config: {_19 broadcast: {_19 ack: true,_19 },_19 },_19})_19_19channelD.subscribe(async (status) => {_19 if (status === 'SUBSCRIBED') {_19 const resp = await channelD.send({_19 type: 'broadcast',_19 event: 'acknowledge',_19 payload: {},_19 })_19_19 console.log('resp', resp)_19 }_19})
Use this to guarantee that the server has received the message before resolving channelD.send
's promise. If the ack
config is not set to true
when creating the channel, the promise returned by channelD.send
will resolve immediately.
Client-side rate limit#
By default the client will rate limit itself at 10 messages per second (1 message every 100 milliseconds). You can customize this when creating the client:
_10import { createClient } from '@supabase/supabase-js'_10_10const clientE = createClient('https://<project>.supabase.co', '<your-anon-key>', {_10 realtime: {_10 params: {_10 eventsPerSecond: 20,_10 },_10 },_10})
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.