Skip to content

Commit b48b67d

Browse files
authored
feat: support multiple parameters in message body (#538)
1 parent 64cbf1c commit b48b67d

File tree

4 files changed

+46
-9
lines changed

4 files changed

+46
-9
lines changed

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,22 @@ export class MessageController {
152152

153153
If you specify a class type to parameter that is decorated with `@MessageBody()`,
154154
socket-controllers will use [class-transformer][1] to create instance of the given class type with the data received in the message.
155-
To disable this behaviour you need to specify a `{ transformOption: { transform: false ] }` in SocketControllerOptions when creating a server.
155+
To disable this behaviour you need to specify `{ transformOption: { transform: false ] }` in SocketControllerOptions when creating a server.
156+
157+
You can define an index to get multiple parameters from the socket event.
158+
159+
```typescript
160+
import { SocketController, OnMessage, MessageBody } from 'socket-controllers';
161+
162+
@SocketController()
163+
export class MessageController {
164+
@OnMessage('save')
165+
save(@MessageBody({index: 0}) param1: any, @MessageBody({index: 1}) param2: any) {
166+
console.log('received message: ', message1);
167+
console.log('received message: ', message2);
168+
}
169+
}
170+
```
156171

157172
#### `@SocketQueryParam()` decorator
158173

src/SocketControllers.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,15 @@ export class SocketControllers {
187187
}
188188

189189
for (const messageAction of messageActions) {
190-
socket.on(messageAction.options.name, (message: any) => {
191-
this.executeAction(socket, controller, messageAction, message);
190+
socket.on(messageAction.options.name, (...args: any[]) => {
191+
const messages: any[] = args.slice(0, -1);
192+
const ack: any = args[args.length - 1];
193+
194+
if (!(ack instanceof Function)) {
195+
messages.push(ack);
196+
}
197+
198+
this.executeAction(socket, controller, messageAction, messages);
192199
});
193200
}
194201
}
@@ -197,7 +204,7 @@ export class SocketControllers {
197204
socket: Socket,
198205
controller: HandlerMetadata<any, ControllerMetadata>,
199206
action: ActionMetadata,
200-
data?: any
207+
data?: any[]
201208
) {
202209
const parameters = this.resolveParameters(socket, controller.metadata, action.parameters || [], data);
203210
try {
@@ -241,7 +248,7 @@ export class SocketControllers {
241248
socket: Socket,
242249
controllerMetadata: ControllerMetadata,
243250
parameterMetadatas: ParameterMetadata[],
244-
data: any
251+
data?: any[]
245252
) {
246253
const parameters = [];
247254

@@ -258,7 +265,7 @@ export class SocketControllers {
258265
return parameters;
259266
}
260267

261-
private resolveParameter(socket: Socket, controller: ControllerMetadata, parameter: ParameterMetadata, data: any) {
268+
private resolveParameter(socket: Socket, controller: ControllerMetadata, parameter: ParameterMetadata, data?: any[]) {
262269
switch (parameter.type) {
263270
case ParameterType.CONNECTED_SOCKET:
264271
return socket;
@@ -269,7 +276,7 @@ export class SocketControllers {
269276
case ParameterType.SOCKET_ROOMS:
270277
return socket.rooms;
271278
case ParameterType.MESSAGE_BODY:
272-
return data;
279+
return data?.[(parameter.options.index as number) || 0];
273280
case ParameterType.SOCKET_QUERY_PARAM:
274281
return socket.handshake.query[parameter.options.name as string];
275282
case ParameterType.SOCKET_REQUEST:

src/decorators/MessageBody.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { addParameterToActionMetadata } from '../util/add-parameter-to-action-me
22
import { ParameterType } from '../types/enums/ParameterType';
33
import { ActionTransformOptions } from '../types/ActionTransformOptions';
44

5-
export function MessageBody(options?: ActionTransformOptions) {
5+
export function MessageBody(options?: ActionTransformOptions & { index?: number }) {
66
return function (object: Object, methodName: string, index: number) {
77
const format = (Reflect as any).getMetadata('design:paramtypes', object, methodName)[index];
88
addParameterToActionMetadata(object.constructor, methodName, {

test/functional/socket-message-body.spec.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,16 @@ describe('MessageBody', () => {
6262
testResult = data;
6363
socket.emit('return');
6464
}
65+
66+
@OnMessage('test2')
67+
test2(
68+
@MessageBody({ index: 1 }) data1: any,
69+
@MessageBody({ index: 0 }) data0: any,
70+
@ConnectedSocket() socket: Socket
71+
) {
72+
testResult = { data1, data0 };
73+
socket.emit('return2');
74+
}
6575
}
6676

6777
socketControllers = new SocketControllers({
@@ -74,8 +84,13 @@ describe('MessageBody', () => {
7484
await waitForEvent(wsClient, 'connected');
7585

7686
wsClient.emit('test', 'test data');
77-
7887
await waitForEvent(wsClient, 'return');
7988
expect(testResult).toEqual('test data');
89+
90+
wsClient.emit('test2', 'test data 0', 'test data 1', 'test data 2', ack => {
91+
console.log(ack);
92+
});
93+
await waitForEvent(wsClient, 'return2');
94+
expect(testResult).toEqual({ data0: 'test data 0', data1: 'test data 1' });
8095
});
8196
});

0 commit comments

Comments
 (0)