Skip to content

Commit c629b56

Browse files
committed
fix(core): fix createArgs of ControllerFlowHandler.
1 parent cdea6e9 commit c629b56

File tree

1 file changed

+24
-30
lines changed

1 file changed

+24
-30
lines changed

packages/core/src/bootstrap/controller-flow.handler.ts

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { EventMetadata } from '../types';
1+
import { EventMetadata, RpcMetadata } from '../types';
22
import { ExecutionContext, MethodParameter } from '../interfaces';
33
import { 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

Comments
 (0)