feat: Action 호출 타입 설계

- 호출 시점에선 강타입으로.
This commit is contained in:
2024-03-09 17:45:14 +00:00
parent fb68d9be22
commit b449cf3a11
5 changed files with 120 additions and 18 deletions
+30 -11
View File
@@ -4,9 +4,11 @@ import { ResourceController } from "./ResourceController.js";
import { entriesWithType } from "@sammo/util/converter";
import db from "./connectDB.js";
import type { Mongoose } from "mongoose";
import type { GameEngineMsg } from "./GameEngineDefs.js";
import type { ActionPack, GameEngineMsg } from "./GameEngineDefs.js";
import { ActionRequestList, type QueueType } from "@sammo/game_logic";
export interface ActionRequest {
name: keyof ActionPack;
args: Parameters<ActionPack[keyof ActionPack]>[1];
}
export interface ActionRequestContainer {
@@ -16,7 +18,7 @@ export interface ActionRequestContainer {
export type ActionSuccess = {
success: true;
message?: string;
value: ReturnType<ActionPack[keyof ActionPack]>;
}
export type ActionFailure = {
@@ -25,8 +27,6 @@ export type ActionFailure = {
}
export type ActionResult = ActionSuccess | ActionFailure;
type QueueType = 'server' | 'api';
//type QueueType = 'server' | 'npc' | 'api';
export class GameEngine {
@@ -107,8 +107,7 @@ export class GameEngine {
while (!queue.isEmpty()) {
const action = must(queue.shift());
//TODO: action 처리
const errorReason: string | undefined = undefined;
const actionResult = this.processAction(invoker, action.action);
const [ticketResolve, ticketRejected] = must_err(
this.queueWaiters.get(action.waiterSeq),
@@ -116,14 +115,14 @@ export class GameEngine {
);
this.queueWaiters.delete(action.waiterSeq);
if (errorReason) {
if(actionResult.success){
responseQueue.push(() => {
ticketRejected(errorReason);
ticketResolve(actionResult);
});
}
else {
else{
responseQueue.push(() => {
ticketResolve({ success: true });
ticketRejected(actionResult);
});
}
@@ -236,6 +235,26 @@ export class GameEngine {
console.log('GameEngine stopped');
}
private processAction(invoker: QueueType, action: ActionRequest): ActionResult {
const actionName = action.name;
const actionArgs = action.args;
try{
const result = ActionRequestList[actionName](invoker, actionArgs as any, this.rsc);
return {
success: true,
value: result
};
}
catch(e){
const msg = e instanceof Error ? e.message : e;
return {
success: false,
reason: String(msg),
};
}
}
private async pushAction(queueName: QueueType, action: ActionRequest): Promise<ActionResult> {
const queue = this.actionQueue[queueName];