@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.
- package/README.md +238 -1
- package/dist/dev-bridge.cjs.js +104 -0
- package/dist/dev-bridge.cjs.js.map +1 -1
- package/dist/dev-bridge.d.ts +64 -1
- package/dist/dev-bridge.esm.js +104 -0
- package/dist/dev-bridge.esm.js.map +1 -1
- package/dist/index.cjs.js +2053 -0
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +372 -2
- package/dist/index.esm.js +2051 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/shell.cjs.js +1993 -0
- package/dist/shell.cjs.js.map +1 -0
- package/dist/shell.d.ts +320 -0
- package/dist/shell.esm.js +1989 -0
- package/dist/shell.esm.js.map +1 -0
- package/package.json +7 -2
- package/scripts/build-shell-font.mjs +64 -0
- package/src/PlatformSession.ts +10 -0
- package/src/dev-bridge/DevBridge.ts +160 -2
- package/src/dev-bridge/index.ts +1 -1
- package/src/index.ts +17 -1
- package/src/shell/GameShell.ts +294 -0
- package/src/shell/INTER-LICENSE.txt +93 -0
- package/src/shell/colors.ts +32 -0
- package/src/shell/components/BottomBar.ts +217 -0
- package/src/shell/components/BuyBonus.ts +163 -0
- package/src/shell/components/GameInfo.ts +253 -0
- package/src/shell/components/Modal.ts +36 -0
- package/src/shell/components/ReplayModal.ts +56 -0
- package/src/shell/components/Settings.ts +60 -0
- package/src/shell/components/icons.ts +40 -0
- package/src/shell/components/pickers.ts +76 -0
- package/src/shell/components/primitives.ts +84 -0
- package/src/shell/fonts.ts +13 -0
- package/src/shell/format.ts +36 -0
- package/src/shell/i18n.ts +67 -0
- package/src/shell/index.ts +20 -0
- package/src/shell/motion.ts +43 -0
- package/src/shell/shell.css.ts +371 -0
- package/src/shell/state.ts +30 -0
- package/src/shell/theme.ts +56 -0
- 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
|
|
package/dist/dev-bridge.cjs.js
CHANGED
|
@@ -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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"}
|
package/dist/dev-bridge.d.ts
CHANGED
|
@@ -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 };
|