1- import { EventMetadata } from '../types' ;
1+ import { EventMetadata , RpcMetadata } from '../types' ;
22import { ExecutionContext , MethodParameter } from '../interfaces' ;
33import { MethodParamType } from '../enums' ;
44
@@ -19,57 +19,51 @@ export class ControllerFlowHandler {
1919 * @param event Metadata for the event handler including parameter definitions.
2020 * @returns An array of arguments to apply to the controller method.
2121 */
22- public createArgs ( context : ExecutionContext , event : EventMetadata ) : unknown [ ] {
23- if ( ! event . params ?. length ) {
24- // No decorated parameters: return raw arguments as-is
22+ public createArgs ( context : ExecutionContext , handler : EventMetadata | RpcMetadata ) : unknown [ ] {
23+ // If no parameter decorators, return raw args
24+ if ( ! handler . params ?. length ) {
2525 return context . args ;
2626 }
2727
28- // Prepare the output argument array
29- const args : unknown [ ] = [ ] ;
30-
31- // Sort parameters by their declared index to respect method signature order
32- const sortedParams : MethodParameter [ ] = [ ...event . params ] . sort ( ( a , b ) => a . index - b . index ) ;
33-
34- // Raw arguments passed by the platform driver: [player, ...payloadArgs]
28+ // Sort by original method signature index
29+ const sorted : MethodParameter [ ] = [ ...handler . params ] . sort ( ( a , b ) => a . index - b . index ) ;
3530 const rawArgs = context . args ;
31+ const args : unknown [ ] = [ ] ;
3632
37- // Iterate through each parameter metadata and resolve its value inline
38- for ( const param of sortedParams ) {
33+ for ( const param of sorted ) {
3934 let value : unknown ;
4035 switch ( param . type ) {
4136 case MethodParamType . PLAYER :
42- // @Player () decorator -> always first argument (player object or property )
37+ // @Player () or @Player('prop' )
4338 value = param . data ? ( rawArgs [ 0 ] as any ) [ param . data ] : rawArgs [ 0 ] ;
4439 break ;
4540
4641 case MethodParamType . PAYLOAD :
47- // @Payload () decorator -> return second argument if it's an object,
48- // otherwise return all subsequent arguments as an array
49- const potentialObject = rawArgs [ 1 ] ;
50- value =
51- potentialObject != null && typeof potentialObject === 'object'
52- ? potentialObject
53- : rawArgs . slice ( 1 ) ;
42+ // @Payload () -> whole payload object
43+ // @Payload ('key') -> payload[key]
44+ const payload = rawArgs [ 1 ] ;
45+ if ( payload != null && typeof payload === 'object' ) {
46+ value = param . data ? ( payload as any ) [ param . data ] : payload ;
47+ } else {
48+ // fallback: flattened primitives
49+ value = rawArgs . slice ( 1 ) ;
50+ }
5451 break ;
5552
5653 case MethodParamType . PARAM :
57- // @Param ('key') decorator -> extract from payload object or fallback to positional
58- const payloadCandidate = rawArgs [ 1 ] ;
59- if ( payloadCandidate != null && typeof payloadCandidate === 'object' ) {
60- // Payload is object: return the specified property
61- value = ( payloadCandidate as any ) [ param . data as string ] ;
54+ // @Param ('key') always extracts from payload object if present
55+ const obj = rawArgs [ 1 ] ;
56+ if ( obj != null && typeof obj === 'object' ) {
57+ value = ( obj as any ) [ param . data as string ] ;
6258 } else {
63- // Fallback: payload is flattened primitives, use method parameter index
59+ // fallback: positional
6460 value = rawArgs [ param . index ] ;
6561 }
6662 break ;
6763
6864 default :
69- throw new Error ( `[Aurora] Unknown parameter type: ${ ( param as any ) . type } ` ) ;
65+ throw new Error ( `Unknown parameter type ${ ( param as any ) . type } ` ) ;
7066 }
71-
72- // Assign resolved value into correct position
7367 args [ param . index ] = value ;
7468 }
7569
0 commit comments