@@ -9,13 +9,52 @@ import { WORLD_GAME_STATE_EVENT_TYPES } from './constants.js';
99import { isPlainObject } from '../../shared/utils/objectUtils.js' ;
1010import { toFiniteNumber } from '../../shared/math/numberNormalization.js' ;
1111
12+ const ALLOWED_TRANSITION_EVENT_TYPES = new Set ( Object . values ( WORLD_GAME_STATE_EVENT_TYPES ) ) ;
13+
1214function isPassiveModeContext ( context ) {
1315 if ( ! isPlainObject ( context ) ) return false ;
1416 if ( context . passiveMode === true ) return true ;
1517 if ( typeof context . mode === 'string' && context . mode . trim ( ) . toLowerCase ( ) === 'passive' ) return true ;
1618 return false ;
1719}
1820
21+ function validateTransitionEventType ( eventType , transitionName ) {
22+ const normalizedEventType = String ( eventType || '' ) . trim ( ) ;
23+ if ( ! ALLOWED_TRANSITION_EVENT_TYPES . has ( normalizedEventType ) ) {
24+ return {
25+ ok : false ,
26+ reason : `${ String ( transitionName || 'transition' ) } has unapproved eventType.`
27+ } ;
28+ }
29+ return { ok : true } ;
30+ }
31+
32+ function createWhitelistedTransition ( {
33+ transitionName,
34+ validate,
35+ eventType,
36+ authoritativeApply
37+ } ) {
38+ const baseValidate = typeof validate === 'function'
39+ ? validate
40+ : ( ) => ( { ok : false , reason : `${ String ( transitionName || 'transition' ) } missing validate handler.` } ) ;
41+
42+ const definition = {
43+ eventType : String ( eventType || '' ) ,
44+ validate ( payload , context ) {
45+ const eventTypeValidation = validateTransitionEventType ( definition . eventType , transitionName ) ;
46+ if ( ! eventTypeValidation . ok ) return eventTypeValidation ;
47+ return baseValidate ( payload , context ) ;
48+ }
49+ } ;
50+
51+ if ( typeof authoritativeApply === 'function' ) {
52+ definition . authoritativeApply = authoritativeApply ;
53+ }
54+
55+ return definition ;
56+ }
57+
1958function recalcObjectiveSummary ( objectivesById ) {
2059 const objectiveIds = Object . keys ( objectivesById ) ;
2160 let completed = 0 ;
@@ -191,36 +230,43 @@ function validateResolveRunOutcome(payload) {
191230
192231function createTransitionRegistry ( ) {
193232 return {
194- transitionGameMode : {
233+ transitionGameMode : createWhitelistedTransition ( {
234+ transitionName : 'transitionGameMode' ,
195235 validate : validateTransitionGameMode ,
196236 eventType : WORLD_GAME_STATE_EVENT_TYPES . GAME_MODE_CHANGED
197- } ,
198- transitionPhase : {
237+ } ) ,
238+ transitionPhase : createWhitelistedTransition ( {
239+ transitionName : 'transitionPhase' ,
199240 validate : validateTransitionPhase ,
200241 eventType : WORLD_GAME_STATE_EVENT_TYPES . GAME_PHASE_CHANGED
201- } ,
202- advanceWave : {
242+ } ) ,
243+ advanceWave : createWhitelistedTransition ( {
244+ transitionName : 'advanceWave' ,
203245 validate : validateAdvanceWave ,
204246 eventType : WORLD_GAME_STATE_EVENT_TYPES . TRANSITION_APPLIED
205- } ,
206- applyScoreDelta : {
247+ } ) ,
248+ applyScoreDelta : createWhitelistedTransition ( {
249+ transitionName : 'applyScoreDelta' ,
207250 validate : validateApplyScoreDelta ,
208251 eventType : WORLD_GAME_STATE_EVENT_TYPES . TRANSITION_APPLIED ,
209252 authoritativeApply : applyAuthoritativeScoreDelta
210- } ,
211- updateObjectiveProgress : {
253+ } ) ,
254+ updateObjectiveProgress : createWhitelistedTransition ( {
255+ transitionName : 'updateObjectiveProgress' ,
212256 validate : validateUpdateObjectiveProgress ,
213257 eventType : WORLD_GAME_STATE_EVENT_TYPES . OBJECTIVE_SNAPSHOT_UPDATED ,
214258 authoritativeApply : applyAuthoritativeObjectiveProgress
215- } ,
216- setWorldFlag : {
259+ } ) ,
260+ setWorldFlag : createWhitelistedTransition ( {
261+ transitionName : 'setWorldFlag' ,
217262 validate : validateSetWorldFlag ,
218263 eventType : WORLD_GAME_STATE_EVENT_TYPES . TRANSITION_APPLIED
219- } ,
220- resolveRunOutcome : {
264+ } ) ,
265+ resolveRunOutcome : createWhitelistedTransition ( {
266+ transitionName : 'resolveRunOutcome' ,
221267 validate : validateResolveRunOutcome ,
222268 eventType : WORLD_GAME_STATE_EVENT_TYPES . TRANSITION_APPLIED
223- }
269+ } )
224270 } ;
225271}
226272
0 commit comments