강동현

핸들러 수정 및 등록

...@@ -17,10 +17,6 @@ export class Connection { ...@@ -17,10 +17,6 @@ export class Connection {
17 this.messageHandlerChain = new MessageHandlerChain(this); 17 this.messageHandlerChain = new MessageHandlerChain(this);
18 } 18 }
19 19
20 - public get authenticated(): boolean {
21 - return this.user !== undefined;
22 - }
23 -
24 public send<T extends keyof ServerOutboundMessageMap>( 20 public send<T extends keyof ServerOutboundMessageMap>(
25 type: T, 21 type: T,
26 message: ServerOutboundMessageMap[T] 22 message: ServerOutboundMessageMap[T]
......
1 import { Connection } from "../connection/Connection"; 1 import { Connection } from "../connection/Connection";
2 -import { ServerInboundMessageMap, ServerResponse } from "../../common/index"; 2 +import {
3 + ServerInboundMessage,
4 + ServerInboundMessageMap,
5 + ServerResponse,
6 +} from "../../common/index";
3 7
4 type ServerHandlerMap<T> = { 8 type ServerHandlerMap<T> = {
5 [Key in keyof ServerInboundMessageMap]?: ( 9 [Key in keyof ServerInboundMessageMap]?: (
6 connection: Connection, 10 connection: Connection,
7 - message: Omit<ServerInboundMessageMap[Key], "result">, 11 + message: ServerInboundMessage<Key>,
8 scope: T 12 scope: T
9 - ) => ServerResponse< 13 + ) => ServerResponse<Key>;
10 - "result" extends keyof ServerInboundMessageMap[Key]
11 - ? ServerInboundMessageMap[Key]["result"]
12 - : undefined
13 - >;
14 }; 14 };
15 15
16 export class HandlerMap<T> { 16 export class HandlerMap<T> {
......
1 import { Connection } from "../connection/Connection"; 1 import { Connection } from "../connection/Connection";
2 import { ServerInboundMessageMap, ServerResponse } from "../../common/index"; 2 import { ServerInboundMessageMap, ServerResponse } from "../../common/index";
3 import { keys } from "ts-transformer-keys"; 3 import { keys } from "ts-transformer-keys";
4 +import { HandlerMap } from "./MessageHandler";
5 +import { loginHandler } from "./handler/loginHandler";
4 6
5 export class MessageHandlerChain { 7 export class MessageHandlerChain {
6 connection: Connection; 8 connection: Connection;
7 9
10 + handler: HandlerMap<undefined>;
11 +
8 constructor(connection: Connection) { 12 constructor(connection: Connection) {
9 this.connection = connection; 13 this.connection = connection;
14 + this.handler = new HandlerMap(undefined, {
15 + login: loginHandler,
16 + });
10 17
11 for (const key in keys<ServerInboundMessageMap>()) { 18 for (const key in keys<ServerInboundMessageMap>()) {
12 const type = key as keyof ServerInboundMessageMap; 19 const type = key as keyof ServerInboundMessageMap;
13 this.connection.socket.on(key, (message: any, callback: Function) => { 20 this.connection.socket.on(key, (message: any, callback: Function) => {
14 if ( 21 if (
15 - connection?.user && 22 + connection?.user?.room &&
16 - connection.user.handler.handle( 23 + connection.user.room.handler.handle(
17 type, 24 type,
18 connection, 25 connection,
19 - message.data, 26 + message,
20 callback 27 callback
21 ) 28 )
22 ) 29 )
23 return; 30 return;
24 31
25 - // TODO: Add more handlers 32 + if (
33 + connection?.user &&
34 + connection.user.handler.handle(type, connection, message, callback)
35 + )
36 + return;
37 +
38 + this.handler.handle(type, connection, message, callback);
26 }); 39 });
27 } 40 }
28 } 41 }
......
1 +import { ServerInboundMessageMap, ServerResponse } from "../../../common";
1 import { Connection } from "../../connection/Connection"; 2 import { Connection } from "../../connection/Connection";
2 import { RoomManager } from "../../room/RoomManager"; 3 import { RoomManager } from "../../room/RoomManager";
3 import { User } from "../../user/User"; 4 import { User } from "../../user/User";
4 -import { LoginMessage, MessageResponse } from "../types";
5 5
6 export function loginHandler( 6 export function loginHandler(
7 connection: Connection, 7 connection: Connection,
8 - message: LoginMessage 8 + message: ServerInboundMessageMap["login"],
9 -): MessageResponse<undefined> { 9 + scope: undefined
10 +): ServerResponse<"login"> {
10 connection.user = new User(message.username, connection); 11 connection.user = new User(message.username, connection);
11 console.log(`User ${message.username} has logged in!`); 12 console.log(`User ${message.username} has logged in!`);
12 13
......
1 +import { ServerInboundMessage, ServerResponse } from "../../../common";
1 import { Connection } from "../../connection/Connection"; 2 import { Connection } from "../../connection/Connection";
3 +import { Room } from "../../room/Room";
2 import { RoomManager } from "../../room/RoomManager"; 4 import { RoomManager } from "../../room/RoomManager";
3 import { User } from "../../user/User"; 5 import { User } from "../../user/User";
4 -import { MessageResponse, RoomChatMessage, RoomJoinMessage } from "../types";
5 6
6 -export function roomChatHandler( 7 +export function chatHandler(
7 - user: User, 8 + connection: Connection,
8 - message: RoomChatMessage 9 + message: ServerInboundMessage<"chat">,
9 -): MessageResponse<undefined> { 10 + scope: Room
10 - user.room?.sendChat(user, message.message); 11 +): ServerResponse<"chat"> {
12 + scope.sendChat(user, message.message);
11 return { ok: true }; 13 return { ok: true };
12 } 14 }
......
1 +import { ServerInboundMessage, ServerResponse } from "../../../common";
1 import { Connection } from "../../connection/Connection"; 2 import { Connection } from "../../connection/Connection";
3 +import { Room } from "../../room/Room";
2 import { RoomManager } from "../../room/RoomManager"; 4 import { RoomManager } from "../../room/RoomManager";
3 -import { RoomInfo } from "../../room/types";
4 import { User } from "../../user/User"; 5 import { User } from "../../user/User";
5 -import { MessageResponse, RoomJoinMessage } from "../types";
6 6
7 export function roomJoinHandler( 7 export function roomJoinHandler(
8 - user: User, 8 + connection: Connection,
9 - message: RoomJoinMessage 9 + message: ServerInboundMessage<"joinRoom">,
10 -): MessageResponse<RoomInfo> { 10 + scope: Room
11 +): ServerResponse<"joinRoom"> {
11 const room = RoomManager.instance().get(message.uuid); 12 const room = RoomManager.instance().get(message.uuid);
12 if (room !== undefined) { 13 if (room !== undefined) {
13 room.connect(user); 14 room.connect(user);
......
1 +import { ServerInboundMessage, ServerResponse } from "../../../common";
1 import { Connection } from "../../connection/Connection"; 2 import { Connection } from "../../connection/Connection";
3 +import { Room } from "../../room/Room";
2 import { RoomManager } from "../../room/RoomManager"; 4 import { RoomManager } from "../../room/RoomManager";
3 import { User } from "../../user/User"; 5 import { User } from "../../user/User";
4 -import { MessageResponse, RoomLeaveMessage } from "../types";
5 6
6 export function roomLeaveHandler( 7 export function roomLeaveHandler(
7 - user: User, 8 + connection: Connection,
8 - message: RoomLeaveMessage 9 + message: ServerInboundMessage<"leaveRoom">,
9 -): MessageResponse<undefined> { 10 + scope: Room
11 +): ServerResponse<"leaveRoom"> {
10 user.room?.disconnect(user); 12 user.room?.disconnect(user);
11 return { ok: true }; 13 return { ok: true };
12 } 14 }
......
1 +import {
2 + ServerInboundMessage,
3 + ServerInboundMessageMap,
4 + ServerResponse,
5 +} from "../../../common";
6 +import { RoomDescription } from "../../../common/dataType";
1 import { Connection } from "../../connection/Connection"; 7 import { Connection } from "../../connection/Connection";
2 import { RoomManager } from "../../room/RoomManager"; 8 import { RoomManager } from "../../room/RoomManager";
3 -import { RoomDescription, RoomInfo } from "../../room/types";
4 import { User } from "../../user/User"; 9 import { User } from "../../user/User";
5 -import { MessageResponse, RoomListRequestMessage } from "../types";
6 10
7 export function roomListRequestHandler( 11 export function roomListRequestHandler(
8 - user: User, 12 + connection: Connection,
9 - message: RoomListRequestMessage 13 + message: ServerInboundMessage<"roomList">,
10 -): MessageResponse<RoomDescription[]> { 14 + scope: User
15 +): ServerResponse<"roomList"> {
11 return { ok: true, result: RoomManager.instance().list() }; 16 return { ok: true, result: RoomManager.instance().list() };
12 } 17 }
......
1 import { Connection } from "../connection/Connection"; 1 import { Connection } from "../connection/Connection";
2 import { v4 as uuidv4 } from "uuid"; 2 import { v4 as uuidv4 } from "uuid";
3 -import { RoomDescription, RoomInfo } from "./types";
4 -import {
5 - Message,
6 - RoomChatMessage,
7 - RoomUserUpdateMessage,
8 -} from "../message/types";
9 -import { UserData } from "../user/types";
10 import { User } from "../user/User"; 3 import { User } from "../user/User";
4 +import { MessageHandlerChain } from "../message/MessageHandlerChain";
5 +import { HandlerMap } from "../message/MessageHandler";
6 +import { roomJoinHandler } from "../message/handler/roomJoinHandler";
7 +import { roomLeaveHandler } from "../message/handler/roomLeaveHandler";
8 +import { chatHandler } from "../message/handler/roomChatHandler";
11 9
12 export class Room { 10 export class Room {
13 public readonly uuid: string; 11 public readonly uuid: string;
...@@ -19,10 +17,17 @@ export class Room { ...@@ -19,10 +17,17 @@ export class Room {
19 17
20 private closed: boolean = false; 18 private closed: boolean = false;
21 19
20 + public handler: HandlerMap<Room>;
21 +
22 constructor(name: string, maxUsers: number = 8) { 22 constructor(name: string, maxUsers: number = 8) {
23 this.uuid = uuidv4(); 23 this.uuid = uuidv4();
24 this.name = name; 24 this.name = name;
25 this.maxUsers = maxUsers; 25 this.maxUsers = maxUsers;
26 + this.handler = new HandlerMap<Room>(this, {
27 + joinRoom: roomJoinHandler,
28 + leaveRoom: roomLeaveHandler,
29 + chat: chatHandler,
30 + });
26 } 31 }
27 32
28 public connect(user: User): void { 33 public connect(user: User): void {
......
1 +import { RoomDescription } from "../../common/dataType";
1 import { Room } from "./Room"; 2 import { Room } from "./Room";
2 -import { RoomDescription } from "./types";
3 3
4 export class RoomManager { 4 export class RoomManager {
5 private static _instance: RoomManager; 5 private static _instance: RoomManager;
......
1 +import { UserData } from "../../common/dataType";
1 import { Connection } from "../connection/Connection"; 2 import { Connection } from "../connection/Connection";
3 +import { roomListRequestHandler } from "../message/handler/roomListRequestHandler";
2 import { HandlerMap } from "../message/MessageHandler"; 4 import { HandlerMap } from "../message/MessageHandler";
3 import { Room } from "../room/Room"; 5 import { Room } from "../room/Room";
4 -import { UserData } from "./types";
5 6
6 export class User { 7 export class User {
7 public readonly username: string; 8 public readonly username: string;
...@@ -15,7 +16,9 @@ export class User { ...@@ -15,7 +16,9 @@ export class User {
15 constructor(username: string, connection: Connection) { 16 constructor(username: string, connection: Connection) {
16 this.username = username; 17 this.username = username;
17 this.connection = connection; 18 this.connection = connection;
18 - this.handler = new HandlerMap<User>(this, {}); 19 + this.handler = new HandlerMap<User>(this, {
20 + roomList: roomListRequestHandler,
21 + });
19 } 22 }
20 23
21 public getData(): UserData { 24 public getData(): UserData {
......