Skip to content

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:

ValuePurpose
gameResultLast authoritative scenario and engine state.
gameRoundInfoRound hash, status, stake, mode, and currency.
amountToCollectOutstanding amount, when supplied.
previousResultsEarlier recorded results for reconstruction. Entries can lack usable engine results.
balanceCurrent wallet display.
freePlaysAvailableCurrent ticket availability.
config.progressionCounterValuesPersisted 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 stateFrontend action
Unknown or transitional round status, such as closing or stranded, or any value your integration does not recogniseKeep bets disabled. Reconcile or show a support action.
Closed round with contradictory inProgress or canCollectTreat the reply as inconsistent. Do not start another round.
Open round without a usable resultKeep bets disabled. Read history or request integration support.
canCollect: truePresent collection. Present only permitted current choices or continuations.
Nonempty playerChoicePresent the original indexed options. Wait for player input.
inProgress: true, without a decisionFor slots, resume the next free continuation without a stake.
Closed or completed state, without an outstanding amountFinish any required presentation. Enable a new round after timing and operator gates.
Outstanding money without an offered actionReconcile. 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:

  1. Stop autoplay and new input.
  2. Keep the last confirmed state visible with a recovery message.
  3. Restore the connection if needed.
  4. Call loadConfig to discover the server state.
  5. Apply the recovery table. Resolve closed outcomes through history when necessary.
  6. 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.