KUMODeck
EN

リアルタイムの部屋

リアルタイムの部屋(チャンネル)は、名前の付いた部屋の中で、メッセージを中にいる全員へ即座に届ける通り道です。チームの作業部屋、ライブイベント、問い合わせの窓口、ゲームならロビー・パーティー・対戦などに使えます。文字のメッセージ、スタンプ、入力中の表示、「準備OK」の合図、その場のお知らせなどは、この上に作ります。マルチプレイのルームと同じ接続を使い、ONにするまではOFFです。

kumodeck features on realtimeChannels
kumodeck config push --env development

KUMODeckはメッセージを保存しません。 メッセージは部屋にいる人へ届けたら捨てます。データベースにも、本文のログにも残さず、録音もしません。履歴を残したいアプリは、自分のFunctionsとデータベースに保存します(履歴を残すを参照)。

入る・送る#

const ch = await kumo.realtime.join('lobby');            // 入る。「@」の無い部屋は最初に入った時にできる
ch.on('message', ({ from, type, data, at }) => { … });   // from = 送った人のプレイヤーID(自分のサーバーからは 'server')
ch.send('msg', { text: 'hi' });                          // 部屋にいるほかの全員へ
ch.members;                                              // [{ id, displayName, anonymous }]
await ch.leave();

sendは送りっぱなしで使えます。awaitするとmuted、send_forbidden、rate_limited、payload_too_largeが分かります。fromはサーバーがログインから付けるので、利用者(API の名前では players = プレイヤー)がほかの人のプレイヤーIDで送ることはできません。表示名は別の話です(安全のための決まりを参照)。

イベント中身
message{ from, type, data, at }(at = サーバーの時刻、ミリ秒)
playerJoined / playerLeft入った人 / { playerId, reason: 'left' | 'disconnected' | 'kicked' | 'banned' | 'time_limit' }
self{ canSend, mutedUntil } — 自分がミュートされた・解除された・送れるようになった
closed{ reason } — left、kicked、banned、deleted、time_limit、unavailable、connection_lost、replaced、unauthorized

kumo.realtime.channelsで入っている部屋の一覧、kumo.realtime.on('connection', …)で接続の状態が分かります。接続が切れるとSDKがつなぎ直して同じ部屋に入り直します。切れていた間のメッセージは届きません。

部屋の種類#

名前できかた持ち主入れる人 / 送れる人
@無し(lobby、team-12)最初に入った利用者なし誰でも / 誰でも
@…、利用者が作るkumo.realtime.create({ join, send, maxMembers })作った人'anyone'か'invited'(持ち主の名簿)
@…、自分のサーバーが用意するPUT /v1/realtime/channels/@…(秘密鍵)なし自分の名簿(allow、speakers)。プレイヤーIDの無い人にもopenにできる

@で始まる部屋は、入ろうとしただけでは作られません。無ければchannel_not_foundになります。

const party = await kumo.realtime.create({ join: 'invited' });   // 名前は自動で付く。party.name を友だちに渡す
await party.invite(playerId);
// 持ち主はほかに: uninvite、allowSend / disallowSend、mute(id, { seconds })、unmute、kick、ban、unban

声でも話せるようにするには、voice: trueを付けて部屋を作ります(100人まで。9人以上は中継サーバーを通す)。音声通話を参照してください。

自分のサーバーから(秘密鍵)#

自分のサーバー(たとえばFunctions)から、秘密鍵で部屋を用意する・部屋で話す・ミュート / キック / BANすることができます。委任トークンでは使えません。

本文応答
PUT /v1/realtime/channels/:name(@の名前){ join?, send?, open?, maxMembers?, allow?, speakers? }設定、名簿、今いる人
GET /v1/realtime/channels/:name—同じもの(メッセージの本文はありません)
DELETE /v1/realtime/channels/:name—{ deleted: true }
POST /v1/realtime/channels/:name/messages{ type, data? }{ delivered } — from: 'server'で届く
POST /v1/realtime/channels/:name/moderate{ op, playerId, seconds? }{} — opは持ち主と同じ

安全のための決まり#

  • 既定では全員にプレイヤーIDがあります。 SDKがゲストとして自動でログインさせるので、ミュート・キック・BAN・送信の上限が1人ずつ効きます。
  • 開いた部屋は上限が厳しくなります。 プレイヤーIDの無い人が入れるのは、自分のサーバーがopenにした部屋だけです。そこでは上限が自動で厳しくなります(人数、メッセージの大きさ、送れる回数、1回30分まで)。IDの無い人は、つなぎ直すと別人になれるためです。
  • 部屋の持ち主が部屋の秩序を守ります。 部屋を作った利用者は、その部屋でミュート・キック・BANができます。自分のサーバーはどの部屋でも同じことができます。アプリからBANした利用者は、どの部屋にも入れません。
  • 表示名は誰かの証明になりません。証明になるのはプレイヤーIDです。 表示名は重複できます。誰でも「運営」や部屋の持ち主と同じ名前を付けられます。持ち主や運営の印は、表示名ではなくID(ownerId、自分のサーバーに置いたIDの一覧、自分のサーバーからのメッセージならfrom === 'server')で出してください。
  • KUMODeckは発言を録音も保存もしません。 持つのは部屋の設定、名簿、今いる人だけです。
  • 発言の中身の見張りは、クリエイターの責任です。 決まり(文字数、禁止語、誰が話せるか)を決め、困った発言があればすぐにミュート・キック・BANできるようにしておいてください。

上限#

プレイヤーIDあり開いた部屋 / IDなし
1部屋の人数(既定 / 最大)200 / 1,00050 / 50
メッセージの大きさ(data)4 KB1 KB
1人の送信毎秒10(瞬間20)毎秒1(瞬間3)
部屋全体の送信毎秒50(瞬間100)毎秒10(瞬間20)
部屋にいられる時間制限なし30分(time_limit)
1接続で入れる部屋82

自分のサーバーからは、鍵ごとに1分あたり送信600回、そのほか(用意・ミュート・キック・BAN)300回までです。

履歴を残す#

テンプレートから作った新しいプロジェクトには、AIエージェント用のチャットの Skill(レシピ)が.claude/skills/chat/に入っています。エージェントに「履歴付きのロビーのチャットを付けて」と頼むと、いくつか質問(どの部屋か、メッセージをどう確かめるか、文字数・回数・禁止語)をしてから、自分のFunctionsとデータベースにコードを足します。保存の前に自分のサーバーがplayers.verifyで送った人を確かめるので、保存されるプレイヤーIDはいつも本当に送った人です。部屋にも先に確かめるので、部屋でミュート・BANされた人(部屋にいない人)は、自分のサーバー経由でも書き込めません。コードもデータも自分のものです。

料金#

マルチプレイのルームと同じく原価どおりです(上乗せなし)。誰かがずっと話している部屋で1時間あたり約0.6セント(人数によらずほぼ同じ)、静かな部屋はほぼかかりません。