Skip to content

Commit

Permalink
Implement EventBus and Use common event name (#29)
Browse files Browse the repository at this point in the history
* Implement EventBus and Use common event name

* Remove only hint in surrender e2e test

* Format code by linter
  • Loading branch information
zhihdd authored Jan 16, 2024
1 parent 2abe1f0 commit 8e692c8
Show file tree
Hide file tree
Showing 30 changed files with 330 additions and 54 deletions.
95 changes: 90 additions & 5 deletions server/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"mongodb": "^5.3.0",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.2.0",
"socket.io": "^4.7.2",
"zod": "^3.22.4"
},
"devDependencies": {
Expand Down
9 changes: 5 additions & 4 deletions server/src/domain/Gungi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
import SurrenderEvent from './events/SurrenderEvent';
import FurigomaEvent from './events/FurigomaEvent';
import ArataEvent from './events/ArataEvent';
import EVENT_NAME from './constant/EVENT_NAME';

export default class Gungi {
constructor(
Expand Down Expand Up @@ -142,7 +143,7 @@ export default class Gungi {
this.addGomaToOki(SIDE.BLACK, OKI_CONFIG);

const event: ConfigurationEvent = {
name: 'Configuration',
name: EVENT_NAME.CONFIGURATION,
data: {
gungiHan: this.gungiHan,
senteGomaOki: this.sente.gomaOki,
Expand All @@ -163,7 +164,7 @@ export default class Gungi {
this.setCurrentTurn(SIDE.BLACK);
this.setSenteGote();
const event: FurigomaEvent = {
name: 'Furigoma',
name: EVENT_NAME.FURIGOMA,
data: {
turn,
result: tossResult,
Expand All @@ -189,7 +190,7 @@ export default class Gungi {
player.surrender();

const event: SurrenderEvent = {
name: 'Surrender',
name: EVENT_NAME.SURRENDER,
data: {
winner: this.getOpponent(player),
},
Expand All @@ -215,7 +216,7 @@ export default class Gungi {
this._currentTurn = this.getOpponent(player);

const event: ArataEvent = {
name: 'Arata',
name: EVENT_NAME.ARATA,
data: {
goma: targetGoma,
to: targetCoordinate,
Expand Down
10 changes: 10 additions & 0 deletions server/src/domain/constant/EVENT_NAME.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
enum EVENT_NAME {
ARATA = 'ArataEvent',
FURIGOMA = 'FurigomaEvent',
CREATE_GUNGI = 'CreateGungiEvent',
SURRENDER = 'SurrenderEvent',
CONFIGURATION = 'ConfigurationEvent',
GET_GUNGI = 'GetGungiEvent',
}

export default EVENT_NAME;
3 changes: 2 additions & 1 deletion server/src/domain/events/ArataEvent.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import Goma from '../goma/Goma';
import Coordinate from '../Coordinate';
import { Event } from './Event';
import EVENT_NAME from '../constant/EVENT_NAME';

export default interface ArataEvent extends Event {
name: 'Arata';
name: EVENT_NAME.ARATA;
data: {
goma: Goma;
to: Coordinate;
Expand Down
3 changes: 2 additions & 1 deletion server/src/domain/events/ConfigurationEvent.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { Event } from './Event';
import GungiHan from '../GungiHan';
import GomaOki from '../GomaOki';
import EVENT_NAME from '../constant/EVENT_NAME';

export interface ConfigurationEvent extends Event {
name: 'Configuration';
name: EVENT_NAME.CONFIGURATION;
data: {
gungiHan: GungiHan;
senteGomaOki: GomaOki;
Expand Down
3 changes: 2 additions & 1 deletion server/src/domain/events/CreateEvent.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Event } from './Event';
import EVENT_NAME from '../constant/EVENT_NAME';

export default interface CreateEvent extends Event {
name: 'CreateEvent';
name: EVENT_NAME.CREATE_GUNGI;
data: {
gungiId: string;
};
Expand Down
4 changes: 3 additions & 1 deletion server/src/domain/events/Event.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import EVENT_NAME from '../constant/EVENT_NAME';

interface Event {
name: string;
name: EVENT_NAME;
data: any;
}

Expand Down
3 changes: 2 additions & 1 deletion server/src/domain/events/FurigomaEvent.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import TURN from '../constant/TURN';
import { Event } from './Event';
import EVENT_NAME from '../constant/EVENT_NAME';

export default interface FurigomaEvent extends Event {
name: 'Furigoma';
name: EVENT_NAME.FURIGOMA;
data: {
turn: TURN;
result: number[];
Expand Down
3 changes: 2 additions & 1 deletion server/src/domain/events/GetGungiEvent.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import Gungi from '../Gungi';
import { Event } from './Event';
import EVENT_NAME from '../constant/EVENT_NAME';

export default interface GetGungiEvent extends Event {
name: 'GetGungi';
name: EVENT_NAME.GET_GUNGI;
data: {
gungi: Gungi;
};
Expand Down
3 changes: 2 additions & 1 deletion server/src/domain/events/SurrenderEvent.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import Player from '../Player';
import { Event } from './Event';
import EVENT_NAME from '../constant/EVENT_NAME';

export default interface SurrenderEvent extends Event {
name: 'Surrender';
name: EVENT_NAME.SURRENDER;
data: {
winner: Player;
};
Expand Down
27 changes: 20 additions & 7 deletions server/src/gateway/eventBus/ImplEventBus.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,25 @@
import { Event } from '../../domain/events/Event';
import EventHandler from './eventHandler/EventHandler';
import EventBus from '../../usecases/EventBus';
import { Injectable } from '@nestjs/common';
import { Server } from 'socket.io';

@Injectable()
export default class ImplEventBus extends EventBus {
broadcast(events) {
// TODO: should implement
events.forEach((event) => {
console.log('有收到event囉');
export class ImplEventBus extends EventBus {
private eventHandler: EventHandler;
private server: Server;

constructor(server: Server, eventHandler: EventHandler) {
super();
this.eventHandler = eventHandler;
this.server = server;
}

broadcast(roomId: string, events: Event[]) {
events.forEach((event: Event) => {
const eventName = event.name;
const view = this.eventHandler.handle(event);
if (view) {
this.server.to(roomId).emit(eventName, view);
}
});
}
}
22 changes: 22 additions & 0 deletions server/src/gateway/eventBus/eventHandler/EventHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Event } from '../../../domain/events/Event';

type ReturnEventHandler = {
eventName: string;
view: any;
};

export default abstract class EventHandler {
constructor(private next: EventHandler | null) {}

handle(event: Event) {
if (this.match(event)) {
return this.doHandle(event);
} else if (this.next != null) {
return this.next.handle(event);
}
}

abstract match(event: Event): boolean;

abstract doHandle(event: Event): ReturnEventHandler;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import EventHandler from '../EventHandler';
import ArataEvent from '../../../../domain/events/ArataEvent';
import { Event } from '../../../../domain/events/Event';
import EVENT_NAME from '../../../../domain/constant/EVENT_NAME';

export default class ArataEventHandler extends EventHandler {
doHandle(event: ArataEvent): any {
const { goma, to } = event.data;

return {
goma: {
name: goma.name,
side: goma.side,
},
to: {
x: to.x,
y: to.y,
z: to.z,
},
};
}

match(event: Event): boolean {
return event.name === EVENT_NAME.ARATA;
}
}
Loading

0 comments on commit 8e692c8

Please sign in to comment.