Files
rougelike-demo/client/assets/scripts/App/Msg/MessagePairBase.ts

76 lines
2.2 KiB
TypeScript
Raw Normal View History

/**
*
*
*/
export abstract class MessagePair<TReq, TRes> {
/** 请求消息名称 */
abstract readonly requestName: string;
/** 响应消息名称 */
abstract readonly responseName: string;
/** 请求消息类型检查 */
abstract isValidRequest(msg: any): msg is TReq;
/** 响应消息类型检查 */
abstract isValidResponse(msg: any): msg is TRes;
}
/**
*
*
*/
export class MessagePairRegistry {
private static _instance: MessagePairRegistry;
private _pairs: Map<string, MessagePair<any, any>> = new Map();
static getInstance(): MessagePairRegistry {
if (!this._instance) {
this._instance = new MessagePairRegistry();
}
return this._instance;
}
/**
*
* @param pair
*/
register(pair: MessagePair<any, any>): void {
this._pairs.set(pair.requestName, pair);
console.log(`[MessagePairRegistry] Registered message pair: ${pair.requestName} -> ${pair.responseName}`);
}
/**
*
* @param requestName
* @returns null
*/
getResponseName(requestName: string): string | null {
const pair = this._pairs.get(requestName);
return pair ? pair.responseName : null;
}
/**
*
* @param requestName
* @returns null
*/
getPair(requestName: string): MessagePair<any, any> | null {
return this._pairs.get(requestName) || null;
}
/**
*
* @param msgName
*/
isRegisteredRequest(msgName: string): boolean {
return this._pairs.has(msgName);
}
/**
*
*/
getAllPairs(): MessagePair<any, any>[] {
return Array.from(this._pairs.values());
}
}