本文へ移動
ドキュメント

同期

Live で Five SDK 状態、ルームのユーザー、ブロードキャスト、ライフサイクルを同期します。

Markdown を表示
このページの内容

Live はキーフレーム、ルームデータ、ブロードキャストで状態を同期します。Yjs で保持するため、各キーは他クライアントへ冪等に適用できる JSON シリアライズ可能な状態にします。

キーフレーム

ローカル変更には live.sendKeyframe(key, frame)、遠隔更新には live.keyframes.on(key, callback) を使います。

five.on('stateChange', (state, userAction) => {
  if (!userAction || live.state !== LiveState.OPEN) return

  live.sendKeyframe('FiveState', state)
})

live.keyframes.on('FiveState', (nextState, prevState, frontRequestId) => {
  five.setState(nextState, false, false)
})

遠隔 Five 状態の適用時は userAction = false 相当を指定し、同じフレームをルームに送り返さないようにします。

スナップショットを読む

live.snapshot は現在の部分スナップショットを返します。1 キーの取得には live.getFramesByKey(key) と live.getSnapshotForKey(key) を使います。

const snapshot = live.snapshot
const fiveState = live.getFramesByKey('FiveState')

ルームとユーザーの状態

接続後はルームとユーザー情報を取得できます:

live.selfInfo
live.userList
live.roomInfo

await live.setSelfInfo({
  extension: {
    displayName: 'Alex',
    role: 'host',
  },
})

live.on('selfInfoUpdate', (userInfo, frontRequestId) => {})
live.on('userListUpdate', (userList, frontRequestId) => {})

UserInfo の権限項目はサービスが提供します。他ユーザーのマイク・同期状態・参加状態などホスト専用の操作前に権限を確認してください。

ブロードキャスト

永続キーフレームではない独自のルームイベントに使います。

type Ping = { type: 'ping'; sentAt: number }
type Pong = { ok: true; receivedAt: number }

const response = await live.broadcast<Ping, Pong>(
  { type: 'ping', sentAt: Date.now() },
  ['user-id-1'],
  5000
)

live.on('broadcast', (data, frontRequestId) => {
  console.log(data, frontRequestId)
})

全員に配信する場合は空の宛先配列を渡します。timeout 0 は無期限の応答待ちを許容できる場合だけ使います。

ライフサイクルのイベント

LiveState.OPEN が送信可能の状態です。0.7.6 は以下を公開します:

状態意味
LiveState.NOTINITIALIZEDまだ接続していません。
LiveState.CONNECTINGWebSocket を接続中。
LiveState.OPENメッセージ交換が可能。
LiveState.CLOSED切断または接続失敗。

live.on('stateChange', callback) で購読します。

live.on('stateChange', (state, prevState) => {
  if (state === LiveState.OPEN) {
    console.info('Live room ready')
  }
})

0.7.6 の readyKeyframeSync は非推奨です。同期準備と更新には keyframes または live.keyframes.on(key, ...) を使います。

退出と終了

参加者の退出は live.exit()、オーナーのルーム終了は live.close() を使います。live.dispose() は購読、RTC リソース、内部 Yjs 文書を破棄します。