@omnitronix/lucky-sharky-game-engine 1.0.9 → 1.2.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 +10 -0
- package/dist/__tests__/base-game.test.d.ts +2 -0
- package/dist/__tests__/base-game.test.d.ts.map +1 -0
- package/dist/__tests__/base-game.test.js +262 -0
- package/dist/__tests__/base-game.test.js.map +1 -0
- package/dist/__tests__/bonus-handlers.test.d.ts +2 -0
- package/dist/__tests__/bonus-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/bonus-handlers.test.js +243 -0
- package/dist/__tests__/bonus-handlers.test.js.map +1 -0
- package/dist/__tests__/error-paths.test.d.ts +2 -0
- package/dist/__tests__/error-paths.test.d.ts.map +1 -0
- package/dist/__tests__/error-paths.test.js +328 -0
- package/dist/__tests__/error-paths.test.js.map +1 -0
- package/dist/__tests__/free-spins-handler.test.d.ts +2 -0
- package/dist/__tests__/free-spins-handler.test.d.ts.map +1 -0
- package/dist/__tests__/free-spins-handler.test.js +410 -0
- package/dist/__tests__/free-spins-handler.test.js.map +1 -0
- package/dist/__tests__/helpers/test-engine-factory.d.ts +98 -0
- package/dist/__tests__/helpers/test-engine-factory.d.ts.map +1 -0
- package/dist/__tests__/helpers/test-engine-factory.js +236 -0
- package/dist/__tests__/helpers/test-engine-factory.js.map +1 -0
- package/dist/__tests__/hold-win-handler.test.d.ts +2 -0
- package/dist/__tests__/hold-win-handler.test.d.ts.map +1 -0
- package/dist/__tests__/hold-win-handler.test.js +481 -0
- package/dist/__tests__/hold-win-handler.test.js.map +1 -0
- package/dist/__tests__/rng-gli19-compliance.test.d.ts +0 -4
- package/dist/__tests__/rng-gli19-compliance.test.d.ts.map +1 -1
- package/dist/__tests__/rng-gli19-compliance.test.js +232 -198
- package/dist/__tests__/rng-gli19-compliance.test.js.map +1 -1
- package/dist/__tests__/rng-security.test.d.ts +2 -0
- package/dist/__tests__/rng-security.test.d.ts.map +1 -0
- package/dist/__tests__/rng-security.test.js +379 -0
- package/dist/__tests__/rng-security.test.js.map +1 -0
- package/dist/__tests__/rtp-simulation.test.d.ts +0 -4
- package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -1
- package/dist/__tests__/rtp-simulation.test.js +228 -153
- package/dist/__tests__/rtp-simulation.test.js.map +1 -1
- package/dist/__tests__/spin-generator.test.d.ts +2 -0
- package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
- package/dist/__tests__/spin-generator.test.js +375 -0
- package/dist/__tests__/spin-generator.test.js.map +1 -0
- package/dist/__tests__/state-transitions.test.d.ts +2 -0
- package/dist/__tests__/state-transitions.test.d.ts.map +1 -0
- package/dist/__tests__/state-transitions.test.js +249 -0
- package/dist/__tests__/state-transitions.test.js.map +1 -0
- package/dist/__tests__/symbol-distribution.test.d.ts +2 -0
- package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
- package/dist/__tests__/symbol-distribution.test.js +210 -0
- package/dist/__tests__/symbol-distribution.test.js.map +1 -0
- package/dist/__tests__/win-calculator.test.d.ts +2 -0
- package/dist/__tests__/win-calculator.test.d.ts.map +1 -0
- package/dist/__tests__/win-calculator.test.js +516 -0
- package/dist/__tests__/win-calculator.test.js.map +1 -0
- package/dist/config/game-logic-config/game-logic-config.d.ts.map +1 -1
- package/dist/config/game-logic-config/game-logic-config.js +0 -25
- package/dist/config/game-logic-config/game-logic-config.js.map +1 -1
- package/dist/config/reel-strips-config/reels-BASE.csv +0 -0
- package/dist/config/reel-strips-config/reels-FREESPINS.csv +0 -0
- package/dist/game-engine.interface.d.ts +2 -0
- package/dist/game-engine.interface.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/logic/game-logic-config.interface.d.ts +0 -8
- package/dist/logic/game-logic-config.interface.d.ts.map +1 -1
- package/dist/logic/handlers/base-game.handler.d.ts.map +1 -1
- package/dist/logic/handlers/base-game.handler.js +3 -6
- package/dist/logic/handlers/base-game.handler.js.map +1 -1
- package/dist/logic/handlers/free-spins.handler.d.ts.map +1 -1
- package/dist/logic/handlers/free-spins.handler.js +2 -2
- package/dist/logic/handlers/free-spins.handler.js.map +1 -1
- package/dist/logic/handlers/hold-win-bonus.handler.d.ts +0 -5
- package/dist/logic/handlers/hold-win-bonus.handler.d.ts.map +1 -1
- package/dist/logic/handlers/hold-win-bonus.handler.js +28 -181
- package/dist/logic/handlers/hold-win-bonus.handler.js.map +1 -1
- package/dist/logic/lucky-sharky.spin-generator.d.ts +2 -2
- package/dist/logic/lucky-sharky.spin-generator.d.ts.map +1 -1
- package/dist/logic/lucky-sharky.spin-generator.js +61 -161
- package/dist/logic/lucky-sharky.spin-generator.js.map +1 -1
- package/dist/logic/lucky-sharky.types.d.ts +0 -6
- package/dist/logic/lucky-sharky.types.d.ts.map +1 -1
- package/dist/logic/lucky-sharky.types.js.map +1 -1
- package/dist/logic/lucky-sharky.win-calculator.d.ts.map +1 -1
- package/dist/logic/lucky-sharky.win-calculator.js +4 -9
- package/dist/logic/lucky-sharky.win-calculator.js.map +1 -1
- package/dist/lucky-sharky-v1.game-engine.d.ts +2 -2
- package/dist/lucky-sharky-v1.game-engine.d.ts.map +1 -1
- package/dist/lucky-sharky-v1.game-engine.js +2 -2
- package/dist/lucky-sharky-v1.game-engine.js.map +1 -1
- package/dist/rng/rng-client.factory.d.ts.map +1 -1
- package/dist/rng/rng-client.factory.js +1 -45
- package/dist/rng/rng-client.factory.js.map +1 -1
- package/package.json +4 -3
- package/dist/__tests__/rng-seed-security.test.d.ts +0 -6
- package/dist/__tests__/rng-seed-security.test.d.ts.map +0 -1
- package/dist/__tests__/rng-seed-security.test.js +0 -263
- package/dist/__tests__/rng-seed-security.test.js.map +0 -1
- package/dist/__tests__/rng-seed-type.test.d.ts +0 -16
- package/dist/__tests__/rng-seed-type.test.d.ts.map +0 -1
- package/dist/__tests__/rng-seed-type.test.js +0 -288
- package/dist/__tests__/rng-seed-type.test.js.map +0 -1
- package/dist/__tests__/rng-stress-boundary.test.d.ts +0 -5
- package/dist/__tests__/rng-stress-boundary.test.d.ts.map +0 -1
- package/dist/__tests__/rng-stress-boundary.test.js +0 -395
- package/dist/__tests__/rng-stress-boundary.test.js.map +0 -1
- package/dist/logger/logger.d.ts +0 -9
- package/dist/logger/logger.d.ts.map +0 -1
- package/dist/logger/logger.js +0 -35
- package/dist/logger/logger.js.map +0 -1
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* RNG Security Tests — Lucky Sharky
|
|
5
|
+
*
|
|
6
|
+
* Tests attack surface hardening for the RNG system:
|
|
7
|
+
* - Seed injection attacks
|
|
8
|
+
* - Type confusion
|
|
9
|
+
* - Integer overflow/underflow
|
|
10
|
+
* - Replay attack prevention
|
|
11
|
+
* - RNG isolation between commands
|
|
12
|
+
*/
|
|
13
|
+
const test_engine_factory_1 = require("./helpers/test-engine-factory");
|
|
14
|
+
describe('RNG Security — Lucky Sharky', () => {
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
(0, test_engine_factory_1.resetCommandIdCounter)();
|
|
17
|
+
});
|
|
18
|
+
describe('Seed Injection Attacks', () => {
|
|
19
|
+
it('should handle undefined seed gracefully', async () => {
|
|
20
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
21
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
22
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
23
|
+
expect(result.success).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
it('should handle null state gracefully for INIT', async () => {
|
|
26
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
27
|
+
await (0, test_engine_factory_1.waitForEngineReady)(engine);
|
|
28
|
+
const result = await engine.processCommand(null, null, {
|
|
29
|
+
id: (0, test_engine_factory_1.nextCommandId)('init'),
|
|
30
|
+
type: 'INIT_SESSION_STATE',
|
|
31
|
+
payload: { betAmountThresholds: [1.0], defaultBetAmount: 1.0 },
|
|
32
|
+
});
|
|
33
|
+
expect(result.success).toBe(true);
|
|
34
|
+
expect(result.publicState).toBeDefined();
|
|
35
|
+
expect(result.privateState).toBeDefined();
|
|
36
|
+
// Validate structure: publicState and privateState should be objects
|
|
37
|
+
expect(typeof result.publicState).toBe('object');
|
|
38
|
+
expect(typeof result.privateState).toBe('object');
|
|
39
|
+
});
|
|
40
|
+
it('should reject spin with missing public state', async () => {
|
|
41
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
42
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
43
|
+
try {
|
|
44
|
+
await (0, test_engine_factory_1.executeSpin)(engine, null, session.privateState);
|
|
45
|
+
// If it doesn't throw, that's also acceptable
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
expect(error).toBeInstanceOf(Error);
|
|
49
|
+
expect(error.message).toBeDefined();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
it('should reject spin with missing private state', async () => {
|
|
53
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
54
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
55
|
+
try {
|
|
56
|
+
await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, null);
|
|
57
|
+
// If it doesn't throw, that's also acceptable
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
expect(error).toBeInstanceOf(Error);
|
|
61
|
+
expect(error.message).toBeDefined();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('Type Confusion', () => {
|
|
66
|
+
it('should handle string bet amount', async () => {
|
|
67
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
68
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
69
|
+
const result = await engine.processCommand(session.publicState, session.privateState, {
|
|
70
|
+
id: (0, test_engine_factory_1.nextCommandId)('spin'),
|
|
71
|
+
type: 'SPIN',
|
|
72
|
+
payload: {
|
|
73
|
+
sessionId: 'test',
|
|
74
|
+
betAmount: '1.0',
|
|
75
|
+
creditsPerLine: 1,
|
|
76
|
+
gameId: 'lucky-sharky',
|
|
77
|
+
gameVersion: '1.0.0',
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
// Should either succeed with coercion or fail gracefully
|
|
81
|
+
expect(result).toBeDefined();
|
|
82
|
+
});
|
|
83
|
+
it('should handle negative bet amount', async () => {
|
|
84
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
85
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
86
|
+
try {
|
|
87
|
+
const result = await engine.processCommand(session.publicState, session.privateState, {
|
|
88
|
+
id: (0, test_engine_factory_1.nextCommandId)('spin'),
|
|
89
|
+
type: 'SPIN',
|
|
90
|
+
payload: {
|
|
91
|
+
sessionId: 'test',
|
|
92
|
+
betAmount: -1.0,
|
|
93
|
+
creditsPerLine: 1,
|
|
94
|
+
gameId: 'lucky-sharky',
|
|
95
|
+
gameVersion: '1.0.0',
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
// If no exception, verify it doesn't produce negative wins
|
|
99
|
+
if (result.success && result.outcome) {
|
|
100
|
+
expect(result.outcome.totalWin).toBeGreaterThanOrEqual(0);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
expect(error).toBeInstanceOf(Error);
|
|
105
|
+
expect(error.message).toBeDefined();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
it('should handle zero bet amount', async () => {
|
|
109
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
110
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
111
|
+
try {
|
|
112
|
+
const result = await engine.processCommand(session.publicState, session.privateState, {
|
|
113
|
+
id: (0, test_engine_factory_1.nextCommandId)('spin'),
|
|
114
|
+
type: 'SPIN',
|
|
115
|
+
payload: {
|
|
116
|
+
sessionId: 'test',
|
|
117
|
+
betAmount: 0,
|
|
118
|
+
creditsPerLine: 1,
|
|
119
|
+
gameId: 'lucky-sharky',
|
|
120
|
+
gameVersion: '1.0.0',
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
// If no exception, result should have valid structure
|
|
124
|
+
expect(typeof result).toBe('object');
|
|
125
|
+
expect(typeof result.success).toBe('boolean');
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
expect(error).toBeInstanceOf(Error);
|
|
129
|
+
expect(error.message).toBeDefined();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
it('should handle NaN bet amount', async () => {
|
|
133
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
134
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
135
|
+
try {
|
|
136
|
+
const result = await engine.processCommand(session.publicState, session.privateState, {
|
|
137
|
+
id: (0, test_engine_factory_1.nextCommandId)('spin'),
|
|
138
|
+
type: 'SPIN',
|
|
139
|
+
payload: {
|
|
140
|
+
sessionId: 'test',
|
|
141
|
+
betAmount: NaN,
|
|
142
|
+
creditsPerLine: 1,
|
|
143
|
+
gameId: 'lucky-sharky',
|
|
144
|
+
gameVersion: '1.0.0',
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
// If no exception, result should have valid structure
|
|
148
|
+
expect(typeof result).toBe('object');
|
|
149
|
+
expect(typeof result.success).toBe('boolean');
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
expect(error).toBeInstanceOf(Error);
|
|
153
|
+
expect(error.message).toBeDefined();
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
it('should handle Infinity bet amount', async () => {
|
|
157
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
158
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
159
|
+
try {
|
|
160
|
+
const result = await engine.processCommand(session.publicState, session.privateState, {
|
|
161
|
+
id: (0, test_engine_factory_1.nextCommandId)('spin'),
|
|
162
|
+
type: 'SPIN',
|
|
163
|
+
payload: {
|
|
164
|
+
sessionId: 'test',
|
|
165
|
+
betAmount: Infinity,
|
|
166
|
+
creditsPerLine: 1,
|
|
167
|
+
gameId: 'lucky-sharky',
|
|
168
|
+
gameVersion: '1.0.0',
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
// If no exception, result should have valid structure
|
|
172
|
+
expect(typeof result).toBe('object');
|
|
173
|
+
expect(typeof result.success).toBe('boolean');
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
expect(error).toBeInstanceOf(Error);
|
|
177
|
+
expect(error.message).toBeDefined();
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
describe('Integer Overflow/Underflow', () => {
|
|
182
|
+
it('should handle MAX_SAFE_INTEGER in RNG sequence', async () => {
|
|
183
|
+
const { engine } = (0, test_engine_factory_1.createEngineWithMockRng)([Number.MAX_SAFE_INTEGER]);
|
|
184
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
185
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
186
|
+
// Should handle gracefully - values clamped to range
|
|
187
|
+
expect(result.success).toBe(true);
|
|
188
|
+
const validation = (0, test_engine_factory_1.validateRngOutcome)(result.rngOutcome);
|
|
189
|
+
expect(validation.valid).toBe(true);
|
|
190
|
+
});
|
|
191
|
+
it('should handle negative values in RNG sequence', async () => {
|
|
192
|
+
const { engine } = (0, test_engine_factory_1.createEngineWithMockRng)([-1, -100, -999]);
|
|
193
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
194
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
195
|
+
expect(result.success).toBe(true);
|
|
196
|
+
// Results should be within valid bounds
|
|
197
|
+
for (const [, record] of Object.entries(result.rngOutcome || {})) {
|
|
198
|
+
const rec = record;
|
|
199
|
+
expect(rec.result).toBeGreaterThanOrEqual(rec.min);
|
|
200
|
+
expect(rec.result).toBeLessThanOrEqual(rec.max);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
it('should handle zero values in RNG sequence', async () => {
|
|
204
|
+
const { engine } = (0, test_engine_factory_1.createEngineWithMockRng)([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
|
205
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
206
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
207
|
+
expect(result.success).toBe(true);
|
|
208
|
+
});
|
|
209
|
+
it('should handle large values in RNG sequence', async () => {
|
|
210
|
+
const { engine } = (0, test_engine_factory_1.createEngineWithMockRng)([999999, 888888, 777777]);
|
|
211
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
212
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
213
|
+
expect(result.success).toBe(true);
|
|
214
|
+
for (const [, record] of Object.entries(result.rngOutcome || {})) {
|
|
215
|
+
const rec = record;
|
|
216
|
+
expect(rec.result).toBeGreaterThanOrEqual(rec.min);
|
|
217
|
+
expect(rec.result).toBeLessThanOrEqual(rec.max);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
describe('Prototype Pollution Defense', () => {
|
|
222
|
+
it('should not be affected by Object.prototype pollution', async () => {
|
|
223
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
224
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
225
|
+
// Attempt prototype pollution on state
|
|
226
|
+
const pollutedState = (0, test_engine_factory_1.cloneState)(session.privateState);
|
|
227
|
+
pollutedState.__proto__ = { malicious: true };
|
|
228
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, pollutedState);
|
|
229
|
+
expect(result.success).toBe(true);
|
|
230
|
+
});
|
|
231
|
+
it('should handle extra properties on state without issues', async () => {
|
|
232
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
233
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
234
|
+
const modifiedState = { ...session.privateState, extraProp: 'malicious', hack: true };
|
|
235
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, modifiedState);
|
|
236
|
+
expect(result.success).toBe(true);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
describe('Replay Attack Prevention', () => {
|
|
240
|
+
it('should produce different RNG outcomes for different command IDs', async () => {
|
|
241
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
242
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
243
|
+
const result1 = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
244
|
+
const result2 = await (0, test_engine_factory_1.executeSpin)(engine, result1.publicState, result1.privateState);
|
|
245
|
+
// Different commands should have different RNG outcomes
|
|
246
|
+
expect(result1.rngOutcome).not.toEqual(result2.rngOutcome);
|
|
247
|
+
});
|
|
248
|
+
it('should not allow state replay to get same outcome', async () => {
|
|
249
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
250
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
251
|
+
// Execute spin and save state before
|
|
252
|
+
const stateBefore = (0, test_engine_factory_1.cloneState)(session);
|
|
253
|
+
const result1 = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
254
|
+
// Try to replay with same state (DummyRngClient uses Math.random so results will differ)
|
|
255
|
+
const result2 = await (0, test_engine_factory_1.executeSpin)(engine, stateBefore.publicState, stateBefore.privateState);
|
|
256
|
+
// With non-deterministic RNG, replaying same state should give different outcomes
|
|
257
|
+
// (unless mock is used, which is intentional for testing)
|
|
258
|
+
expect(result1).toBeDefined();
|
|
259
|
+
expect(result2).toBeDefined();
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
describe('RNG Isolation Between Commands', () => {
|
|
263
|
+
it('should not leak RNG state between init and spin', async () => {
|
|
264
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
265
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
266
|
+
// The spin's RNG should be independent of init's RNG
|
|
267
|
+
const result = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
268
|
+
expect(result.success).toBe(true);
|
|
269
|
+
// RNG outcome should only contain actions from this spin
|
|
270
|
+
const actionIds = Object.keys(result.rngOutcome || {});
|
|
271
|
+
for (const id of actionIds) {
|
|
272
|
+
expect(id).not.toContain('init');
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
it('should isolate RNG between consecutive spins', async () => {
|
|
276
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
277
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
278
|
+
const result1 = await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
279
|
+
const result2 = await (0, test_engine_factory_1.executeSpin)(engine, result1.publicState, result1.privateState);
|
|
280
|
+
// Each spin should produce its own independent RNG outcome
|
|
281
|
+
expect(result1.rngOutcome).toBeDefined();
|
|
282
|
+
expect(result2.rngOutcome).toBeDefined();
|
|
283
|
+
// Validate structure: both must have at least 3 RNG calls
|
|
284
|
+
expect(Object.keys(result1.rngOutcome || {}).length).toBeGreaterThanOrEqual(3);
|
|
285
|
+
expect(Object.keys(result2.rngOutcome || {}).length).toBeGreaterThanOrEqual(3);
|
|
286
|
+
// Outcomes should differ (different random values even if action IDs repeat)
|
|
287
|
+
expect(result1.rngOutcome).not.toEqual(result2.rngOutcome);
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
describe('Command Type Validation', () => {
|
|
291
|
+
it('should reject unknown command types', async () => {
|
|
292
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
293
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
294
|
+
try {
|
|
295
|
+
const result = await engine.processCommand(session.publicState, session.privateState, {
|
|
296
|
+
id: (0, test_engine_factory_1.nextCommandId)('unknown'),
|
|
297
|
+
type: 'UNKNOWN_COMMAND',
|
|
298
|
+
payload: {},
|
|
299
|
+
});
|
|
300
|
+
// Should either fail or return error
|
|
301
|
+
expect(result.success).toBe(false);
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
expect(error).toBeInstanceOf(Error);
|
|
305
|
+
expect(error.message).toBeDefined();
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
it('should reject empty command type', async () => {
|
|
309
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
310
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
311
|
+
try {
|
|
312
|
+
const result = await engine.processCommand(session.publicState, session.privateState, {
|
|
313
|
+
id: (0, test_engine_factory_1.nextCommandId)('empty'),
|
|
314
|
+
type: '',
|
|
315
|
+
payload: {},
|
|
316
|
+
});
|
|
317
|
+
expect(result.success).toBe(false);
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
expect(error).toBeInstanceOf(Error);
|
|
321
|
+
expect(error.message).toBeDefined();
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
it('should handle missing command ID gracefully', async () => {
|
|
325
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
326
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
327
|
+
try {
|
|
328
|
+
const result = await engine.processCommand(session.publicState, session.privateState, {
|
|
329
|
+
id: '',
|
|
330
|
+
type: 'SPIN',
|
|
331
|
+
payload: {
|
|
332
|
+
sessionId: 'test',
|
|
333
|
+
betAmount: 1.0,
|
|
334
|
+
creditsPerLine: 1,
|
|
335
|
+
gameId: 'lucky-sharky',
|
|
336
|
+
gameVersion: '1.0.0',
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
// If no exception, result should have valid structure
|
|
340
|
+
expect(typeof result).toBe('object');
|
|
341
|
+
expect(typeof result.success).toBe('boolean');
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
expect(error).toBeInstanceOf(Error);
|
|
345
|
+
expect(error.message).toBeDefined();
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
describe('State Integrity', () => {
|
|
350
|
+
it('should not mutate input public state', async () => {
|
|
351
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
352
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
353
|
+
const originalPublic = (0, test_engine_factory_1.cloneState)(session.publicState);
|
|
354
|
+
await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
355
|
+
expect((0, test_engine_factory_1.statesEqual)(session.publicState, originalPublic)).toBe(true);
|
|
356
|
+
});
|
|
357
|
+
it('should not mutate input private state', async () => {
|
|
358
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
359
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
360
|
+
const originalPrivate = (0, test_engine_factory_1.cloneState)(session.privateState);
|
|
361
|
+
await (0, test_engine_factory_1.executeSpin)(engine, session.publicState, session.privateState);
|
|
362
|
+
expect((0, test_engine_factory_1.statesEqual)(session.privateState, originalPrivate)).toBe(true);
|
|
363
|
+
});
|
|
364
|
+
it('should return valid state after each spin', async () => {
|
|
365
|
+
const engine = (0, test_engine_factory_1.createEngine)();
|
|
366
|
+
const session = await (0, test_engine_factory_1.initSession)(engine);
|
|
367
|
+
const results = await (0, test_engine_factory_1.executeSpins)(engine, session.publicState, session.privateState, 5);
|
|
368
|
+
for (const result of results) {
|
|
369
|
+
expect(result.success).toBe(true);
|
|
370
|
+
expect(result.publicState).toBeDefined();
|
|
371
|
+
expect(result.privateState).toBeDefined();
|
|
372
|
+
// Validate structure: states should be objects
|
|
373
|
+
expect(typeof result.publicState).toBe('object');
|
|
374
|
+
expect(typeof result.privateState).toBe('object');
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
//# sourceMappingURL=rng-security.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rng-security.test.js","sourceRoot":"","sources":["../../src/__tests__/rng-security.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtp-simulation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rtp-simulation.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rtp-simulation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rtp-simulation.test.ts"],"names":[],"mappings":""}
|