广播

让我们探讨如何实现实时广播以在客户端之间发送消息。

用法

您可以使用 MemFire Cloud 客户端库来发送和接收广播消息。

初始化客户端

转到 MemFire Cloud 项目的 设置-> API,获取 URL 和匿名公共 API 密钥。

1import { createClient } from '@supabase/supabase-js'
2
3const SUPABASE_URL = 'https://<project>.supabase.co'
4const SUPABASE_KEY = '<your-anon-key>'
5
6const client = createClient(SUPABASE_URL, SUPABASE_KEY)

收听广播消息

您可以为广播频道提供回调以接收消息。在此示例中,我们将在room-1 中接收任何广播消息:

1// Join a room/topic. Can be anything except for 'realtime'.
2const channelA = clientA.channel('room-1')
3
4// Simple function to log any messages we receive
5function messageReceived(payload) {
6    console.log(payload)
7}
8
9// Subscribe to the Channel
10channelA
11    .on(
12    'broadcast',
13    { event: 'test' },
14    (payload) => messageReceived(payload)
15    )
16    .subscribe()

发送广播消息

我们可以使用 channelB.send() 发送 Broadcast 消息。让我们设置另一个客户端来发送消息。

1// Join a room/topic. Can be anything except for 'realtime'.
2const channelB = clientA.channel('room-1')
3
4channelB.subscribe((status) => {
5    // Wait for successful connection
6    if (status !== 'SUBSCRIBED') {
7    return null
8    }
9
10    // Send a message once the client is subscribed
11    channelB.send({
12    type: 'broadcast',
13    event: 'test',
14    payload: { message: 'hello, world' },
15    })
16})

在发送消息之前,我们需要确保客户端已连接,我们在 subscribe() 回调中已经完成了这一点。

广播选项

您可以在初始化 MemFire Cloud 客户端时传递配置选项。

自发消息

默认情况下,广播消息仅发送到其他客户端。您可以通过将 Broadcast 的 self 参数设置为 true 将消息广播回发件人。

1    const myChannel = supabase.channel('room-2', {
2      config: {
3        broadcast: { self: true },
4      },
5    })
6
7    myChannel.on(
8      'broadcast',
9      { event: 'test-my-messages' },
10      (payload) => console.log(payload)
11    )
12
13    myChannel.subscribe((status) => {
14      if (status !== 'SUBSCRIBED') { return }
15      channelC.send({
16        type: 'broadcast',
17        event: 'test-my-messages',
18        payload: { message: 'talking to myself' },
19      })
20    })

确认消息

您可以通过将 Broadcast 的 ack config 设置为 true 来确认 Realtime 是否收到了您的消息。

1    const myChannel = clientD.channel('room-3', {
2      config: {
3        broadcast: { ack: true },
4      },
5    })
6
7    myChannel.subscribe(async (status) => {
8      if (status !== 'SUBSCRIBED') { return }
9
10      const serverResponse = await myChannel.send({
11        type: 'broadcast',
12        event: 'acknowledge',
13        payload: {},
14      })
15
16      console.log('serverResponse', serverResponse)
17    })

使用它来保证服务器在解析 channelD.send 的 promise 之前已收到消息。如果在创建通道时没有将 ack config 设置为 true,则 channelD.send 返回的 promise 将立即解析。

使用 REST 调用发送消息#

您还可以通过向实时服务器发出 HTTP 请求来发送广播消息。当您想要从服务器或客户端发送消息而无需先建立 WebSocket 连接时,这很有用。

note

目前仅在 Supabase JavaScript 客户端版本 2.37.0 及更高版本中可用。

1    const channel = client.channel('test-channel')
2
3    // No need to subscribe to channel
4
5    channel
6    .send({
7    type: 'broadcast',
8    event: 'test',
9    payload: { message: 'Hi' },
10    })
11    .then((resp) => console.log(resp))
12
13    // Remember to clean up the channel
14
15    client.removeChannel(channel)