Skip to content
This repository was archived by the owner on Mar 8, 2026. It is now read-only.

Commit 7ccc33c

Browse files
committed
feat(rooms): add rooms for io events filtering
1 parent 580cf1b commit 7ccc33c

9 files changed

Lines changed: 109 additions & 2 deletions

src/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import { validateEnvironment } from './validate-environment';
3434
import { Etf2lModule } from './etf2l/etf2l.module';
3535
import { SteamModule } from './steam/steam.module';
3636
import { CacheModule } from '@nestjs/cache-manager';
37+
import { RoomsModule } from './rooms/rooms.module';
3738

3839
@Module({
3940
imports: [
@@ -100,6 +101,7 @@ import { CacheModule } from '@nestjs/cache-manager';
100101
QueueConfigModule,
101102
Etf2lModule,
102103
SteamModule,
104+
RoomsModule,
103105
],
104106
controllers: [AppController],
105107
})

src/games/games.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { GameServerAssignerService } from './services/game-server-assigner.servi
1616
import { QueueConfigModule } from '@/queue-config/queue-config.module';
1717
import { GamesConfigurationService } from './services/games-configuration.service';
1818
import { GameSlotsGateway } from './gateways/game-slots.gateway';
19+
import { GameEventsGateway } from './gateways/game-events.gateway';
1920

2021
@Module({
2122
imports: [
@@ -38,6 +39,7 @@ import { GameSlotsGateway } from './gateways/game-slots.gateway';
3839
GameServerAssignerService,
3940
GamesConfigurationService,
4041
GameSlotsGateway,
42+
GameEventsGateway,
4143
],
4244
exports: [GamesService, PlayerSubstitutionService],
4345
controllers: [GamesController, GamesWithSubstitutionRequestsController],
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { GameEventsGateway } from './game-events.gateway';
3+
4+
describe('GameEventsGateway', () => {
5+
let gateway: GameEventsGateway;
6+
7+
beforeEach(async () => {
8+
const module: TestingModule = await Test.createTestingModule({
9+
providers: [GameEventsGateway],
10+
}).compile();
11+
12+
gateway = module.get<GameEventsGateway>(GameEventsGateway);
13+
});
14+
15+
it('should be defined', () => {
16+
expect(gateway).toBeDefined();
17+
});
18+
});
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { WebsocketEventEmitter } from '@/shared/websocket-event-emitter';
2+
import { WebSocketGateway } from '@nestjs/websockets';
3+
import { GameEventDto } from '../dto/game-event.dto';
4+
import { OnModuleInit } from '@nestjs/common';
5+
import { Events } from '@/events/events';
6+
import { filter, map } from 'rxjs';
7+
import { isEqual } from 'lodash';
8+
import { WebsocketEvent } from '@/websocket-event';
9+
10+
const roomName = (gameNumber: number) => `/games/${gameNumber}/events`;
11+
12+
@WebSocketGateway()
13+
export class GameEventsGateway
14+
extends WebsocketEventEmitter<GameEventDto>
15+
implements OnModuleInit
16+
{
17+
constructor(private readonly events: Events) {
18+
super();
19+
}
20+
21+
onModuleInit() {
22+
this.events.gameChanges
23+
.pipe(
24+
filter(
25+
({ oldGame, newGame }) => !isEqual(oldGame.events, newGame.events),
26+
),
27+
map(({ newGame }) => ({
28+
number: newGame.number,
29+
events: newGame.events,
30+
})),
31+
)
32+
.subscribe(({ number, events }) => {
33+
this.emit({
34+
room: roomName(number),
35+
event: WebsocketEvent.gameEventsUpdated,
36+
payload: events,
37+
});
38+
});
39+
}
40+
}

src/games/gateways/game-slots.gateway.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { WebsocketEventEmitter } from '@/shared/websocket-event-emitter';
77
import { filter, map } from 'rxjs/operators';
88
import { isEqual } from 'lodash';
99

10+
const roomName = (gameNumber: number) => `/games/${gameNumber}/slots`;
11+
1012
@WebSocketGateway()
1113
export class GameSlotsGateway
1214
extends WebsocketEventEmitter<GameSlotDto>
@@ -29,7 +31,7 @@ export class GameSlotsGateway
2931
)
3032
.subscribe(({ number, slots }) => {
3133
this.emit({
32-
room: `game/${number}`,
34+
room: roomName(number),
3335
event: WebsocketEvent.gameSlotsUpdated,
3436
payload: slots,
3537
});
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { RoomsGateway } from './rooms.gateway';
3+
4+
describe('RoomsGateway', () => {
5+
let gateway: RoomsGateway;
6+
7+
beforeEach(async () => {
8+
const module: TestingModule = await Test.createTestingModule({
9+
providers: [RoomsGateway],
10+
}).compile();
11+
12+
gateway = module.get<RoomsGateway>(RoomsGateway);
13+
});
14+
15+
it('should be defined', () => {
16+
expect(gateway).toBeDefined();
17+
});
18+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { SubscribeMessage, WebSocketGateway } from '@nestjs/websockets';
2+
import { Socket } from 'socket.io';
3+
4+
@WebSocketGateway()
5+
export class RoomsGateway {
6+
@SubscribeMessage('join')
7+
join(client: Socket, room: string): string[] {
8+
client.join(room);
9+
return Array.from(client.rooms);
10+
}
11+
12+
@SubscribeMessage('leave')
13+
leave(client: Socket, room: string): string[] {
14+
client.leave(room);
15+
return Array.from(client.rooms);
16+
}
17+
}

src/rooms/rooms.module.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { Module } from '@nestjs/common';
2+
import { RoomsGateway } from './gateways/rooms.gateway';
3+
4+
@Module({
5+
providers: [RoomsGateway],
6+
})
7+
export class RoomsModule {}

src/websocket-event.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ export enum WebsocketEvent {
33

44
gameCreated = 'game created',
55
gameUpdated = 'game updated',
6-
gameSlotsUpdated = 'game slots updated',
6+
gameSlotsUpdated = 'slots updated',
7+
gameEventsUpdated = 'events updated',
78

89
queueSlotsUpdate = 'queue slots update',
910
queueStateUpdate = 'queue state update',

0 commit comments

Comments
 (0)