Skip to content

單局回放

運營商可以請求一個連結(POST /v1/operator/rounds/replay,詳見運營商文件),打開後會回放你遊戲的某一局——reels 轉動、餘額更新,順序與玩家當時看到的一致。平台負責媒合這個連結,並驗證運營商確實擁有這一局;錄製與渲染回放畫面完全是你的責任。平台從未看到你遊戲的視覺結果,只看到你提交的資金異動(BET/WIN/ROLLBACK)——沒有任何東西可以讓它拿來回放。

這代表回放支援是選配的,而且只有你加入錄製功能之後發生的局才能回放——無法回溯重建一局從未被擷取視覺資料的過程。

你需要建置什麼

  1. 錄製:在每次 spin 時,為這一局記錄一份有序的事件時間線,並用你提交交易時所用的同一個 roundId 作為鍵值。把它持久化(資料庫表、物件儲存等)——如果只存在記憶體裡,代表回放連結只在你的服務進程重啟之前有效,除非你能接受這個限制。
  2. 設定:與平台團隊為你的遊戲設定一個回放頁面基礎網址(GameSummary.replayBaseUrl)——設定方式與 launchBaseUrl 相同。若某遊戲沒有設定 replayBaseUrl,運營商請求回放連結時會收到 400
  3. 實作:在該網址上實作一個 GET 路由。它會收到一個 ?replay= 查詢參數——用 verifyReplay 解析它,用解析出的 roundId 查詢你自己儲存的資料,然後渲染一個頁面播放錄製好的時間線。

解析 token

ts
import { ProviderClient } from '@moose/provider-sdk'

const client = new ProviderClient({
  baseUrl: process.env.PLATFORM_URL!,
  tenantId: 'acme-studio',
  secret: process.env.PLATFORM_SECRET!,
})

app.get('/replay', async (req, res) => {
  const replayToken = req.query.replay as string
  let verified
  try {
    verified = await client.verifyReplay(replayToken)
  } catch (err) {
    // PlatformApiError,status 401(token 未知或已過期)或 403
    // (token 是為其他廠商鑄造的——實務上不該發生,但無論哪種情況都不該盲目信任這個 token)。
    return res.status((err as { status?: number }).status ?? 502).send('回放連結無效或已過期')
  }

  const log = await replayStore.get(verified.roundId)
  if (!log) return res.status(404).send('找不到這一局的回放')

  res.send(renderReplayPage({ roundId: verified.roundId, locale: verified.language, log }))
})

verifyReplayverifySession 一樣,是經過簽名、會自動重試的呼叫——見 ProviderClient 參考401 代表 token 未知或已超過有效期(預設 15 分鐘)——把它呈現為「此回放連結已過期」,而不是通用錯誤,因為對一個舊連結來說這是預期中的結果,不是錯誤。