Appearance
Recovery and session management
A game round persists on the server. Reloading the browser does not cancel its bets or erase its choices.
Restore before accepting a bet
Call loadConfig after connection. The SDK decompresses gameResult and previousResults with the returned configuration.
Retain these values together:
| Value | Purpose |
|---|---|
gameResult | Last authoritative scenario and engine state. |
gameRoundInfo | Round hash, status, stake, mode, and currency. |
amountToCollect | Outstanding amount, when supplied. |
previousResults | Earlier recorded results for reconstruction. Entries can lack usable engine results. |
balance | Current wallet display. |
freePlaysAvailable | Current ticket availability. |
config.progressionCounterValues | Persisted counters. Use the current result for counters inside an open round. |
Do not infer the current game from the last frame cached by the frontend. Do not replay old requests to reconstruct it.
Recovery decision table
Apply the table in this order after restoring the visible state. The slot controller implements these guards.
| Returned state | Frontend action |
|---|---|
Unknown or transitional round status, such as closing or stranded, or any value your integration does not recognise | Keep bets disabled. Reconcile or show a support action. |
Closed round with contradictory inProgress or canCollect | Treat the reply as inconsistent. Do not start another round. |
| Open round without a usable result | Keep bets disabled. Read history or request integration support. |
canCollect: true | Present collection. Present only permitted current choices or continuations. |
Nonempty playerChoice | Present the original indexed options. Wait for player input. |
inProgress: true, without a decision | For slots, resume the next free continuation without a stake. |
| Closed or completed state, without an outstanding amount | Finish any required presentation. Enable a new round after timing and operator gates. |
| Outstanding money without an offered action | Reconcile. Do not invent a collect request from the amount alone. |
For Blackjack, use scenario.availableActions. For Mines, wait for a tile choice. For Crash, rejoin its live round. Those verticals must not use a slot continuation loop.
Reconstruct slot presentation
Restore the board, feature name, run identifier, remaining spins, sticky symbols, Hold and Win state, counters, and gamble state. Read slot responses.
Use engineData.baseStake for a bought round. Restore engineData.buyFeatureId for purchase attribution. Use engineData.bankedWin and ladderState when present.
Use earlier results only for presentation that requires history. Filter out missing results. Do not add their totalWin values together. Suppress duplicate feature-award notifications, session ledger entries, and wallet credits.
A result has already happened when the server returns it. Replaying its animation must not place its bet again.
Lost replies and duplicate requests
Allow one money request at a time per session. Set the lock before any await. Keep the lock through result presentation and required reporting.
A timeout can happen after the server commits a bet. A transport request identifier does not make a bet idempotent. The SDK exposes no general idempotency key for placeBet or collect.
After an uncertain result:
- Stop autoplay and new input.
- Keep the last confirmed state visible with a recovery message.
- Restore the connection if needed.
- Call
loadConfigto discover the server state. - Apply the recovery table. Resolve closed outcomes through history when necessary.
- Require a new player action before starting another paid round.
Do not automatically resend the original stake, buy, gamble choice, tile pick, or collect amount. See errors.
Refresh
Use the returned refreshURL as supplied. SDK refresh(refreshURL) returns a new connection object, including a fresh tokenData. It narrows the reply exactly as login() does. See what login() does not return.
Wait for any in-flight money request before changing credentials. Replace the token and all returned URLs together. Reapply returned settings. Rebuild permitted stakes and action gates. Close the old socket before opening the new one.
Call loadConfig again. Preserve the session timer, reality-check offset, and net-position accounting. Do not convert an expired request into a new paid bet.
Honor refreshDisabled and operator navigation requirements. A reload request is not permission to create a new launch token or bypass an expired session.
Exit and inactivity
Use Operator Interface quit(), history(), or cashier() when the wrapper owns navigation. Otherwise use the supplied URL and redirectTarget. Honor preventRedirect.
The SDK has no logout helper. If your integration requires logout, follow the supplied logout URL contract. Do not append a guessed route or revoke a session from an unload handler.
sessionTimeoutInSeconds measures inactivity in seconds. Use real player activity, not reel ticks or network polling, to reset the activity timer. Stop new play when the interval expires. Follow the operator's session-expiry flow.
Closing a page can leave a round open for resumption or server auto-close. Describe that behavior in the rules. Do not issue a speculative bet or cashout in beforeunload.
Reporting animation completion
SDK reportAnimationEnd and Operator Interface spinAnimationStopped are separate signals. One goes to the RGS. The other goes to the wrapper.
When gameSettings.reportAnimationEnd is true, send the SDK report after the required presentation finishes. Check its response before enabling another action. Do not report when the response first arrives.
A restored completed result does not automatically require a duplicate report. Determine outstanding reporting from the operator's resume contract. Keep a reporting failure separate from a failed wager. Never repeat the wager to repair its report.