Skip to content

Commit c2534b8

Browse files
committed
feat(ws-manual-ack): add e2e for ack decorator
1 parent eb95c9d commit c2534b8

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

integration/websockets/e2e/gateway-ack.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,38 @@ describe('WebSocketGateway (ack)', () => {
4141
);
4242
});
4343

44+
it('should handle manual ack for async operations when @Ack() is used (success case)', async () => {
45+
app = await createNestApp(AckGateway);
46+
await app.listen(3000);
47+
48+
ws = io('http://localhost:8080');
49+
const payload = { shouldSucceed: true };
50+
51+
await new Promise<void>(resolve =>
52+
ws.emit('manual-ack', payload, response => {
53+
expect(response).to.eql({ status: 'success', data: payload });
54+
resolve();
55+
}),
56+
);
57+
});
58+
59+
it('should handle manual ack for async operations when @Ack() is used (error case)', async () => {
60+
app = await createNestApp(AckGateway);
61+
await app.listen(3000);
62+
63+
ws = io('http://localhost:8080');
64+
const payload = { shouldSucceed: false };
65+
66+
await new Promise<void>(resolve =>
67+
ws.emit('manual-ack', payload, response => {
68+
expect(response).to.eql({
69+
status: 'error',
70+
message: 'Operation failed',
71+
});
72+
resolve();
73+
}),
74+
);
75+
});
76+
4477
afterEach(() => app.close());
4578
});
Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,29 @@
1-
import { SubscribeMessage, WebSocketGateway } from '@nestjs/websockets';
1+
import {
2+
Ack,
3+
MessageBody,
4+
SubscribeMessage,
5+
WebSocketGateway,
6+
} from '@nestjs/websockets';
27

38
@WebSocketGateway(8080)
49
export class AckGateway {
510
@SubscribeMessage('push')
611
onPush() {
712
return 'pong';
813
}
14+
15+
@SubscribeMessage('manual-ack')
16+
async handleManualAck(
17+
@MessageBody() data: any,
18+
@Ack() ack: (response: any) => void,
19+
) {
20+
await new Promise(resolve => setTimeout(resolve, 20));
21+
22+
if (data.shouldSucceed) {
23+
ack({ status: 'success', data });
24+
} else {
25+
ack({ status: 'error', message: 'Operation failed' });
26+
}
27+
return { status: 'ignored' };
28+
}
929
}

0 commit comments

Comments
 (0)