リアルタイム
アプリにライブ機能を。チャンネルの全員にメッセージを送り、誰がオンラインかを表示し、データベースの行の変更をその場で受け取れます。
仕組み
- アプリは
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チャンネルに参加できます。