ドキュメント

リアルタイム

アプリにライブ機能を。チャンネルの全員にメッセージを送り、誰がオンラインかを表示し、データベースの行の変更をその場で受け取れます。

← すべてのドキュメント

仕組み

  • アプリは espobase.realtime でプロジェクトの公開可能キーを使い、WebSocket接続を1本開きます。ログイン中のユーザーのアクセストークンは自動で送られ、URLに含まれることはありません。
  • チャンネルは、room-1 のようにアプリが決める名前です。プロジェクト内で同じチャンネルに参加した全員が、ブロードキャストとプレゼンスを共有します。
  • データベースの変更は、オンにしたテーブルから届きます。変更は購読者ごとにREST API経由で読み直されるため、どのユーザーがどの行を受け取るかはテーブルのセキュリティルールが決めます。

1. テーブルのリアルタイムをオンにする

ダッシュボードの左のメニューで リアルタイム を開き、テーブルをオンにします。テーブルには主キーが必要です。変更できるのは管理者とオーナーで、変更は監査ログに記録されます。

2. 行の変更を受け取る

import { createClient } from "@espobase/client";

const espobase = createClient(PROJECT_URL, PUBLISHABLE_KEY);

const room = espobase.realtime
  .channel("room-1")
  .onChange("messages", (change) => {
    // change.event: "INSERT" | "UPDATE" | "DELETE"
    // change.record: the row (INSERT, UPDATE); change.old: the primary key (DELETE)
    console.log(change.event, change.record ?? change.old);
  }, { filter: "room_id=eq.1" });

await room.join();

event は INSERT、UPDATE、DELETE、または *(既定)です。filter は column=op.value(op: eq、neq、lt、lte、gt、gte)に一致する行だけを残します。リスナーは join() の前に追加してください。

3. ブロードキャストとプレゼンス

const room = espobase.realtime
  .channel("room-1", { presence: { key: user.id } })
  .onMessage("typing", (payload) => showTyping(payload))
  .onPresence((online) => showOnline(Object.keys(online)));

await room.join();
await room.track({ name: user.name });          // who's here
await room.send("typing", { name: user.name }); // everyone else on the channel

await room.leave(); // when done

ブロードキャストは保存されません。プレゼンスの状態はクライアントごとに最大2 KBで、クライアントの切断時に自動で削除されます。

セキュリティ

  • 行の変更は行レベルセキュリティに従います。各購読者が受け取るのは、そのユーザーが読める行だけで、形もREST APIが返すものと同じです。
  • 削除では、削除された行の主キーだけが送られます(行はもう存在しないため確認できません)。削除にはフィルターは適用されません。
  • ブロードキャストとプレゼンスのチャンネルは、公開可能キーを持つ誰でも利用できます。非公開のデータはブロードキャストで送らず、セキュリティルールで守られたデータベースの変更を使ってください。
  • シークレットキーはサーバーからのみ使え(ブラウザでは不可)、すべての変更を受け取ります。

制限

  • Free: プロジェクトごとに同時接続200、メッセージは月2M。月のメッセージを使い切ると、次の請求サイクルまで新しいリアルタイム通信は拒否されます。
  • Pro: プロジェクトごとに同時接続500、メッセージは月5M。
  • Group: プロジェクトごとに同時接続1,000、メッセージは月10M。
  • メッセージとは、クライアントが受け取るもの(ブロードキャスト、プレゼンスの更新、データベースの変更)です。1メッセージは最大64 KB。クライアントは1秒あたり最大50メッセージを送信でき、最大100チャンネルに参加できます。