單局回放
運營商可以請求一個連結(POST /v1/operator/rounds/replay,詳見運營商文件),打開後會回放你遊戲的某一局——reels 轉動、餘額更新,順序與玩家當時看到的一致。平台負責媒合這個連結,並驗證運營商確實擁有這一局;錄製與渲染回放畫面完全是你的責任。平台從未看到你遊戲的視覺結果,只看到你提交的資金異動(BET/WIN/ROLLBACK)——沒有任何東西可以讓它拿來回放。
這代表回放支援是選配的,而且只有你加入錄製功能之後發生的局才能回放——無法回溯重建一局從未被擷取視覺資料的過程。
你需要建置什麼
- 錄製:在每次 spin 時,為這一局記錄一份有序的事件時間線,並用你提交交易時所用的同一個
roundId作為鍵值。把它持久化(資料庫表、物件儲存等)——如果只存在記憶體裡,代表回放連結只在你的服務進程重啟之前有效,除非你能接受這個限制。 - 設定:與平台團隊為你的遊戲設定一個回放頁面基礎網址(
GameSummary.replayBaseUrl)——設定方式與launchBaseUrl相同。若某遊戲沒有設定replayBaseUrl,運營商請求回放連結時會收到400。 - 實作:在該網址上實作一個
GET路由。它會收到一個?replay=查詢參數——用verifyReplay解析它,用解析出的roundId查詢你自己儲存的資料,然後渲染一個頁面播放錄製好的時間線。
解析 token
ts
import { ProviderClient } from '@moosehq/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 }))
})verifyReplay 和 verifySession 一樣,是經過簽名、會自動重試的呼叫——見 ProviderClient 參考。401 代表 token 未知或已超過有效期(預設 15 分鐘)——把它呈現為「此回放連結已過期」,而不是通用錯誤,因為對一個舊連結來說這是預期中的結果,不是錯誤。