@energy8platform/platform-core 0.16.1 → 0.17.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 CHANGED
@@ -320,6 +320,28 @@ bridge.destroy();
320
320
 
321
321
  Most of the time you don't construct DevBridge yourself — `createPlatformSession({ dev: { … } })` does it for you.
322
322
 
323
+ ### Platform-parity behavior (Lua mode)
324
+
325
+ In Lua mode (`luaScript` + `gameDefinition`), DevBridge mirrors the server's `PlayRound` contract so error-handling code written against dev runs unchanged in prod. Invalid requests come back as `PLAY_ERROR` and the SDK's `play()` rejects with `SDKError(code, message)`:
326
+
327
+ | code | when |
328
+ |-------------------------|----------------------------------------------------------|
329
+ | `INVALID_INPUT` | unknown action |
330
+ | `INVALID_AMOUNT` | `bet` not in `bet_levels` (list or `{min, max}` range) |
331
+ | `INSUFFICIENT_FUNDS` | computed debit > balance (no wallet movement, no fetch) |
332
+ | `ACTIVE_SESSION_EXISTS` | non-session action while a session is in progress |
333
+ | `NO_ACTIVE_SESSION` | session-required action without an active session |
334
+ | `SESSION_EXPIRED` | session past `gameDefinition.session_ttl` (default 24h) |
335
+ | `ENGINE_ERROR` | Lua execution failed (debit is rolled back) |
336
+
337
+ Other contract details DevBridge enforces:
338
+
339
+ - **Round IDs are server-generated** (`crypto.randomUUID`). The client value in `PlayParams.roundId` is ignored for non-session actions and replaced with the active session's id for session-based ones — matches the platform's `playRound` UUID rules.
340
+ - **`STATE_RESPONSE`** returns the last `PlayResultData` (with `session.history` populated) while a session is active and not yet completed, mirroring `GET /api/games/{id}/session`.
341
+ - **`creditPending`** is `false` in the normal path. The wire flag means "wallet credit failed, queued for retry" — never "credit deferred until session completes".
342
+ - **`session.history`** is appended on every session round (`{spinIndex, win, data}`), so the client can rebuild the screen after reload.
343
+ - **`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.
344
+
323
345
  ---
324
346
 
325
347
  ## RTP Simulation CLI
@@ -330,11 +352,11 @@ Most of the time you don't construct DevBridge yourself — `createPlatformSessi
330
352
  # 1M spins (default)
331
353
  npx platform-core-simulate
332
354
 
333
- # Buy-bonus stage
355
+ # Buy-bonus action (v5: just simulate the action by name)
334
356
  npx platform-core-simulate --action buy_bonus
335
357
 
336
- # Ante bet
337
- npx platform-core-simulate --params '{"ante_bet":true}'
358
+ # Ante bet — also a regular action in v5
359
+ npx platform-core-simulate --action ante_spin
338
360
 
339
361
  # Custom: 5M iterations, fixed seed, custom config path
340
362
  npx platform-core-simulate --iterations 5000000 --bet 1 --seed 42 --config ./dev.config.ts
@@ -2,6 +2,57 @@
2
2
 
3
3
  var gameSdk = require('@energy8platform/game-sdk');
4
4
 
5
+ /** Default session TTL when GameDefinition.session_ttl is omitted (24h). */
6
+ const DEFAULT_SESSION_TTL_MS = 24 * 60 * 60 * 1000;
7
+ /**
8
+ * Parse a Go-style duration string ("24h", "5ms", "30s", "10m") into
9
+ * milliseconds. Mirrors GameDefinition.SessionTTLDuration on the server.
10
+ */
11
+ function parseSessionTtl(ttl) {
12
+ if (!ttl)
13
+ return DEFAULT_SESSION_TTL_MS;
14
+ const m = ttl.match(/^(\d+(?:\.\d+)?)(ms|s|m|h)$/);
15
+ if (!m)
16
+ return DEFAULT_SESSION_TTL_MS;
17
+ const n = parseFloat(m[1]);
18
+ switch (m[2]) {
19
+ case 'ms': return n;
20
+ case 's': return n * 1000;
21
+ case 'm': return n * 60 * 1000;
22
+ case 'h': return n * 60 * 60 * 1000;
23
+ default: return DEFAULT_SESSION_TTL_MS;
24
+ }
25
+ }
26
+ /**
27
+ * Validate a bet against the game's bet_levels config — mirrors the server's
28
+ * validateBet. Levels-list takes priority over min/max range.
29
+ */
30
+ function isBetAllowed(bet, levels) {
31
+ if (!levels)
32
+ return true;
33
+ if (Array.isArray(levels)) {
34
+ return levels.includes(bet);
35
+ }
36
+ if (levels.levels && levels.levels.length > 0) {
37
+ return levels.levels.includes(bet);
38
+ }
39
+ if (levels.min !== undefined && bet < levels.min)
40
+ return false;
41
+ if (levels.max !== undefined && bet > levels.max)
42
+ return false;
43
+ return true;
44
+ }
45
+ /**
46
+ * Generate a server-style UUID for a fresh round. Falls back to a counter
47
+ * suffix if `crypto.randomUUID` isn't available (very old runtimes).
48
+ */
49
+ function generateRoundId() {
50
+ const c = globalThis.crypto;
51
+ if (c && typeof c.randomUUID === 'function')
52
+ return c.randomUUID();
53
+ // Minimal fallback — not crypto-strong, but keeps the wire shape sane.
54
+ return 'dev-' + Math.random().toString(16).slice(2) + '-' + Date.now().toString(16);
55
+ }
5
56
  const DEFAULT_CONFIG = {
6
57
  balance: 10000,
7
58
  currency: 'USD',
@@ -50,10 +101,19 @@ class DevBridge {
50
101
  _roundCounter = 0;
51
102
  _bridge = null;
52
103
  _useLuaServer;
104
+ /** Last PlayResult sent — mirrors what `GET /games/{id}/session` returns. */
105
+ _lastPlayResult = null;
106
+ /** Active session round id; non-null while a session is in progress. */
107
+ _activeRoundId = null;
108
+ /** Wall-clock expiry timestamp for the active session. */
109
+ _sessionExpiresAt = null;
110
+ /** Pre-parsed session TTL from gameDefinition.session_ttl. */
111
+ _sessionTtlMs;
53
112
  constructor(config = {}) {
54
113
  this._config = { ...DEFAULT_CONFIG, ...config };
55
114
  this._balance = this._config.balance;
56
115
  this._useLuaServer = !!(this._config.luaScript && this._config.gameDefinition);
116
+ this._sessionTtlMs = parseSessionTtl(this._config.gameDefinition?.session_ttl);
57
117
  }
58
118
  /** Current mock balance */
59
119
  get balance() {
@@ -119,26 +179,83 @@ class DevBridge {
119
179
  this.delayedSend('INIT', initData, id);
120
180
  }
121
181
  handlePlayRequest(payload, id) {
122
- const { action, bet, roundId, params } = payload;
182
+ const { action, bet, params } = payload;
123
183
  this._roundCounter++;
124
184
  if (this._useLuaServer) {
185
+ const def = this._config.gameDefinition;
186
+ // Mirror the server's INVALID_INPUT short-circuit: an unknown action
187
+ // is rejected before any wallet movement, with no PLAY_RESULT.
188
+ const actionDef = def.actions?.[action];
189
+ if (!actionDef) {
190
+ this.sendError(id, 'INVALID_INPUT', `unknown action "${action}"`);
191
+ return;
192
+ }
193
+ // Bet validation — server returns 400 INVALID_AMOUNT before the
194
+ // engine. We mirror that so games can't silently accept bad bets.
195
+ if (!isBetAllowed(bet, def.bet_levels)) {
196
+ this.sendError(id, 'INVALID_AMOUNT', `bet ${bet} is not in allowed bet_levels`);
197
+ return;
198
+ }
199
+ // Session-state guards (server: 409 ACTIVE_SESSION_EXISTS / 404 NoActiveSession / 410 ExpiredSession).
200
+ const sessionExpired = this._activeRoundId !== null &&
201
+ this._sessionExpiresAt !== null &&
202
+ Date.now() > this._sessionExpiresAt;
203
+ if (actionDef.requires_session) {
204
+ if (sessionExpired) {
205
+ this.clearSessionState();
206
+ this.sendError(id, 'SESSION_EXPIRED', 'game session has expired');
207
+ return;
208
+ }
209
+ if (this._activeRoundId === null) {
210
+ this.sendError(id, 'NO_ACTIVE_SESSION', `action "${action}" requires an active session`);
211
+ return;
212
+ }
213
+ }
214
+ else {
215
+ // Non-session action over an active (non-expired) session — server's
216
+ // acquireSession would fail with ACTIVE_SESSION_EXISTS.
217
+ if (this._activeRoundId !== null && !sessionExpired) {
218
+ this.sendError(id, 'ACTIVE_SESSION_EXISTS', 'an active game session already exists');
219
+ return;
220
+ }
221
+ if (sessionExpired) {
222
+ // Drop stale session state so a fresh non-session action can proceed.
223
+ this.clearSessionState();
224
+ }
225
+ }
125
226
  // Compute the debit amount for this action — mirrors the platform's
126
227
  // server-side rules so Buy Bonus / Ante Bet actions debit the right
127
228
  // multiple of bet instead of just the base bet.
128
229
  const debit = this.computeDebit(action, bet, params);
230
+ // Server returns 402 INSUFFICIENT_FUNDS before the wallet is touched
231
+ // and never reaches the engine. DevBridge must do the same so the
232
+ // SDK's play() rejects with the right SDKError code.
233
+ if (debit > this._balance) {
234
+ this.sendError(id, 'INSUFFICIENT_FUNDS', `insufficient funds (need ${debit}, have ${this._balance})`);
235
+ return;
236
+ }
129
237
  this._balance -= debit;
130
- this.executeLuaOnServer({ action, bet, roundId, params })
238
+ // Round id rules mirror server's playRound:
239
+ // non-session → fresh UUID, client-supplied id is ignored
240
+ // session-based → reuse the active session's round id
241
+ const serverRoundId = actionDef.requires_session
242
+ ? this._activeRoundId
243
+ : generateRoundId();
244
+ this.executeLuaOnServer({ action, bet, roundId: serverRoundId, params })
131
245
  .then((result) => {
246
+ this._lastPlayResult = result;
247
+ this.updateSessionState(result);
132
248
  this._bridge?.send('PLAY_RESULT', result, id);
133
249
  })
134
250
  .catch((err) => {
135
251
  console.error('[DevBridge] Lua server error:', err);
136
252
  this._balance += debit;
137
- this._bridge?.send('PLAY_RESULT', this.buildFallbackResult(action, bet, roundId), id);
253
+ this.sendError(id, 'ENGINE_ERROR', err?.message ?? 'lua execution failed');
138
254
  });
139
255
  }
140
256
  else {
141
257
  // Fallback to onPlay callback
258
+ const { roundId } = payload;
142
259
  const customResult = this._config.onPlay({ action, bet, roundId, params });
143
260
  const totalWin = customResult.totalWin ?? (Math.random() > 0.6 ? bet * (1 + Math.random() * 10) : 0);
144
261
  this._balance += totalWin;
@@ -155,70 +272,59 @@ class DevBridge {
155
272
  currency: this._config.currency,
156
273
  gameId: this._config.gameConfig?.id ?? 'dev-game',
157
274
  };
275
+ this._lastPlayResult = result;
158
276
  this.delayedSend('PLAY_RESULT', result, id);
159
277
  }
160
278
  }
279
+ /** Send a PLAY_ERROR correlated to the original PLAY_REQUEST id. */
280
+ sendError(id, code, message) {
281
+ this._bridge?.send('PLAY_ERROR', { code, message }, id);
282
+ }
283
+ /**
284
+ * Refresh tracked session state from the latest PlayResult.
285
+ * - new/ongoing session → remember roundId + (re)set expiry
286
+ * - completed/no session → clear tracking
287
+ */
288
+ updateSessionState(result) {
289
+ const session = result.session;
290
+ if (session && !session.completed) {
291
+ if (this._activeRoundId === null) {
292
+ this._activeRoundId = result.roundId;
293
+ this._sessionExpiresAt = Date.now() + this._sessionTtlMs;
294
+ }
295
+ }
296
+ else {
297
+ this.clearSessionState();
298
+ }
299
+ }
300
+ /** Drop active-session tracking (called on completion or expiry sweep). */
301
+ clearSessionState() {
302
+ this._activeRoundId = null;
303
+ this._sessionExpiresAt = null;
304
+ }
161
305
  /**
162
306
  * Compute the wallet debit for a play request, mirroring the platform's
163
- * server-side rules:
164
- * - debit: 'bet' → bet
165
- * - debit: 'buy_bonus_cost' → bet × buy_bonus.modes[mode].cost_multiplier
166
- * - debit: 'ante_bet_cost' bet × ante_bet.cost_multiplier
167
- * - debit: 'none' → 0 (session continuations, e.g. free spins)
168
- *
169
- * Without a gameDefinition (or when the action is unknown), falls back to
170
- * `bet` and warns. This is the dev-mode behavior the previous
171
- * implementation always used for every action — kept here as a safe
172
- * default so existing setups don't silently change semantics.
307
+ * v5 ActionDefinition.DebitAmount:
308
+ * - debit: 'bet' → bet × (cost_multiplier || 1)
309
+ * - debit: 'none'/missing0
310
+ * - any other value 0 (legacy v4 modes like 'buy_bonus_cost'
311
+ * are no longer recognized; surfacing as 0
312
+ * forces config breakage to the surface)
173
313
  *
174
- * Note: in the platform protocol the client sends the *base* bet only
175
- * (`PlayParams.bet`); the cost multiplier lives in the GameDefinition.
176
- * Session continuations (free_spin, feature_spin) must be invoked with
177
- * `bet: 0` — LuaEngine pulls the active session's bet from the persisted
178
- * session state.
314
+ * The action carries its own cost (cost_multiplier + opaque feature_data).
315
+ * No top-level buy_bonus/ante_bet blocks. No params.ante_bet flag — ante
316
+ * is just a separate action with its own cost_multiplier.
179
317
  */
180
- computeDebit(action, bet, params) {
181
- const def = this._config.gameDefinition;
182
- const actionDef = def?.actions?.[action];
183
- if (!def || !actionDef) {
184
- if (this._config.debug) {
185
- console.warn(`[DevBridge] Unknown action "${action}" — debiting base bet as fallback.`);
186
- }
187
- return bet;
318
+ computeDebit(action, bet, _params) {
319
+ const actionDef = this._config.gameDefinition?.actions?.[action];
320
+ if (!actionDef || actionDef.debit !== 'bet') {
321
+ return 0;
188
322
  }
189
- switch (actionDef.debit) {
190
- case 'none':
191
- return 0;
192
- case 'buy_bonus_cost': {
193
- const modeName = actionDef.buy_bonus_mode;
194
- const mode = modeName ? def.buy_bonus?.modes?.[modeName] : undefined;
195
- if (!mode) {
196
- console.warn(`[DevBridge] Action "${action}" has debit: "buy_bonus_cost" but no matching buy_bonus mode (${modeName ?? '<unset>'}). Falling back to base bet.`);
197
- return bet;
198
- }
199
- return bet * mode.cost_multiplier;
200
- }
201
- case 'ante_bet_cost': {
202
- const multiplier = def.ante_bet?.cost_multiplier;
203
- if (typeof multiplier !== 'number') {
204
- console.warn(`[DevBridge] Action "${action}" has debit: "ante_bet_cost" but no ante_bet.cost_multiplier defined. Falling back to base bet.`);
205
- return bet;
206
- }
207
- return bet * multiplier;
208
- }
209
- case 'bet':
210
- default: {
211
- // The platform also debits ante_bet pricing on regular `bet` actions
212
- // when the client signals it via params.ante_bet. Mirror that here.
213
- if (params && params['ante_bet'] === true) {
214
- const multiplier = def.ante_bet?.cost_multiplier;
215
- if (typeof multiplier === 'number') {
216
- return bet * multiplier;
217
- }
218
- }
219
- return bet;
220
- }
323
+ const mult = actionDef.cost_multiplier;
324
+ if (typeof mult === 'number' && mult > 0 && mult !== 1) {
325
+ return bet * mult;
221
326
  }
327
+ return bet;
222
328
  }
223
329
  async executeLuaOnServer(params) {
224
330
  const response = await fetch('/__lua-play', {
@@ -246,21 +352,9 @@ class DevBridge {
246
352
  data: luaResult.data,
247
353
  nextActions: luaResult.nextActions,
248
354
  session: luaResult.session,
249
- creditPending: !shouldCredit,
250
- bonusFreeSpin: null,
251
- currency: this._config.currency,
252
- gameId: this._config.gameConfig?.id ?? 'dev-game',
253
- };
254
- }
255
- buildFallbackResult(action, bet, roundId) {
256
- return {
257
- roundId: roundId ?? `dev-round-${this._roundCounter}`,
258
- action,
259
- balanceAfter: this._balance,
260
- totalWin: 0,
261
- data: { error: 'Lua execution failed' },
262
- nextActions: ['spin'],
263
- session: null,
355
+ // creditPending=true on the wire means "wallet credit failed, queued
356
+ // for retry" — not "credit deferred until session completes". DevBridge
357
+ // never simulates credit failures, so this is always false.
264
358
  creditPending: false,
265
359
  bonusFreeSpin: null,
266
360
  currency: this._config.currency,
@@ -276,7 +370,14 @@ class DevBridge {
276
370
  this.delayedSend('BALANCE_UPDATE', { balance: this._balance }, id);
277
371
  }
278
372
  handleGetState(id) {
279
- this.delayedSend('STATE_RESPONSE', { session: this._config.session ?? null }, id);
373
+ // Mirror the platform's GET /games/{id}/session: the response wraps the
374
+ // last PlayResult-shaped snapshot, which the SDK reads back as
375
+ // `payload.session.session` (SessionData) and `payload.session.balanceAfter`.
376
+ // Only surface it while a session is active and not yet completed —
377
+ // matches GameUseCase.GetActiveSession.
378
+ const last = this._lastPlayResult;
379
+ const session = last && last.session && !last.session.completed ? last : null;
380
+ this.delayedSend('STATE_RESPONSE', { session }, id);
280
381
  }
281
382
  handleOpenDeposit() {
282
383
  if (this._config.debug) {
@@ -1 +1 @@
1
- {"version":3,"file":"dev-bridge.cjs.js","sources":["../src/dev-bridge/DevBridge.ts"],"sourcesContent":[null],"names":["Bridge"],"mappings":";;;;AAqCA,MAAM,cAAc,GAAgF;AAClG,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,UAAU,EAAE;AACV,QAAA,EAAE,EAAE,UAAU;AACd,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AACvC,QAAA,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAChD,KAAA;AACD,IAAA,SAAS,EAAE,UAAU;AACrB,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,MAAM,EAAE,OAAO,EAAE,CAAC;AAClB,IAAA,YAAY,EAAE,GAAG;AACjB,IAAA,KAAK,EAAE,IAAI;CACZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;MACU,SAAS,CAAA;AACZ,IAAA,OAAO;AACP,IAAA,QAAQ;IACR,aAAa,GAAG,CAAC;IACjB,OAAO,GAAkB,IAAI;AAC7B,IAAA,aAAa;AAErB,IAAA,WAAA,CAAY,SAA0B,EAAE,EAAA;QACtC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;AACpC,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;IAChF;;AAGA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;IACtB;;IAGA,KAAK,GAAA;QACH,IAAI,IAAI,CAAC,OAAO;YAAE;QAElB,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,IAAI,CAAC,OAAO,CAAC;QAEhE,IAAI,CAAC,OAAO,GAAG,IAAIA,cAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;AAEvE,QAAA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,QAAiB,EAAE,EAAW,KAAI;AAC/D,YAAA,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;AAC1B,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,OAAmB,EAAE,EAAW,KAAI;AACnE,YAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC;AACrC,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,OAA6B,KAAI;AACnE,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7B,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,QAAiB,EAAE,EAAW,KAAI;AAChE,YAAA,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;AAC3B,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAiB,EAAE,EAAW,KAAI;AAC9D,YAAA,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;AACzB,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,MAAK;YACnC,IAAI,CAAC,iBAAiB,EAAE;AAC1B,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACtB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,GAAG,mBAAmB,GAAG,iBAAiB;AACzE,YAAA,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAA,CAAE,CAAC;QACpD;IACF;;IAGA,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACtB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACtB,YAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACpC;IACF;;AAGA,IAAA,UAAU,CAAC,OAAe,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;AACvB,QAAA,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClE;;IAGA,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,EAAE;IACb;;AAIQ,IAAA,eAAe,CAAC,EAAW,EAAA;AACjC,QAAA,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,IAAI,CAAC,QAAQ;AACtB,YAAA,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;AAC/B,YAAA,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAA4B;AACjD,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;AAC7B,YAAA,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;SAClC;QAED,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;IACxC;IAEQ,iBAAiB,CACvB,OAAmB,EACnB,EAAW,EAAA;QAEX,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO;QAChD,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;;;;AAItB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC;AACpD,YAAA,IAAI,CAAC,QAAQ,IAAI,KAAK;AAEtB,YAAA,IAAI,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE;AACrD,iBAAA,IAAI,CAAC,CAAC,MAAM,KAAI;gBACf,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;AAC/C,YAAA,CAAC;AACA,iBAAA,KAAK,CAAC,CAAC,GAAG,KAAI;AACb,gBAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC;AACnD,gBAAA,IAAI,CAAC,QAAQ,IAAI,KAAK;gBACtB,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;AACvF,YAAA,CAAC,CAAC;QACN;aAAO;;AAEL,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC1E,YAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpG,YAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ;AAEzB,YAAA,MAAM,MAAM,GAAmB;AAC7B,gBAAA,OAAO,EAAE,OAAO,IAAI,aAAa,IAAI,CAAC,aAAa,CAAA,CAAE;gBACrD,MAAM;gBACN,YAAY,EAAE,IAAI,CAAC,QAAQ;gBAC3B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG;AAC1C,gBAAA,IAAI,EAAE,YAAY,CAAC,IAAI,IAAI,EAAE;AAC7B,gBAAA,WAAW,EAAE,YAAY,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC;AACjD,gBAAA,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,IAAI;AACrC,gBAAA,aAAa,EAAE,KAAK;AACpB,gBAAA,aAAa,EAAE,YAAY,CAAC,aAAa,IAAI,IAAI;AACjD,gBAAA,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;gBAC/B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,UAAU;aAClD;YAED,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;QAC7C;IACF;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AACK,IAAA,YAAY,CAClB,MAAc,EACd,GAAW,EACX,MAA2C,EAAA;AAE3C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc;QACvC,MAAM,SAAS,GAAG,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC;AAExC,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;AACtB,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACtB,gBAAA,OAAO,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAA,kCAAA,CAAoC,CAAC;YACzF;AACA,YAAA,OAAO,GAAG;QACZ;AAEA,QAAA,QAAQ,SAAS,CAAC,KAAK;AACrB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,CAAC;YACV,KAAK,gBAAgB,EAAE;AACrB,gBAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc;AACzC,gBAAA,MAAM,IAAI,GAAG,QAAQ,GAAG,GAAG,CAAC,SAAS,EAAE,KAAK,GAAG,QAAQ,CAAC,GAAG,SAAS;gBACpE,IAAI,CAAC,IAAI,EAAE;oBACT,OAAO,CAAC,IAAI,CACV,CAAA,oBAAA,EAAuB,MAAM,CAAA,8DAAA,EAAiE,QAAQ,IAAI,SAAS,CAAA,4BAAA,CAA8B,CAClJ;AACD,oBAAA,OAAO,GAAG;gBACZ;AACA,gBAAA,OAAO,GAAG,GAAG,IAAI,CAAC,eAAe;YACnC;YACA,KAAK,eAAe,EAAE;AACpB,gBAAA,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,eAAe;AAChD,gBAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;AAClC,oBAAA,OAAO,CAAC,IAAI,CACV,uBAAuB,MAAM,CAAA,+FAAA,CAAiG,CAC/H;AACD,oBAAA,OAAO,GAAG;gBACZ;gBACA,OAAO,GAAG,GAAG,UAAU;YACzB;AACA,YAAA,KAAK,KAAK;YACV,SAAS;;;gBAGP,IAAI,MAAM,IAAK,MAAkC,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;AACtE,oBAAA,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,eAAe;AAChD,oBAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;wBAClC,OAAO,GAAG,GAAG,UAAU;oBACzB;gBACF;AACA,gBAAA,OAAO,GAAG;YACZ;;IAEJ;IAEQ,MAAM,kBAAkB,CAAC,MAAkB,EAAA;AACjD,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE;AAC1C,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;AAC/C,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;AAC7B,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;AAC3E,YAAA,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA,KAAA,EAAQ,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;QACzD;AAEA,QAAA,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;;;;AAKvC,QAAA,MAAM,YAAY,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,SAAS;QACtE,IAAI,YAAY,IAAI,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ;QACrC;QAEA,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAA,UAAA,EAAa,IAAI,CAAC,aAAa,CAAA,CAAE;YAC5D,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,YAAY,EAAE,IAAI,CAAC,QAAQ;AAC3B,YAAA,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG;YACpD,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,aAAa,EAAE,CAAC,YAAY;AAC5B,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;YAC/B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,UAAU;SAClD;IACH;AAEQ,IAAA,mBAAmB,CAAC,MAAc,EAAE,GAAW,EAAE,OAAgB,EAAA;QACvE,OAAO;AACL,YAAA,OAAO,EAAE,OAAO,IAAI,aAAa,IAAI,CAAC,aAAa,CAAA,CAAE;YACrD,MAAM;YACN,YAAY,EAAE,IAAI,CAAC,QAAQ;AAC3B,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,IAAI,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE;YACvC,WAAW,EAAE,CAAC,MAAM,CAAC;AACrB,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,aAAa,EAAE,KAAK;AACpB,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;YAC/B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,UAAU;SAClD;IACH;AAEQ,IAAA,aAAa,CAAC,QAA8B,EAAA;AAClD,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACtB,YAAA,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;QAC9C;IACF;AAEQ,IAAA,gBAAgB,CAAC,EAAW,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;IACpE;AAEQ,IAAA,cAAc,CAAC,EAAW,EAAA;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC;IACnF;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACtB,YAAA,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC;QACvE;AACA,QAAA,IAAI,CAAC,QAAQ,IAAI,IAAI;AACrB,QAAA,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClE;;AAIQ,IAAA,WAAW,CAAC,IAAuB,EAAE,OAAgB,EAAE,EAAW,EAAA;AACxE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;AACvC,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC;QAChE;aAAO;YACL,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;QACvC;IACF;AACD;;;;"}
1
+ {"version":3,"file":"dev-bridge.cjs.js","sources":["../src/dev-bridge/DevBridge.ts"],"sourcesContent":[null],"names":["Bridge"],"mappings":"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"}
@@ -6,9 +6,13 @@ interface GameDefinition {
6
6
  actions: Record<string, ActionDefinition>;
7
7
  bet_levels?: number[] | BetLevelsConfig;
8
8
  max_win?: MaxWinConfig;
9
- buy_bonus?: BuyBonusConfig;
10
- ante_bet?: AnteBetConfig;
11
9
  persistent_state?: PersistentStateConfig;
10
+ /**
11
+ * Session expiry duration as a Go-style duration string ("24h", "2h", "5ms").
12
+ * Mirrors the platform's GameDefinition.SessionTTL — defaults to 24h on
13
+ * the server when absent. Used by DevBridge to surface SESSION_EXPIRED.
14
+ */
15
+ session_ttl?: string;
12
16
  }
13
17
  interface BetLevelsConfig {
14
18
  levels?: number[];
@@ -19,29 +23,31 @@ interface MaxWinConfig {
19
23
  multiplier?: number;
20
24
  fixed?: number;
21
25
  }
22
- interface BuyBonusConfig {
23
- modes: Record<string, BuyBonusMode>;
24
- }
25
- interface BuyBonusMode {
26
- cost_multiplier: number;
27
- /** Distribution of forced scatter counts. Optional — if omitted, Lua script handles bonus setup itself. */
28
- scatter_distribution?: Record<string, number>;
29
- /** Optional description */
30
- description?: string;
31
- }
32
- interface AnteBetConfig {
33
- cost_multiplier: number;
34
- }
35
26
  interface PersistentStateConfig {
36
27
  vars: string[];
37
28
  exposed_vars: string[];
38
29
  }
30
+ /**
31
+ * v5 action contract — cost_multiplier and feature_data live on the action
32
+ * itself. Removed in v5: top-level `buy_bonus`/`ante_bet` blocks, debit modes
33
+ * `'buy_bonus_cost'`/`'ante_bet_cost'`, action.buy_bonus_mode, params.ante_bet/
34
+ * params.buy_bonus flags. Lua reads action context via `state.action` and
35
+ * `state.action_config = { cost_multiplier, feature_data }`.
36
+ */
39
37
  interface ActionDefinition {
40
38
  stage: string;
41
- debit: 'bet' | 'buy_bonus_cost' | 'ante_bet_cost' | 'none';
39
+ /** Either 'bet' (debit = bet × cost_multiplier) or 'none'/empty (no debit). */
40
+ debit: 'bet' | 'none';
41
+ /** Multiplier on `bet` when debit==='bet'. Defaults to 1.0. */
42
+ cost_multiplier?: number;
43
+ /**
44
+ * Opaque action-specific configuration exposed to Lua as
45
+ * `state.action_config.feature_data`. Common keys: `scatter_distribution`
46
+ * for buy-bonus actions, forced symbol counts, etc.
47
+ */
48
+ feature_data?: Record<string, unknown>;
42
49
  credit?: 'win' | 'none' | 'defer';
43
50
  requires_session?: boolean;
44
- buy_bonus_mode?: string;
45
51
  transitions: TransitionRule[];
46
52
  input_schema?: Record<string, unknown>;
47
53
  }
@@ -115,6 +121,14 @@ declare class DevBridge {
115
121
  private _roundCounter;
116
122
  private _bridge;
117
123
  private _useLuaServer;
124
+ /** Last PlayResult sent — mirrors what `GET /games/{id}/session` returns. */
125
+ private _lastPlayResult;
126
+ /** Active session round id; non-null while a session is in progress. */
127
+ private _activeRoundId;
128
+ /** Wall-clock expiry timestamp for the active session. */
129
+ private _sessionExpiresAt;
130
+ /** Pre-parsed session TTL from gameDefinition.session_ttl. */
131
+ private _sessionTtlMs;
118
132
  constructor(config?: DevBridgeConfig);
119
133
  /** Current mock balance */
120
134
  get balance(): number;
@@ -128,28 +142,31 @@ declare class DevBridge {
128
142
  destroy(): void;
129
143
  private handleGameReady;
130
144
  private handlePlayRequest;
145
+ /** Send a PLAY_ERROR correlated to the original PLAY_REQUEST id. */
146
+ private sendError;
147
+ /**
148
+ * Refresh tracked session state from the latest PlayResult.
149
+ * - new/ongoing session → remember roundId + (re)set expiry
150
+ * - completed/no session → clear tracking
151
+ */
152
+ private updateSessionState;
153
+ /** Drop active-session tracking (called on completion or expiry sweep). */
154
+ private clearSessionState;
131
155
  /**
132
156
  * Compute the wallet debit for a play request, mirroring the platform's
133
- * server-side rules:
134
- * - debit: 'bet' → bet
135
- * - debit: 'buy_bonus_cost' → bet × buy_bonus.modes[mode].cost_multiplier
136
- * - debit: 'ante_bet_cost' bet × ante_bet.cost_multiplier
137
- * - debit: 'none' → 0 (session continuations, e.g. free spins)
138
- *
139
- * Without a gameDefinition (or when the action is unknown), falls back to
140
- * `bet` and warns. This is the dev-mode behavior the previous
141
- * implementation always used for every action — kept here as a safe
142
- * default so existing setups don't silently change semantics.
157
+ * v5 ActionDefinition.DebitAmount:
158
+ * - debit: 'bet' → bet × (cost_multiplier || 1)
159
+ * - debit: 'none'/missing0
160
+ * - any other value 0 (legacy v4 modes like 'buy_bonus_cost'
161
+ * are no longer recognized; surfacing as 0
162
+ * forces config breakage to the surface)
143
163
  *
144
- * Note: in the platform protocol the client sends the *base* bet only
145
- * (`PlayParams.bet`); the cost multiplier lives in the GameDefinition.
146
- * Session continuations (free_spin, feature_spin) must be invoked with
147
- * `bet: 0` — LuaEngine pulls the active session's bet from the persisted
148
- * session state.
164
+ * The action carries its own cost (cost_multiplier + opaque feature_data).
165
+ * No top-level buy_bonus/ante_bet blocks. No params.ante_bet flag — ante
166
+ * is just a separate action with its own cost_multiplier.
149
167
  */
150
168
  private computeDebit;
151
169
  private executeLuaOnServer;
152
- private buildFallbackResult;
153
170
  private handlePlayAck;
154
171
  private handleGetBalance;
155
172
  private handleGetState;