@energy8platform/platform-core 0.19.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +238 -1
  2. package/dist/dev-bridge.cjs.js +104 -0
  3. package/dist/dev-bridge.cjs.js.map +1 -1
  4. package/dist/dev-bridge.d.ts +64 -1
  5. package/dist/dev-bridge.esm.js +104 -0
  6. package/dist/dev-bridge.esm.js.map +1 -1
  7. package/dist/index.cjs.js +2053 -0
  8. package/dist/index.cjs.js.map +1 -1
  9. package/dist/index.d.ts +372 -2
  10. package/dist/index.esm.js +2051 -1
  11. package/dist/index.esm.js.map +1 -1
  12. package/dist/shell.cjs.js +1993 -0
  13. package/dist/shell.cjs.js.map +1 -0
  14. package/dist/shell.d.ts +320 -0
  15. package/dist/shell.esm.js +1989 -0
  16. package/dist/shell.esm.js.map +1 -0
  17. package/package.json +7 -2
  18. package/scripts/build-shell-font.mjs +64 -0
  19. package/src/PlatformSession.ts +10 -0
  20. package/src/dev-bridge/DevBridge.ts +160 -2
  21. package/src/dev-bridge/index.ts +1 -1
  22. package/src/index.ts +17 -1
  23. package/src/shell/GameShell.ts +294 -0
  24. package/src/shell/INTER-LICENSE.txt +93 -0
  25. package/src/shell/colors.ts +32 -0
  26. package/src/shell/components/BottomBar.ts +217 -0
  27. package/src/shell/components/BuyBonus.ts +163 -0
  28. package/src/shell/components/GameInfo.ts +253 -0
  29. package/src/shell/components/Modal.ts +36 -0
  30. package/src/shell/components/ReplayModal.ts +56 -0
  31. package/src/shell/components/Settings.ts +60 -0
  32. package/src/shell/components/icons.ts +40 -0
  33. package/src/shell/components/pickers.ts +76 -0
  34. package/src/shell/components/primitives.ts +84 -0
  35. package/src/shell/fonts.ts +13 -0
  36. package/src/shell/format.ts +36 -0
  37. package/src/shell/i18n.ts +67 -0
  38. package/src/shell/index.ts +20 -0
  39. package/src/shell/motion.ts +43 -0
  40. package/src/shell/shell.css.ts +371 -0
  41. package/src/shell/state.ts +30 -0
  42. package/src/shell/theme.ts +56 -0
  43. package/src/shell/types.ts +191 -0
package/README.md CHANGED
@@ -21,6 +21,7 @@ If you want the full PixiJS engine on top of this, install [`@energy8platform/ga
21
21
  - [Vite Plugins](#vite-plugins)
22
22
  - [Asset Manifest type](#asset-manifest-type)
23
23
  - [Pairing with another renderer](#pairing-with-another-renderer)
24
+ - [Branded Game Shell](#branded-game-shell)
24
25
  - [Sub-path exports](#sub-path-exports)
25
26
  - [License](#license)
26
27
 
@@ -109,6 +110,7 @@ import {
109
110
 
110
111
  // DevBridge mock host
111
112
  DevBridge, type DevBridgeConfig,
113
+ type ReplayConfig, type ReplayLaunch,
112
114
 
113
115
  // Branded loading frame (lifecycle API)
114
116
  createCSSPreloader, setCSSPreloaderProgress, waitCSSPreloaderTap, removeCSSPreloader,
@@ -156,6 +158,7 @@ session.initData; // InitData | null — first handshake response
156
158
  session.devBridge; // DevBridge | null
157
159
  session.balance; // number — proxied to SDK
158
160
  session.currency; // string
161
+ session.isReplay; // boolean — true on a historical-round replay launch
159
162
  session.on('balanceUpdate', ({ balance }) => { /* … */ });
160
163
  session.on('error', (err) => { /* … */ });
161
164
 
@@ -165,6 +168,18 @@ session.destroy();
165
168
 
166
169
  Inside `game-engine`, `GameApplication` wraps this. For non-pixi consumers, this is the layer you talk to directly.
167
170
 
171
+ **Historical-round replay.** `session.isReplay` is `true` when the host launched the game to re-watch a recorded round (`config.replayMode`). The same `session.play(...)` flow then returns the recorded results instead of live ones. Each game decides what replay means for its UI:
172
+
173
+ ```typescript
174
+ if (session.isReplay) {
175
+ hideBalanceUI();
176
+ hideBetSelector();
177
+ showPlayAgainButton(); // the only CTA in replay
178
+ }
179
+ ```
180
+
181
+ In dev, set up the recorded rounds via [`DevBridge` replay mode](#replay-mode-historical-rounds).
182
+
168
183
  **Session continuations: pass the triggering bet, not zero.** When the previous result returns `nextActions: ['free_spin']` (or any other in-session action with `debit: 'none'`), pass the same bet that triggered the session:
169
184
 
170
185
  ```typescript
@@ -343,6 +358,35 @@ Other contract details DevBridge enforces:
343
358
  - **`session.history`** is appended on every session round (`{spinIndex, win, data}`), so the client can rebuild the screen after reload.
344
359
  - **`MapState` parity** — `multiplier`, `global_multiplier`, `free_spins_total`, `max_win_reached` are auto-injected into `result.data` from engine variables when the Lua script doesn't set them explicitly.
345
360
 
361
+ ### Replay mode (historical rounds)
362
+
363
+ A game can be launched to **replay a previously-played round** move-by-move instead of placing live bets — the SDK 2.7.3 historical-round replay. No new protocol: the same `play()` / `PLAY_RESULT` flow is reused, only the data source and one config flag differ.
364
+
365
+ In production the casino backend is the replay host. In dev, **DevBridge is the host**, so it gains an opt-in `replay` config. You supply a `resolve(mode, roundId)` callback that returns the recorded rounds — DevBridge stays agnostic about where they come from (fetch, static fixtures, `localStorage`, …):
366
+
367
+ ```typescript
368
+ const bridge = new DevBridge({
369
+ // … balance / gameConfig as usual …
370
+ replay: {
371
+ // Called once on a replay launch. May be async.
372
+ resolve: (mode, roundId) => fetchRecordedRound(mode, roundId),
373
+ // Optional. Defaults to reading ?replay=1&mode=…&event=… from the URL.
374
+ // Return null for a normal (live) launch.
375
+ detect: () => /* … */ null,
376
+ },
377
+ });
378
+ ```
379
+
380
+ Open the game with `?replay=1&mode=BONUS&event=<roundId>` and DevBridge switches into replay automatically. In replay it:
381
+
382
+ - flips `config.replayMode = true` in `INIT` (so `sdk.isReplay` / `session.isReplay` is `true`);
383
+ - takes `balance` / `currency` from the recorded results — **the wallet is never touched**;
384
+ - serves `results[cursor]` on each `PLAY_REQUEST`, with no bet/session validation;
385
+ - resets the cursor to `0` on the first spin past the end ("Play Again");
386
+ - returns `PLAY_ERROR NO_ACTIVE_SESSION` when the record list is empty.
387
+
388
+ The game reacts via a single flag — see [`session.isReplay`](#platformsession). Each game decides what that means (hide balance/bet/autoplay/buy-bonus, show a "Play Again" CTA); the engine never imposes UI.
389
+
346
390
  ---
347
391
 
348
392
  ## RTP Simulation CLI
@@ -564,6 +608,198 @@ Nothing in this code is Pixi-specific. The same pattern fits Three.js, Babylon,
564
608
 
565
609
  ---
566
610
 
611
+ ## Branded Game Shell
612
+
613
+ `@energy8platform/platform-core/shell` is a **vanilla-DOM UI overlay** you layer over the game
614
+ canvas — no Pixi, no React, no framework. It owns the control bar (3 modes: base / freeSpins /
615
+ replay), the menu, settings, the game-info panel, and a buy-bonus selection overlay, plus generic
616
+ modals and a replay summary. Branded Energy8 chrome, fully renderer-agnostic — pair it with Pixi,
617
+ Phaser, Three.js, or a custom engine.
618
+
619
+ > Also re-exported from `@energy8platform/game-engine/shell` — same module, no extra install for
620
+ > Pixi consumers.
621
+
622
+ ### Mental model
623
+
624
+ The shell is **fully driven by the game** (single source of truth). It does **not** subscribe to
625
+ the SDK/session and holds no game logic. You:
626
+
627
+ 1. **Feed state in** — once via the config object, then over time via `set*` methods.
628
+ 2. **React to player intent out** — subscribe to typed events (`spin`, `betChange`, …) and run
629
+ your game logic, then push the resulting state back via setters.
630
+
631
+ This keeps replay and mid-spin restore deterministic: the shell never decides anything, it only
632
+ renders what you tell it and reports what the player tapped.
633
+
634
+ ### Quick start
635
+
636
+ ```typescript
637
+ import { createGameShell, removeGameShell } from '@energy8platform/platform-core/shell';
638
+
639
+ const shell = createGameShell({
640
+ mount: document.getElementById('game')!, // shell appends its DOM here (position it relative)
641
+ language: 'en',
642
+ currency: { symbol: '€', position: 'left' },
643
+ availableBets: [0.2, 0.5, 1, 2, 5],
644
+ defaultBet: 1,
645
+ currentBet: null, // null → start at defaultBet; or restore a saved bet
646
+ balance: 1000,
647
+ win: 0,
648
+ mode: 'base',
649
+ gameInfo: { sections: [{ type: 'controls' }] }, // see "Game info" below
650
+ features: {
651
+ turbo: 3, // 0 = no turbo button, 1–3 = number of turbo levels
652
+ autoplay: true,
653
+ buyBonus: [
654
+ { id: 'fs', type: 'bonus', title: 'Buy Free Spins', description: '10 free spins',
655
+ priceMultiplier: 100, volatility: 5 },
656
+ ],
657
+ },
658
+ });
659
+
660
+ // ── player intent (shell → game) ──
661
+ shell.on('spin', () => runSpin(shell.state.bet));
662
+ shell.on('betChange', (bet) => { myState.bet = bet; });
663
+ shell.on('buyBonusSelect', ({ id }) => buyFeature(id));
664
+
665
+ // ── game state (game → shell) ──
666
+ shell.setBusy(true); // disable controls during an active spin
667
+ shell.setBalance(980);
668
+ shell.setWin(20); // both readouts count up automatically
669
+ shell.setBusy(false);
670
+
671
+ // teardown (single shell per page; fades out, resolves when removed)
672
+ await removeGameShell();
673
+ ```
674
+
675
+ `createGameShell` is a **singleton** — calling it twice returns the existing shell. Use
676
+ `removeGameShell()` to dispose before creating another.
677
+
678
+ ### Config reference (`ShellConfig`)
679
+
680
+ | Field | Type | Notes |
681
+ | --- | --- | --- |
682
+ | `mount` | `HTMLElement` | Container the shell DOM is appended into. Give it `position: relative`. |
683
+ | `theme` | `ThemeConfig?` | `{ scheme?: 'dark' \| 'light', accent?, buyBonusColor? }`. Defaults to dark. |
684
+ | `language` | `string` | Currently `'en'` is the source language. |
685
+ | `isSocial` | `boolean?` | Swap built-in text to social-casino vocabulary (bet → play, win → …). Game-supplied strings are untouched. |
686
+ | `currency` | `CurrencyConfig` | `{ symbol, position: 'left'\|'right', decimals?, minDecimals?, separator? }`. |
687
+ | `availableBets` | `number[]` | Bet ladder shown in the bet picker. |
688
+ | `defaultBet` / `currentBet` | `number` / `number \| null` | `currentBet` restores a saved bet; `null` falls back to `defaultBet`. |
689
+ | `balance` / `win` | `number` | Initial readouts. |
690
+ | `mode` | `'base' \| 'freeSpins' \| 'replay'` | Drives which bottom-bar variant renders. |
691
+ | `gameInfo` | `GameInfoContent` | Sections for the game-info overlay (see below). |
692
+ | `features` | `ShellFeatures` | `{ turbo: 0–3, autoplay, buyBonus: BonusOption[] \| false }`. |
693
+
694
+ ### Events (`shell.on(name, handler)`)
695
+
696
+ | Event | Payload | When |
697
+ | --- | --- | --- |
698
+ | `spin` | — | Spin disc tapped (or Spacebar in base mode). |
699
+ | `betChange` | `number` | Player confirmed a new bet. |
700
+ | `autoplayStart` / `autoplayStop` | `{ active, remaining }` / — | Autoplay picker confirmed / stopped. |
701
+ | `turboChange` | `number` | Turbo level cycled. |
702
+ | `buyBonusSelect` | `{ id }` | A `type: 'bonus'` card was bought. |
703
+ | `featureActivate` / `featureDeactivate` | `{ id }` | A `type: 'feature'` option (e.g. Ante) toggled. |
704
+ | `menuOpen` / `settingsOpen` / `infoOpen` | — | Overlay opened. |
705
+ | `settingChange` | `{ key, value }` | Settings control changed. Keys: `sound` (bool), `master` / `music` / `sfx` (0–100). |
706
+
707
+ ### State setters (`game → shell`)
708
+
709
+ Each setter updates `shell.state` and re-renders. `setBalance` / `setWin` animate a count-up from
710
+ the previous value.
711
+
712
+ ```typescript
713
+ shell.setBalance(n); shell.setWin(n); shell.setBet(n);
714
+ shell.setBusy(true); // disables controls mid-spin
715
+ shell.setMode('freeSpins');
716
+ shell.setFreeSpins({ current: 1, total: 10, totalWin: 0, lastWin: 0 }); // freeSpins bar readout
717
+ shell.setAutoplay({ active: true, remaining: 25 });
718
+ shell.setTurbo(2);
719
+ shell.setBuyBonusEnabled(false); // grey out BUY BONUS (e.g. insufficient balance)
720
+ shell.setTheme({ scheme: 'light' }); // recolour at runtime
721
+ shell.setSocial(true); // swap vocabulary at runtime (reopen overlays to refresh them)
722
+ ```
723
+
724
+ Read current state any time via `shell.state` (`ShellState`: `mode`, `balance`, `win`, `bet`,
725
+ `busy`, `autoplay`, `turbo`, `freeSpins`, `activeFeature`, …).
726
+
727
+ ### Buy bonus & features
728
+
729
+ `features.buyBonus` is an array of cards. `type: 'bonus'` buys into a round (emits
730
+ `buyBonusSelect`); `type: 'feature'` toggles a base-game modifier like Ante. For features, drive
731
+ the bar readout with:
732
+
733
+ ```typescript
734
+ shell.activateFeature(option); // bar shows the effective bet, BUY BONUS → DISABLE
735
+ shell.deactivateFeature(); // revert
736
+ ```
737
+
738
+ Each card price renders as `priceMultiplier × current bet` in the shell currency.
739
+
740
+ ### Game info (`gameInfo.sections`)
741
+
742
+ The game-info overlay is composed from typed sections — declare what your game has and the shell
743
+ draws the rest:
744
+
745
+ - `{ type: 'modes', modes: GameMode[] }` — comparison table (title / price / rtp / maxWin).
746
+ - `{ type: 'controls' }` — auto-generated control legend.
747
+ - `{ type: 'paytable', rows: PaytableRow[] }` — symbol → win tiers (`"<count> x<multiplier>"`).
748
+ - `{ type: 'wins', kind, grid, … }` — auto-drawn win illustration. `kind` is `'classic'` (paylines),
749
+ `'cluster'`, `'anywhere'`, or `'ways'`.
750
+ - `{ type: 'custom', title, html | node }` — your own rules markup.
751
+
752
+ ```typescript
753
+ gameInfo: {
754
+ sections: [
755
+ { type: 'modes', modes: [{ title: 'Base game', price: '1× bet', rtp: 96.5, maxWin: '5,000×' }] },
756
+ { type: 'controls' },
757
+ { type: 'paytable', rows: [
758
+ { symbol: { text: 'Wild' }, wins: [{ count: '5', multiplier: 250 }, { count: '3', multiplier: 50 }] },
759
+ ] },
760
+ { type: 'wins', kind: 'classic', grid: { cols: 5, rows: 3 },
761
+ lines: [[1,1,1,1,1], [0,0,0,0,0], [2,2,2,2,2]] },
762
+ { type: 'custom', title: 'Rules', html: '<p>Match left to right on adjacent reels.</p>' },
763
+ ],
764
+ }
765
+ ```
766
+
767
+ ### Opening overlays & modals programmatically
768
+
769
+ ```typescript
770
+ shell.openSettings(); shell.openInfo(); shell.openBuyBonus();
771
+ shell.openBetPicker(); shell.openAutoplayPicker();
772
+
773
+ // generic card modal
774
+ shell.openModal({
775
+ availableClose: true,
776
+ title: 'Connection lost',
777
+ body: 'Reconnecting…',
778
+ actions: [{ title: 'Retry', color: '#e11', on: () => reconnect() }],
779
+ });
780
+
781
+ // non-dismissable replay summary (START REPLAY → onReplay → reopen)
782
+ shell.openReplay({ bonusId: 'fs', bet: shell.state.bet, payoutMultiplier: 87.5,
783
+ onReplay: () => playRecordedRound() });
784
+ ```
785
+
786
+ ### Layout & visual system
787
+
788
+ Transparent neutral chrome that doesn't compete with the game — brand colour appears only on the
789
+ BUY BONUS control and a duotone icon set. The bottom bar **adapts by viewport** automatically (a
790
+ `ResizeObserver` on the mount): landscape → one row scaled to fit, portrait → stacked mobile
791
+ layout; Settings / Game info / Buy bonus open as full-screen overlays. Motion is minimal (press
792
+ feedback, money count-up, overlay fades) and respects `prefers-reduced-motion`. Spacebar triggers
793
+ a spin in base mode (ignored while busy, in autoplay, or when a modal/input is focused).
794
+
795
+ ### Live demo
796
+
797
+ [`examples/shell-demo`](../../examples/shell-demo) is a full reference integration: every config
798
+ section, all three bar modes, theme/social toggles, viewport presets, and event wiring. QA params:
799
+ `?screen=<id>&kiosk=1&open=settings|info|buybonus`.
800
+
801
+ ---
802
+
567
803
  ## Sub-path exports
568
804
 
569
805
  | Path | What's there |
@@ -571,9 +807,10 @@ Nothing in this code is Pixi-specific. The same pattern fits Three.js, Babylon,
571
807
  | `@energy8platform/platform-core` | Everything — re-exports from all sub-paths |
572
808
  | `@energy8platform/platform-core/lua` | Browser-safe Lua engine surface: LuaEngine, ActionRouter, SessionManager, PersistentState, JS `SimulationRunner`, types |
573
809
  | `@energy8platform/platform-core/simulation` | **Node-only.** `NativeSimulationRunner` (Go binary) and `ParallelSimulationRunner` (worker_threads). Don't import from a browser bundle — the main entry and `/lua` deliberately exclude these so they can't be tree-shake-leaked. |
574
- | `@energy8platform/platform-core/dev-bridge` | `DevBridge`, `DevBridgeConfig` |
810
+ | `@energy8platform/platform-core/dev-bridge` | `DevBridge`, `DevBridgeConfig`, `ReplayConfig`, `ReplayLaunch` |
575
811
  | `@energy8platform/platform-core/vite` | `devBridgePlugin`, `luaPlugin` |
576
812
  | `@energy8platform/platform-core/loading` | `createCSSPreloader`, `setCSSPreloaderProgress`, `waitCSSPreloaderTap`, `removeCSSPreloader`, `buildLogoSVG`, `LOADER_BAR_MAX_WIDTH` |
813
+ | `@energy8platform/platform-core/shell` | `createGameShell`, `removeGameShell` — branded renderer-agnostic DOM game shell (control bar, menu, settings, game info, buy bonus) |
577
814
 
578
815
  The sub-paths exist for tree-shaking — pulling only `/lua` doesn't drag in DevBridge or vite types. The main entry is convenient for app-level code where size hardly matters.
579
816
 
@@ -2,6 +2,24 @@
2
2
 
3
3
  var gameSdk = require('@energy8platform/game-sdk');
4
4
 
5
+ /**
6
+ * Default replay detector — reads `?replay=…&mode=…&event=…` from the
7
+ * browser URL. Returns `null` outside the browser or when `replay` is absent
8
+ * or falsy, so the bridge falls back to normal (live) play.
9
+ */
10
+ function defaultReplayDetect() {
11
+ const loc = globalThis.location;
12
+ if (!loc?.search)
13
+ return null;
14
+ const params = new URLSearchParams(loc.search);
15
+ const replay = params.get('replay');
16
+ if (!replay || replay === '0' || replay === 'false')
17
+ return null;
18
+ return {
19
+ mode: params.get('mode') ?? undefined,
20
+ roundId: params.get('event') ?? params.get('roundId') ?? undefined,
21
+ };
22
+ }
5
23
  /** Default session TTL when GameDefinition.session_ttl is omitted (24h). */
6
24
  const DEFAULT_SESSION_TTL_MS = 24 * 60 * 60 * 1000;
7
25
  /**
@@ -109,11 +127,25 @@ class DevBridge {
109
127
  _sessionExpiresAt = null;
110
128
  /** Pre-parsed session TTL from gameDefinition.session_ttl. */
111
129
  _sessionTtlMs;
130
+ /** Detected replay launch, or null when not replaying. */
131
+ _replayLaunch = null;
132
+ /** Recorded rounds for the active replay (resolved lazily once). */
133
+ _replayResults = null;
134
+ /** Cursor into the recorded rounds; wraps to 0 on "Play Again". */
135
+ _replayCursor = 0;
112
136
  constructor(config = {}) {
113
137
  this._config = { ...DEFAULT_CONFIG, ...config };
114
138
  this._balance = this._config.balance;
115
139
  this._useLuaServer = !!(this._config.luaScript && this._config.gameDefinition);
116
140
  this._sessionTtlMs = parseSessionTtl(this._config.gameDefinition?.session_ttl);
141
+ if (this._config.replay) {
142
+ const detect = this._config.replay.detect ?? defaultReplayDetect;
143
+ this._replayLaunch = detect();
144
+ }
145
+ }
146
+ /** True when this bridge was launched as a historical-round replay. */
147
+ get isReplay() {
148
+ return this._replayLaunch !== null;
117
149
  }
118
150
  /** Current mock balance */
119
151
  get balance() {
@@ -169,6 +201,10 @@ class DevBridge {
169
201
  }
170
202
  // ─── Message Handling ──────────────────────────────────
171
203
  handleGameReady(id) {
204
+ if (this._replayLaunch) {
205
+ this.handleReplayGameReady(id);
206
+ return;
207
+ }
172
208
  const initData = {
173
209
  balance: this._balance,
174
210
  currency: this._config.currency,
@@ -178,7 +214,75 @@ class DevBridge {
178
214
  };
179
215
  this.delayedSend('INIT', initData, id);
180
216
  }
217
+ /**
218
+ * Replay INIT: flip `config.replayMode = true` and take balance/currency
219
+ * from the recorded results (the wallet is never touched in replay).
220
+ */
221
+ handleReplayGameReady(id) {
222
+ this.resolveReplayResults()
223
+ .then((results) => {
224
+ const first = results[0];
225
+ if (first) {
226
+ this._balance = first.balanceAfter;
227
+ }
228
+ const initData = {
229
+ balance: this._balance,
230
+ currency: first?.currency ?? this._config.currency,
231
+ config: {
232
+ ...this._config.gameConfig,
233
+ replayMode: true,
234
+ },
235
+ session: null,
236
+ assetsUrl: this._config.assetsUrl,
237
+ };
238
+ this.delayedSend('INIT', initData, id);
239
+ })
240
+ .catch((err) => {
241
+ console.error('[DevBridge] Replay resolve failed:', err);
242
+ this.sendError(id, 'ENGINE_ERROR', err?.message ?? 'replay resolve failed');
243
+ });
244
+ }
245
+ /** Resolve (and cache) the recorded rounds for the active replay launch. */
246
+ resolveReplayResults() {
247
+ if (!this._replayResults) {
248
+ const { mode, roundId } = this._replayLaunch ?? {};
249
+ this._replayResults = Promise.resolve(this._config.replay.resolve(mode, roundId));
250
+ }
251
+ return this._replayResults;
252
+ }
253
+ /**
254
+ * Replay PLAY_REQUEST: serve the recorded round at the cursor and advance.
255
+ * No wallet movement, no bet/session validation. The first spin past the
256
+ * end resets the cursor to 0 ("Play Again"). An empty record list behaves
257
+ * like an exhausted live session.
258
+ */
259
+ handleReplayPlay(id) {
260
+ this.resolveReplayResults()
261
+ .then((results) => {
262
+ if (!results || results.length === 0) {
263
+ this.sendError(id, 'NO_ACTIVE_SESSION', 'replay has no recorded rounds');
264
+ return;
265
+ }
266
+ // Play Again: a spin past the end wraps back to the first round.
267
+ if (this._replayCursor >= results.length) {
268
+ this._replayCursor = 0;
269
+ }
270
+ const next = results[this._replayCursor++];
271
+ this._lastPlayResult = next;
272
+ // Mirror the recorded balance so GET_BALANCE / HUD stay consistent.
273
+ this._balance = next.balanceAfter;
274
+ this.delayedSend('PLAY_RESULT', next, id);
275
+ })
276
+ .catch((err) => {
277
+ console.error('[DevBridge] Replay resolve failed:', err);
278
+ this.sendError(id, 'ENGINE_ERROR', err?.message ?? 'replay resolve failed');
279
+ });
280
+ }
181
281
  handlePlayRequest(payload, id) {
282
+ if (this._replayLaunch) {
283
+ this.handleReplayPlay(id);
284
+ return;
285
+ }
182
286
  const { action, bet, params } = payload;
183
287
  this._roundCounter++;
184
288
  if (this._useLuaServer) {
@@ -1 +1 @@
1
- {"version":3,"file":"dev-bridge.cjs.js","sources":["../src/dev-bridge/DevBridge.ts"],"sourcesContent":[null],"names":["Bridge"],"mappings":"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"}
1
+ {"version":3,"file":"dev-bridge.cjs.js","sources":["../src/dev-bridge/DevBridge.ts"],"sourcesContent":[null],"names":["Bridge"],"mappings":"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"}
@@ -65,6 +65,41 @@ interface SessionConfig {
65
65
  persistent_vars?: string[];
66
66
  }
67
67
 
68
+ /**
69
+ * A detected replay launch — the host wants to re-play a historical round
70
+ * instead of placing live bets. `mode`/`roundId` are forwarded verbatim to
71
+ * {@link ReplayConfig.resolve}.
72
+ */
73
+ interface ReplayLaunch {
74
+ /** Game mode the round was recorded in (e.g. "BASE", "BONUS"). */
75
+ mode?: string;
76
+ /** Identifier of the recorded round to replay. */
77
+ roundId?: string;
78
+ }
79
+ /**
80
+ * Opt-in replay support for the DevBridge mock host.
81
+ *
82
+ * In production the casino backend serves a recorded round; in dev the
83
+ * DevBridge IS the host. Provide a `resolve` callback that returns the
84
+ * recorded rounds — DevBridge stays agnostic about where they come from
85
+ * (fetch, static fixtures, localStorage, …). When a replay launch is
86
+ * detected, the bridge flips `config.replayMode = true` and feeds the
87
+ * recorded `PlayResultData[]` back on each play request, without touching
88
+ * the wallet.
89
+ */
90
+ interface ReplayConfig {
91
+ /**
92
+ * Resolve the recorded rounds for a replay launch. Receives the `mode`
93
+ * and `roundId` from {@link detect}. May be async (e.g. a fetch).
94
+ */
95
+ resolve: (mode: string | undefined, roundId: string | undefined) => PlayResultData[] | Promise<PlayResultData[]>;
96
+ /**
97
+ * Decide whether this launch is a replay and extract its params.
98
+ * Defaults to reading `?replay=1&mode=…&event=…` from the browser URL.
99
+ * Return `null` for a normal (non-replay) launch.
100
+ */
101
+ detect?: () => ReplayLaunch | null;
102
+ }
68
103
  interface DevBridgeConfig {
69
104
  /** Mock initial balance */
70
105
  balance?: number;
@@ -88,6 +123,12 @@ interface DevBridgeConfig {
88
123
  gameDefinition?: GameDefinition;
89
124
  /** RNG seed for deterministic Lua execution */
90
125
  luaSeed?: number;
126
+ /**
127
+ * Opt-in historical-round replay. When the detector reports a replay
128
+ * launch, the bridge serves recorded rounds instead of running Lua/onPlay.
129
+ * See {@link ReplayConfig}.
130
+ */
131
+ replay?: ReplayConfig;
91
132
  }
92
133
  /**
93
134
  * Mock host bridge for local development.
@@ -129,7 +170,15 @@ declare class DevBridge {
129
170
  private _sessionExpiresAt;
130
171
  /** Pre-parsed session TTL from gameDefinition.session_ttl. */
131
172
  private _sessionTtlMs;
173
+ /** Detected replay launch, or null when not replaying. */
174
+ private _replayLaunch;
175
+ /** Recorded rounds for the active replay (resolved lazily once). */
176
+ private _replayResults;
177
+ /** Cursor into the recorded rounds; wraps to 0 on "Play Again". */
178
+ private _replayCursor;
132
179
  constructor(config?: DevBridgeConfig);
180
+ /** True when this bridge was launched as a historical-round replay. */
181
+ get isReplay(): boolean;
133
182
  /** Current mock balance */
134
183
  get balance(): number;
135
184
  /** Start listening for SDK messages */
@@ -141,6 +190,20 @@ declare class DevBridge {
141
190
  /** Destroy the dev bridge */
142
191
  destroy(): void;
143
192
  private handleGameReady;
193
+ /**
194
+ * Replay INIT: flip `config.replayMode = true` and take balance/currency
195
+ * from the recorded results (the wallet is never touched in replay).
196
+ */
197
+ private handleReplayGameReady;
198
+ /** Resolve (and cache) the recorded rounds for the active replay launch. */
199
+ private resolveReplayResults;
200
+ /**
201
+ * Replay PLAY_REQUEST: serve the recorded round at the cursor and advance.
202
+ * No wallet movement, no bet/session validation. The first spin past the
203
+ * end resets the cursor to 0 ("Play Again"). An empty record list behaves
204
+ * like an exhausted live session.
205
+ */
206
+ private handleReplayPlay;
144
207
  private handlePlayRequest;
145
208
  /** Send a PLAY_ERROR correlated to the original PLAY_REQUEST id. */
146
209
  private sendError;
@@ -175,4 +238,4 @@ declare class DevBridge {
175
238
  }
176
239
 
177
240
  export { DevBridge };
178
- export type { DevBridgeConfig };
241
+ export type { DevBridgeConfig, ReplayConfig, ReplayLaunch };